use*_*399 12 c++ oop encapsulation decoupling
我FOO()在类A中有一个方法,它从类的数据成员中获取其参数输入B(假设它们是两个浮点数和一个int).我理解这一点的方式,通常更好地实现这一点,如:
A->FOO1(B, other_data_x)
Run Code Online (Sandbox Code Playgroud)
而不是
A->FOO2(B.member1, B.member2, B.member3, other_data_x).
Run Code Online (Sandbox Code Playgroud)
我收集了一个,但不是唯一的优点是它留下了B访问哪些成员的细节,FOO1()因此有助于隐藏实现细节.
但我想知道的是,这是否真正引入了类A和之间的额外耦合B.类A在前者的情况下必须知道类B存在(通过类似include class_B_header.h),如果成员B变化或移动到不同的类或类B被完全消除,你需要修改A和FOO1()相应.相比之下,在后一种方法中,FOO2()并不关心类是否B存在,实际上它关心的是它提供了两个浮点数(在这种情况下由B.member1和组成B.member2)和一个int(B.member3).可以肯定的是,在后一个示例中也存在耦合,但是这种耦合在任何地方都可以处理FOO2()被调用或任何类正在调用FOO2(),而不是在A或的定义B.
我想这个问题的第二部分是,是否有解耦的好办法A,并B进一步当我们要实现类似的解决方案FOO1()?
Joh*_*ing 18
但我想知道的是,这是否真正引入了A类和B类之间的额外耦合.
是的,它确实. A并且B现在紧密耦合.
你似乎认为人们普遍认为应该传递对象而不是那些对象的成员.我不确定你是怎么得到这种印象的,但事实并非如此.是否应该发送一个对象或该对象的成员完全取决于您正在尝试做什么.
在某些情况下,在两个实体之间存在紧密耦合的依赖关系是必要和可取的,而在其他情况下则不是.如果这里有一般的经验法则,我会说如果有任何与你建议的相反的话:
尽可能消除依赖关系,但不管其他地方.
Jer*_*fin 13
没有一个是普遍正确的,另一个是普遍错误的.这基本上是一个更好地反映你真实意图的问题(用metasyntactic变量无法猜测).
例如,如果我写了一个"read_person_data"函数,它应该将某种"person"对象作为它要读取的数据的目标.
另一方面,如果我有一个"读取两个字符串和一个int"函数,它应该可能需要两个字符串和一个int,即使(例如)我碰巧使用它来读取名字和姓氏,和员工编号(即至少是一部分人的数据).
但是有两个基本要点:第一,像前者一样有效和有逻辑的功能通常比后者更好,后者只不过是一起发生的任意动作集合.
其次,如果你遇到这样的情况,那么问题是否应该(至少在逻辑上)不应该是你的一部分A而不是作为一个单独运作的东西,这是值得怀疑的A.这无论如何都不确定,但你可能只是在看有问题的类之间的不良分割.
欢迎来到工程世界,在这里,一切都是妥协,正确的解决方案取决于您的类和功能应该如何使用(以及它们的意义应该是什么).
如果foo()是概念上的东西,其结果取决于float,一int和string,那么它是正确的就接受float,一int和string.这些值是否来自一个类的成员(可能是B,但也可能是C或D)并不重要,因为语义foo()上没有定义B.
在另一方面,如果foo()是概念上的东西,其结果取决于状态B-例如,因为它实现了该状态的抽象-然后使它接受类型的对象B.
现在,如果可能的话,一个好的编程习惯就是让函数接受少量的参数,我最多可以说三个没有夸大其词,所以如果一个函数在逻辑上适用于多个值,你可能想要对这些值进行分组在数据结构中并将该数据结构的实例传递给foo().
现在,如果您调用该数据结构B,我们将回到最初的问题 - 但具有语义差异的世界!
因此,不管是不是foo()应该接受三个值或实例B主要取决于什么foo()和B具体程序中的意思是,他们将如何使用-无论他们的权限和职责逻辑耦合与否.