在面向对象范式中,有人能准确地描述松耦合和紧耦合之间的区别吗?
当前回答
这里有很多使用类比的很好的答案,但是一个工作中的朋友给了我一个例子,比这里提到的所有例子都更让我喜欢……眼睛和眼镜!
紧密耦合
紧密耦合是眼睛。如果我想修复我的视力,做眼部移植手术非常昂贵,而且有相当大的风险。但如果设计师(作为人类)找到了更好的方法呢?添加一个与主体松散耦合的特性,这样就可以轻松地更改它!(是的. .眼镜)
松散耦合
我可以很容易地更换我的眼镜,而不会破坏我的潜在视力。我可以摘下眼镜,我的视力就会恢复到以前的水平(不是更好或更差)。使用不同的眼镜改变了我们通过眼睛看世界的方式,而且风险很小,易于维护。
总结
所以下次有人问你“谁在乎我的代码是否紧密耦合?”答案都是关于努力改变,努力维持和改变的风险。
那么这在c#中是如何实现的呢?接口和依赖注入!
EDIT
这也是Decorator模式的一个很好的例子,其中眼睛是我们通过满足界面需求来装饰的类,但提供了不同的功能(例如太阳镜、老花镜、珠宝商的放大镜等)。
其他回答
当两个对象松散耦合时,它们可以相互作用,但知之甚少 对方。
松散耦合设计允许我们构建能够处理变更的灵活的OO系统。
观察者设计模式是一个让类松散耦合的好例子,你可以在维基百科上看到它。
松耦合是在不提供依赖关系的所有信息的情况下,间接地给出类所需要的依赖关系的过程。E在from的接口中),以防紧耦合,你直接给出依赖关系,这不是编码的好方法。
一般来说,紧密耦合是不好的,但大多数时候,因为它降低了代码的灵活性和可重用性,它使更改更加困难,它阻碍了可测试性等。
Tightly Coupled Object is an object need to know quite a bit about each other and are usually highly dependent on each other interfaces. Changing one object in a tightly coupled application often requires changes to a number of other objects, In small application we can easily identify the changes and there is less chance to miss anything. But in large applications these inter-dependencies are not always known by every programmer or chance is there to miss changes. But each set of loosely coupled objects are not dependent on others.
简而言之,我们可以说,松耦合是一种设计目标,它寻求减少系统组件之间的相互依赖关系,目的是降低一个组件的更改将要求任何其他组件进行更改的风险。松散耦合是一个更通用的概念,旨在增加系统的灵活性,使其更可维护,并使整个框架更“稳定”。
耦合指的是一个元素对另一个元素的直接认识程度。我们可以说A和B,只有B在A改变其行为时才改变其行为。松散耦合的系统可以很容易地分解为可定义的元素。
如果一个对象的创建/存在依赖于另一个不能被剪裁的对象,它的紧密耦合。如果依赖关系可以被裁剪,那么它的松散耦合。考虑Java中的一个例子:
class Car {
private Engine engine = new Engine( "X_COMPANY" ); // this car is being created with "X_COMPANY" engine
// Other parts
public Car() {
// implemenation
}
}
Car类的客户端只能创建一个“X_COMPANY”引擎。
考虑打破这种耦合的能力来改变它:
class Car {
private Engine engine;
// Other members
public Car( Engine engine ) { // this car can be created with any Engine type
this.engine = engine;
}
}
现在,Car不依赖于“X_COMPANY”的引擎,因为它可以用类型创建。
Java特有的注意事项:仅仅为了解耦合而使用Java接口并不是一种合适的设计方法。在Java中,接口有一个目的——充当契约,从本质上提供解耦合行为/优势。
Bill Rosmus在公认答案中的评论有一个很好的解释。
这是关于类对其他类的依赖率,在松散耦合时很低,而在紧密耦合时很高。在面向服务的体系结构中,服务之间是松散耦合的,不同的类之间的依赖是有意的
推荐文章
- 如何在方法中访问“静态”类变量?
- 使arrayList.toArray()返回更具体的类型
- 如何从对象数组中通过对象属性找到条目?
- 为什么c#不提供c++风格的'friend'关键字?
- new Object()和对象文字表示法的区别是什么?
- String, StringBuffer和StringBuilder
- JavaScript对象如何引用自身的值?
- 在c#中创建一个对象的副本
- PHP检查对象或类中是否存在属性
- 存储库和服务层的区别?
- DDD -实体不能直接访问存储库的规则
- 为什么STL如此严重地基于模板而不是继承?
- 如何在Objective-C中声明类级属性?
- 面向方面编程与面向对象编程
- super()失败,错误:TypeError "参数1必须是类型,而不是classobj"当父不继承对象