在面向对象范式中,有人能准确地描述松耦合和紧耦合之间的区别吗?
当前回答
紧密耦合是指一组类彼此高度依赖。
当一个类承担了太多的责任,或者当一个关注点分散到许多类而不是拥有自己的类时,就会出现这种情况。
松耦合是通过促进单一责任和关注点分离的设计实现的。
松耦合类可以独立于其他(具体的)类使用和测试。
接口是用于解耦的强大工具。类可以通过接口而不是其他具体类进行通信,并且任何类都可以通过实现接口而处于通信的另一端。
紧密耦合的例子:
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 implements IDatabase
{
public void AddRow(string Table, string Value)
{
}
}
另一个例子。
其他回答
这里有很多使用类比的很好的答案,但是一个工作中的朋友给了我一个例子,比这里提到的所有例子都更让我喜欢……眼睛和眼镜!
紧密耦合
紧密耦合是眼睛。如果我想修复我的视力,做眼部移植手术非常昂贵,而且有相当大的风险。但如果设计师(作为人类)找到了更好的方法呢?添加一个与主体松散耦合的特性,这样就可以轻松地更改它!(是的. .眼镜)
松散耦合
我可以很容易地更换我的眼镜,而不会破坏我的潜在视力。我可以摘下眼镜,我的视力就会恢复到以前的水平(不是更好或更差)。使用不同的眼镜改变了我们通过眼睛看世界的方式,而且风险很小,易于维护。
总结
所以下次有人问你“谁在乎我的代码是否紧密耦合?”答案都是关于努力改变,努力维持和改变的风险。
那么这在c#中是如何实现的呢?接口和依赖注入!
EDIT
这也是Decorator模式的一个很好的例子,其中眼睛是我们通过满足界面需求来装饰的类,但提供了不同的功能(例如太阳镜、老花镜、珠宝商的放大镜等)。
松耦合是在不提供依赖关系的所有信息的情况下,间接地给出类所需要的依赖关系的过程。E在from的接口中),以防紧耦合,你直接给出依赖关系,这不是编码的好方法。
这是关于类对其他类的依赖率,在松散耦合时很低,而在紧密耦合时很高。在面向服务的体系结构中,服务之间是松散耦合的,不同的类之间的依赖是有意的
当两个对象松散耦合时,它们可以相互作用,但知之甚少 对方。
松散耦合设计允许我们构建能够处理变更的灵活的OO系统。
观察者设计模式是一个让类松散耦合的好例子,你可以在维基百科上看到它。
摘自我关于耦合的博客文章:
什么是紧密耦合:-
正如上面定义的那样,紧密耦合对象是一个需要了解其他对象的对象,并且通常高度依赖于彼此的接口。
当我们更改紧耦合应用程序中的一个对象时,通常需要更改许多其他对象。在一个小的应用程序中没有问题,我们可以很容易地识别变化。但在大型应用程序中,这些相互依赖关系并不总是为每个消费者或其他开发人员所了解,或者将来可能会有很多变化。
让我们用购物车演示代码来理解紧耦合:
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()方法为我们提供了购物车当前项目的完整金额。如果我们想在这个购物车系统中添加折扣功能。在上面的代码中很难做到这一点,因为我们必须在每个类中进行更改,因为它是非常紧密耦合的。
推荐文章
- 合并两个PHP对象的最佳方法是什么?
- 字符串到JS中的对象
- 使用Jackson将Java对象转换为JSON
- 为什么带有对象的typeof数组返回“对象”而不是“数组”?
- 继承和组合的区别
- 打印Python类的所有属性
- 面向对象编程,函数式编程,过程式编程
- 面向对象的Javascript最佳实践?
- 为什么我更喜欢使用成员初始化列表?
- 检查对象值是否存在于Javascript对象数组中,如果不存在,则添加一个新对象到数组中
- 如何将对象转换为int型
- 如何以编程方式设置属性?
- 如何让PHP类构造函数调用父类的父类构造函数?
- 理解__getattr__和__getattribute__之间的区别
- 如何访问(获取或设置)对象属性给定字符串对应的属性的名字