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