与组合相关的松散耦合
loose coupling related to composition
搜索与紧耦合相关的不同论坛后(当一组 class 高度依赖彼此时)
示例 1
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 依赖于数据库 class 所以它们是紧密耦合的。我认为这个 class 也是 Compostion 的一个例子,然后我搜索松耦合所以更改上面的 class 以便删除紧耦合依赖性。
示例 2
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 是如何紧密耦合的,因为它是基于组合的?其次松散耦合和组合是什么关系?
任何帮助将不胜感激。
你所拥有的并不是真正的紧密耦合。紧耦合是这样的:
class CustomerRepository {
private readonly Database database;
public CustomerRepository() {
this.database = new Database;
}
}
class 对特定 Database
class 具有硬编码依赖性,无法替代。这真是紧密耦合。
您展示的组合示例已经是松散耦合的,因为完全有可能用继承 class.
的任何其他 Database
替换注入构造函数的依赖项
你的第二个例子甚至更松散耦合,因为它使用接口而不是具体 class;但这是一个小细节。
@deceze 解释了您的大部分问题。我只是在他的回答中加上我的 2 美分。
两个例子都是松散耦合的,但程度不同。
示例-1 您可以通过其构造函数注入具体类型的对象。
示例-2 您可以通过其构造函数注入抽象类型的对象。
使示例 2 更加松散耦合的原因是 Dependency Inversion Principle。它的主要思想是——一个人应该“依赖于抽象。不要依赖具体的事物。”
第二个示例依赖于接口,而不是像第一个示例那样依赖于具体 class。现在出现了困惑——为什么接口是特殊的,为什么不是 class 它们都做同样的事情?
假设明天如果你想删除Database
Class并用新的class替换它FlatFile
,你需要更改CustomerRepository
class 在第一个示例中,但不是第二个示例。在第二个示例中,将仅创建 CustomerRepository
实例的人应该担心将 Database
class 替换为 FlatFile
Class。这是loose copling改Database
class的意思,不应该强行改CustomerRepository
class。
回答你的最后一个问题
what is the relation between loose coupling and composition?
没有直接关系,你仍然可以使用组合并通过不实现依赖倒置原则来破坏class之间的耦合。所以你应该问的正确问题是 -
How to make a tightly coupled code to loosely coupled?
遵循依赖倒置原则。
搜索与紧耦合相关的不同论坛后(当一组 class 高度依赖彼此时) 示例 1
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 依赖于数据库 class 所以它们是紧密耦合的。我认为这个 class 也是 Compostion 的一个例子,然后我搜索松耦合所以更改上面的 class 以便删除紧耦合依赖性。 示例 2
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 是如何紧密耦合的,因为它是基于组合的?其次松散耦合和组合是什么关系?
任何帮助将不胜感激。
你所拥有的并不是真正的紧密耦合。紧耦合是这样的:
class CustomerRepository {
private readonly Database database;
public CustomerRepository() {
this.database = new Database;
}
}
class 对特定 Database
class 具有硬编码依赖性,无法替代。这真是紧密耦合。
您展示的组合示例已经是松散耦合的,因为完全有可能用继承 class.
的任何其他Database
替换注入构造函数的依赖项
你的第二个例子甚至更松散耦合,因为它使用接口而不是具体 class;但这是一个小细节。
@deceze 解释了您的大部分问题。我只是在他的回答中加上我的 2 美分。
两个例子都是松散耦合的,但程度不同。
示例-1 您可以通过其构造函数注入具体类型的对象。
示例-2 您可以通过其构造函数注入抽象类型的对象。
使示例 2 更加松散耦合的原因是 Dependency Inversion Principle。它的主要思想是——一个人应该“依赖于抽象。不要依赖具体的事物。”
第二个示例依赖于接口,而不是像第一个示例那样依赖于具体 class。现在出现了困惑——为什么接口是特殊的,为什么不是 class 它们都做同样的事情?
假设明天如果你想删除Database
Class并用新的class替换它FlatFile
,你需要更改CustomerRepository
class 在第一个示例中,但不是第二个示例。在第二个示例中,将仅创建 CustomerRepository
实例的人应该担心将 Database
class 替换为 FlatFile
Class。这是loose copling改Database
class的意思,不应该强行改CustomerRepository
class。
回答你的最后一个问题
what is the relation between loose coupling and composition?
没有直接关系,你仍然可以使用组合并通过不实现依赖倒置原则来破坏class之间的耦合。所以你应该问的正确问题是 -
How to make a tightly coupled code to loosely coupled?
遵循依赖倒置原则。