Questions tagged «encapsulation»

6
方法链接与封装
方法链接与“单访问点”方法存在经典的OOP问题: main.getA().getB().getC().transmogrify(x, y) 与 main.getA().transmogrifyMyC(x, y) 第一个优点似乎是,每个类仅负责较小的一组操作,并使所有事情都变得更加模块化 -向C添加方法不需要A,B或C花费任何精力来公开它。 当然,不利的一面是较弱的封装,第二种代码可以解决此问题。现在,A可以控制通过它的每个方法,并且可以根据需要将其委派给它的字段。 我意识到没有单一的解决方案,它当然取决于上下文,但是我真的很想听听有关两种样式之间其他重要区别的意见,在什么情况下我应该选择其中任何一种-因为现在,当我尝试设计一些代码,我觉得我只是在不使用参数来决定一种方法。

5
我可以在不破坏封装的情况下使用依赖注入吗?
这是我的解决方案和项目: 书店 (解决方案) BookStore.Coupler (项目) Bootstrapper.cs BookStore.Domain (项目) CreateBookCommandValidator.cs CompositeValidator.cs IValidate.cs IValidator.cs ICommandHandler.cs BookStore.Infrastructure (项目) CreateBookCommandHandler.cs ValidationCommandHandlerDecorator.cs BookStore.Web (项目) Global.asax BookStore.BatchProcesses (项目) Program.cs Bootstrapper.cs: public static class Bootstrapper.cs { // I'm using SimpleInjector as my DI Container public static void Initialize(Container container) { container.RegisterManyForOpenGeneric(typeof(ICommandHandler<>), typeof(CreateBookCommandHandler).Assembly); container.RegisterDecorator(typeof(ICommandHandler<>), typeof(ValidationCommandHandlerDecorator<>)); container.RegisterManyForOpenGeneric(typeof(IValidate<>), AccessibilityOption.PublicTypesOnly, (serviceType, …

7
使类方法传递类变量是一个坏主意吗?
这就是我的意思: class MyClass { int arr1[100]; int arr2[100]; int len = 100; void add(int* x1, int* x2, int size) { for (int i = 0; i < size; i++) { x1[i] += x2[i]; } } }; int main() { MyClass myInstance; // Fill the arrays... myInstance.add(myInstance.arr1, myInstance.arr2, myInstance.len); } add因为它是一个类方法,已经可以访问它需要的所有变量了,所以这不是一个好主意吗?有什么理由我应该或不应该这样做?

1
使用朋友类封装C ++中的私有成员函数-好的做法还是滥用?
因此,我注意到可以通过执行以下操作来避免将私有函数放在标头中: // In file pred_list.h: class PredicateList { int somePrivateField; friend class PredicateList_HelperFunctions; public: bool match(); } // In file pred_list.cpp: class PredicateList_HelperFunctions { static bool fullMatch(PredicateList& p) { return p.somePrivateField == 5; // or whatever } } bool PredicateList::match() { return PredicateList_HelperFunctions::fullMatch(*this); } 私有函数永远不会在标头中声明,并且导入标头的类的使用者永远不需要知道它的存在。如果helper函数是模板,则这是必需的(替代方法是将完整的代码放在标头中),这就是我“发现”它的方式。如果添加/删除/修改私有成员函数,则不需要重新编译包含头文件的每个文件的另一个好处。所有专用功能都位于.cpp文件中。 所以... 这是一个众所周知的设计模式吗? 对我来说(来自Java / C#背景并且自己学习C …


5
是否应该始终完全封装内部数据结构?
请考虑此类: class ClassA{ private Thing[] things; // stores data // stuff omitted public Thing[] getThings(){ return things; } } 此类将用于存储数据的数组公开给任何感兴趣的客户端代码。 我是在正在开发的应用中完成此操作的。我有一个ChordProgression存储序列Chords的类(并执行其他一些操作)。它有一个Chord[] getChords()返回和弦数组的方法。当必须更改数据结构(从数组更改为ArrayList)时,所有客户端代码都将中断。 这让我思考-也许以下方法更好: class ClassA{ private Thing[] things; // stores data // stuff omitted public Thing[] getThing(int index){ return things[index]; } public int getDataSize(){ return things.length; } public void setThing(int …

4
我会遭受封装使用过度的困扰吗?
我在各种项目的代码中注意到了一些东西,这些东西似乎让我感到代码难闻,有些事情要做,但我无法解决。 在尝试编写“干净的代码”时,我倾向于过度使用私有方法,以使我的代码更易于阅读。问题在于代码确实更干净,但是测试起来也更加困难(是的,我知道我可以测试私有方法...),总的来说,这对我来说是个坏习惯。 这是一个类示例,该类从.csv文件中读取一些数据并返回一组客户(另一个具有各种字段和属性的对象)。 public class GroupOfCustomersImporter { //... Call fields .... public GroupOfCustomersImporter(String filePath) { this.filePath = filePath; customers = new HashSet<Customer>(); createCSVReader(); read(); constructTTRP_Instance(); } private void createCSVReader() { //.... } private void read() { //.... Reades the file and initializes the class attributes } private void readFirstLine(String[] inputLine) …

4
嵌套类:有用的工具还是违反封装的?
因此,对于是否应使用这些功能,我仍然持保留态度。 我感到它极度违反了封装,但是我发现我可以在某种程度上实现封装,同时在代码中获得更大的灵活性。 以前的Java / Swing项目在某种程度上使用了嵌套类,但是现在我进入了C#中的其他项目,因此避免使用它们。 您如何看待嵌套类?

4
重命名方法可以保留封装吗?
我正在阅读此页面,了解何时需要使用getter / setter,并且OP提供了以下代码示例: class Fridge { int cheese; void set_cheese(int _cheese) { cheese = _cheese; } int get_cheese() { return cheese; } } void go_shopping(Fridge fridge) { fridge.set_cheese(fridge.get_cheese() + 5); } 该接受的答案状态: 顺便说一句,在你的榜样,我会给类Fridge的 putCheese()和takeCheese()方法,而不是get_cheese() 和set_cheese()。这样您将仍然具有封装。 如何封装从对get / set重命名它来保存putCheese()/ takeCheese()你显然获取/设置一个值,那么为什么不干脆把它作为对get / set? 在相同的答案中,它还指出: 拥有getter和setter方法本身并不会破坏封装。破坏封装的方法是自动为每个数据成员(Java术语中的每个字段)添加一个getter和setter,而无需考虑任何问题。 在这种情况下,我们只有一个变量,cheese并且您可能想将奶酪拿回冰箱,所以在这种情况下,一对get / set是合理的。

5
如何使从外部访问函数显而易见?
这是一个特定于C的问题。我试图将所有可能的内容都保留在翻译单元的边界之内,仅通过.h文件公开一些功能。也就是说,我正在static链接到文件级对象。 现在,其他模块需要调用几个函数,而不是直接调用。我的模块/文件/翻译单元订阅其他模块,将指针传递给函数。然后,在发生特定事件时,将使用一些参数来调用指针。 因此,我想知道如何使这些功能从某个晦涩难懂的位置调用变得非常明显。 它们应该是static还是extern(并将它们显示在中.h)? 我应该在函数名称中包含一些提示吗? 还是发表一个“由X调用”的评论就足够了?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.