与组合相关的松散耦合

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 它们都做同样的事情?

假设明天如果你想删除DatabaseClass并用新的class替换它FlatFile,你需要更改CustomerRepositoryclass 在第一个示例中,但不是第二个示例。在第二个示例中,将仅创建 CustomerRepository 实例的人应该担心将 Database class 替换为 FlatFile Class。这是loose copling改Databaseclass的意思,不应该强行改CustomerRepositoryclass。

回答你的最后一个问题

what is the relation between loose coupling and composition?

没有直接关系,你仍然可以使用组合并通过不实现依赖倒置原则来破坏class之间的耦合。所以你应该问的正确问题是 -

How to make a tightly coupled code to loosely coupled?

遵循依赖倒置原则。