内聚(Cohesion)
内聚是指一个模块或类内部各个元素(方法、属性等)彼此之间关联程度的度量。高内聚意味着一个模块内的各个元素彼此相关,一起完成一个明确定义的任务。低内聚则表示模块内的元素关联较弱,可能包含了不相关的功能。
内聚的类型
-
功能内聚:模块内的元素协同工作,完成一个明确的任务。例如,一个处理用户登录的模块应该包括验证用户、创建会话等相关功能。
-
顺序内聚:模块内的元素按照一定的顺序执行,一个元素的输出是下一个元素的输入。例如,数据处理管道。
-
通信内聚:模块内的元素共享数据,但它们没有直接关联。这种内聚类型应该避免,因为它会导致代码难以理解和维护。
-
时间内聚:模块内的元素在同一时间段内执行。例如,一个处理订单的模块可能包括订单创建、支付处理等操作。
为什么高内聚重要?
高内聚有助于代码的可维护性和可重用性。当一个模块的功能明确且相关时,更容易理解和修改该模块。此外,高内聚使得模块更容易被其他模块重用,从而提高了代码的效率和质量。
耦合(Coupling)
耦合是指模块或类之间的依赖程度。低耦合表示模块之间的独立性高,一个模块的改变不会对其他模块产生太大影响。高耦合则表示模块之间的依赖程度高,一个模块的改变可能导致其他模块的修改。
耦合的类型
-
松散耦合:模块之间的依赖性较低,它们可以独立开发和修改。通常通过接口、抽象类或依赖注入实现。
-
紧密耦合:模块之间的依赖性高,它们直接引用彼此的具体实现。这种情况下,一个模块的修改可能会导致整个系统的变动。
为什么低耦合重要?
低耦合有助于代码的可维护性和可扩展性。当模块之间的依赖性降低时,我们可以更容易地修改一个模块,而不会影响到其他部分。这也使得系统更容易扩展,因为我们可以替换或添加新的模块而不必担心影响其他部分的稳定性。
如何提高内聚和降低耦合?
-
单一职责原则(SRP):确保每个类或模块只有一个明确的责任,这有助于提高内聚。一个模块只做一件事情,内聚性就高。
-
接口和抽象类:使用接口和抽象类来定义模块的契约,从而降低耦合。其他模块只依赖于契约而不是具体实现。
-
依赖注入:通过依赖注入将模块的依赖项传递给它,而不是在模块内部创建依赖项。
-
模块化设计:将代码拆分成小模块,每个模块负责一个明确的功能。