面向对象范式中的松耦合和紧耦合有什么区别?

任何人都可以描述面向对象范式中松耦合和紧耦合的精确区别吗?

紧密的耦合是当一组类彼此高度依赖时。

当一个class级承担了太多的责任,或者当一个问题分散在许多class级而不是有自己的class级时,这种情况就会出现。

松耦合是通过促进单一责任和关注点分离的devise实现的。

松散耦合的类可以独立于其他(具体)类来使用和testing。

接口是用于解耦的强大工具。 类可以通过接口而不是其他具体类进行通信,任何类都可以简单地通过实现接口而处于通信的另一端。

紧密耦合的例子:

class CustomerRepository { private readonly Database database; public CustomerRepository(Database database) { this.database = database; } public void Add(string CustomerName) { database.AddRow("Customer", CustomerName); } } class Database { public void AddRow(string Table, string Value) { } } 

松耦合示例:

 class CustomerRepository { private readonly IDatabase database; public CustomerRepository(IDatabase database) { this.database = database; } public void Add(string CustomerName) { database.AddRow("Customer", CustomerName); } } interface IDatabase { void AddRow(string Table, string Value); } class Database : IDatabase { public void AddRow(string Table, string Value) { } } 

另一个例子。

无代码概念的解释(+ Real Life类比)

(代码请参考上面的答案。)

摘要示例:

帽子是“松散耦合”的身体。 这意味着你可以轻松地摘下帽子而不需要对人物/身体做任何改变。 当你能做到这一点时,你就有了“松耦合”,详见下文。

帽子是“松散耦合”的身体。这意味着你可以很容易地取下帽子,而不需要对人物/身体做任何改变。图片署名:https://pixabay.com/en/greeting-cylinder-chapeau-dignity-317250/

紧耦合(详细示例)

想想你的皮肤。 它坚持你的身体。 它适合像一个手套。 但是,如果你想改变你的肤色从白色变成黑色呢? 你能想象一下,将皮肤剥落,染色,然后将其粘贴在皮肤上会有多痛苦? 改变你的皮肤很困难,因为它与你的身体紧密相连。 你不能轻易做出改变。 你将不得不从根本上重新devise一个人,以使之成为可能。

  • 要点1 :换句话说, 如果你想改变皮肤,你也必须改变你的身体的devise,因为两者结合在一起 – 它们紧密结合在一起。

上帝不是一个好的面向对象的程序员。

松耦合(详细示例)

现在想想早上穿衣服。 你不喜欢蓝色? 没问题:你可以换一件红色的衬衫。 你可以轻松而轻松地做到这一点,因为衬衫没有像你的皮肤一样真正地连接到你的身体。 衬衫不知道或不在乎它正在发生什么样的身体 。 换句话说,你可以改变你的衣服,而不会真的改变你的身体。

  • 这是关键点#2。 如果你换了衬衫,那么你不会被迫改变自己的身体 – 当你这样做的时候,你就会松散的联结在一起。 当你不能这样做,那么你有紧密的联系。

简而言之,这是基本的概念。

为什么这一切都很重要?

这一点很重要,因为软件一直在变化。 一般来说,您希望能够轻松修改您的代码,而无需花费10个小时的时间进行debugging。 如果有人希望他们的车黑色,你不应该重新devise整个车,以实现这一变化。 或者,如果有人希望他们的输出在一个CSV文件,而不是JSON等你应该能够在你的代码非常容易做出这种改变 – 你可以这样做,如果它松散耦合。

简而言之,松耦合使代码更易于更改。

图片归因 。

在面向对象的devise中,耦合量指的是一个类的devise依赖于另一个类的devise。 换句话说,Aclass的变化多久会在Bclass中发生变化? 紧耦合意味着两类经常一起变化,松耦合意味着它们大多是独立的。 一般来说,build议使用松耦合,因为它更容易testing和维护。

您可能会发现Martin Fowler的这篇论文(PDF)很有帮助。

程式明智的紧密耦合与松耦合的区别?

