loose coupling related to composition
在搜索与紧耦合相关的不同论坛之后(当一组类彼此高度依赖时)实例1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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) { } } |
上面的类customerrepository依赖于数据库类,所以它们是紧密耦合的。我认为这个类也是合成的一个例子,然后我搜索松散耦合,从而更改上面的类,从而消除紧密耦合依赖。例2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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) { } } |
我已经搜索过支持松耦合的组合,现在我的问题是,example1是如何紧密耦合的,因为它是基于组合的?第二,松耦合与组成的关系是什么?
任何帮助都将不胜感激。
你所拥有的并不是真正的紧密耦合。紧密耦合是这样的:
1 2 3 4 5 6 7 | class CustomerRepository { private readonly Database database; public CustomerRepository() { this.database = new Database; } } |
该类对无法替换的特定
您所展示的组合示例已经是松散耦合的,因为完全可以用任何其他
第二个例子耦合更松散,因为它使用接口而不是具体的类;但这只是一个小细节。
@死亡解释了你的大部分问题。我只是在他的回答中加上我的2分。
这两个例子都是松散耦合的,但程度不同。
示例-1允许您通过其构造函数注入具体类型的对象。
示例-2允许您通过其构造函数注入抽象类型的对象。
使示例2更加松散耦合的是由于依赖倒置原理。它的主要思想是——一个人应该"依赖于抽象"。不要依赖于具体情况。"
第二个例子依赖于接口,而不是像第一个例子那样依赖于具体的类。现在出现了一个困惑——为什么接口是特殊的?为什么两个类不能做相同的事情?
假设明天您要删除
回答你最后一个问题
what is the relation between loose coupling and composition?
没有直接的关系,你仍然可以不实现依赖倒置原理,使用组合来扰乱类之间的耦合。所以你应该问的是-
How to make a tightly coupled code to loosely coupled?
遵循依赖倒置原则。