到目前为止,据我所知,我认为耦合与两个或多个类“互连”的程度有关。换句话说,类在何种程度上使用其他类的方法或变量。我们在精心设计的软件系统中的目标当然是保持耦合低(松散)。
我正在读一本书,其中明确指出松散耦合的目的是通过设计系统来实现的,因此每个类只使用其他类的API(公共方法)而不是直接使用它们的实例变量。因此,实例变量必须是私有的。如果这就是重点,松耦合和强封装有什么区别?就我而言,后者指的是封装。关于OO软件开发的上述概念,究竟是什么呢?
答案 0 :(得分:4)
松散耦合不仅仅是使用公共API,它还能够理解仅该API,而不依赖于特定的实现。它还包括限制依赖代码中实现差异所需的更改量。
封装并不仅仅是禁止直接访问财产。它还包括确保内部数据不会以可能导致无意识行为的方式暴露(例如,返回内部结构的防御性副本),并确保行为,而不仅仅是数据,是正确的孤立的,责任在适当的地方实施。
答案 1 :(得分:2)
通过明智地应用强封装可以很好地实现松耦合。弱封装可能提供松耦合,但也可能引入漏洞,允许在抽象范围之外可见的方法和变量(无意中的紧耦合)。然而,强封装并不意味着任何关于耦合的东西,因为这种性质的一类可以被设计成松散地,紧密地或根本不与外部实体耦合。
答案 2 :(得分:1)
您可以通过强封装实现松散耦合,但封装本身尚不能保证良好的代码和松耦合。尽管有封装,你仍然可以编写紧密耦合的代码。
可以在没有正式封装(访问者/设置者和受限制的可见性)的情况下实现松散耦合(在引入对象/模块之间没有不必要的依赖性的规则)。
但是......如果您为自己或一小组熟练的共同开发人员编写代码,那么直接引用类成员(从而打破封装)可能有助于保持代码更小,更易于阅读和理解。 C#部分使用properties完成它 - 它们看起来像普通的类成员,但实际上是访问者和设置者。
对于更大的团队或可重复使用的代码,我会说强大的封装是必须的。但是,您应该始终牢记灵活性 - 如果您过多地限制API,它将变得无法使用。如果您的代码还不够成熟,无法处理具有“官方”API的所有用例,那么这一点尤为重要。