Java对象之间的紧耦合

 class Traveler { Car c=new Car(); void startJourney() { c.move(); } } class Car { void move() { // logic... } } 

Java对象之间的松散耦合

 class Traveler { Vehicle v; public void setV(Vehicle v) { this.v = v; } void startJourney() { v.move(); } } 

// =========================接口====================== ==============

  Interface Vehicle { void move(); } 

// ====================多类工具车辆界面。 头等====

 class Car implements Vehicle { public void move() { // logic } } 

// ===================第二课================

 class Bike implements Vehicle { public void move() { // logic } } 

一般而言,紧耦合在大多数情况下是不好的,因为它降低了代码的灵活性和可重用性,使得变更更加困难,阻碍了可testing性等。

紧耦合对象是一个对象,需要相互了解一些,通常高度依赖于其他接口。 在紧密耦合的应用程序中更改一个对象通常需要更改其他许多对象。在小应用程序中,我们可以轻松识别这些更改,并且错过任何事情的机会也会减less。 但是在大型应用程序中,这些相互依赖并不总是被每个程序员所知,或者是在那里错过更改。 但是每一组松耦合的对象都不依赖于其他对象。

总之,我们可以说,松散耦合是一个devise目标,旨在减less系统组件之间的相互依赖关系,其目的是减less一个组件的变化需要改变其他组件的风险。 松耦合是一个更加通用的概念,旨在增加系统的灵活性,使其更易于维护,并使整个框架更“稳定”。

耦合是指一个元素对另一个元素具有的直接知识的程度。 我们可以说一个例如:A和B,只有当B改变它的行为时,B才改变它的行为。 松散耦合的系统可以很容易地分解成可定义的元素。

当两个对象松散耦合时,他们可以相互作用,但对彼此知之甚less。

松散耦合的devise使我们能够构build灵活的面向对象系统来处理变化。

观察者devise模式是使类松散耦合的一个很好的例子,你可以在维基百科上看看它。

我的理解是,与松散耦合的体系结构相比,紧耦合体系结构不能提供很大的变化灵活性。

但是在松散耦合的体系结构中,消息格式或操作平台或者修改业务逻辑不会影响另一端。 如果系统被拆除进行改造,当然另一端将不能访问该服务一段时间,但除此之外,未改变的结束可恢复与改造之前的消息交换。

有一些工具通过它们的库提供dependency injection,例如在.net中我们有ninject库 。

如果你正在进一步在Java然后春提供这种能力。

松耦合的对象可以通过在你的代码中引入接口来实现,这就是这些源代码所做的事情。

说你正在写你的代码

 Myclass m = new Myclass(); 

现在这个语句在你的方法中说你依赖于myclass这叫做紧密耦合。 现在你提供了一些构造函数注入,或者属性注入和实例化对象,然后它将变得松散耦合。

松耦合意味着两个组件之间的依赖程度非常低Ex.GSM SIM紧耦合意味着两个组件之间的依赖程度非常高。 恩。 CDMA移动

松散的耦合是对旧式硬编码依赖和相关问题的回应,如任何更改和代码重用时的频繁重新编译。 它强调在组件中实现工作逻辑并避免解决scheme特定的代码。

松耦合= IoC为便于说明,请参阅此处。

从我的博客文章提取耦合:

什么是紧耦合 : –

如上所述,紧密耦合对象是需要了解其他对象的对象,通常高度依赖于对方的接口。

当我们在一个紧密耦合的应用程序中更改一个对象时,通常需要对其他对象进行更改。 在一个小应用程序中,我们可以很容易地识别出这个变化。 但是在大型应用程序中,这些相互依赖关系并不总是为每个消费者或其他开发者所知,或者将来有很多变化的机会。

让我们拿一个购物车演示代码来了解紧密耦合:

 namespace DNSLooseCoupling { public class ShoppingCart { public float Price; public int Quantity; public float GetRowItemTotal() { return Price * Quantity; } } public class ShoppingCartContents { public ShoppingCart[] items; public float GetCartItemsTotal() { float cartTotal = 0; foreach (ShoppingCart item in items) { cartTotal += item.GetRowItemTotal(); } return cartTotal; } } public class Order { private ShoppingCartContents cart; private float salesTax; public Order(ShoppingCartContents cart, float salesTax) { this.cart = cart; this.salesTax = salesTax; } public float OrderTotal() { return cart.GetCartItemsTotal() * (2.0f + salesTax); } } } 

上面的例子的问题

紧耦合创造了一些困难。

在这里, OrderTotal()方法为我们提供了当前购物车的完整金额。 如果我们想在这个购物车系统中添加折扣function。 在上面的代码中很难做到,因为我们必须在每个类上进行修改,因为它们紧密结合在一起。

总之,松耦合是指直接减less使用不同类的类的依赖关系。 紧耦合意味着类和对象相互依赖。 一般来说,紧耦合通常是不好的,因为它降低了代码的灵活性和可重用性,并且使得变化更加困难并且不容易testing。

Java中松耦合与紧耦合的参考差异及其实例。

松耦合是一种在不提供所有依赖关系的信息的情况下(即在接口的起始地址)间接给予您的类所需的依赖关系的过程。