关于oop:松散耦合与组成有关

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;
    }
}

该类对无法替换的特定Database类具有硬编码依赖关系。这真的是紧密耦合。

您所展示的组合示例已经是松散耦合的,因为完全可以用任何其他Database继承类替换注入到构造函数中的依赖项。

第二个例子耦合更松散,因为它使用接口而不是具体的类;但这只是一个小细节。


@死亡解释了你的大部分问题。我只是在他的回答中加上我的2分。

这两个例子都是松散耦合的,但程度不同。

示例-1允许您通过其构造函数注入具体类型的对象。

示例-2允许您通过其构造函数注入抽象类型的对象。

使示例2更加松散耦合的是由于依赖倒置原理。它的主要思想是——一个人应该"依赖于抽象"。不要依赖于具体情况。"

第二个例子依赖于接口,而不是像第一个例子那样依赖于具体的类。现在出现了一个困惑——为什么接口是特殊的?为什么两个类不能做相同的事情?

假设明天您要删除Database类并用新的FlatFile类替换它,您需要在第一个示例中更改CustomerRepository类,而不是在第二个示例中更改。在第二个例子中,创建CustomerRepository实例的人只需担心将Database类替换为FlatFile类。这就是松散的copling改变Database类的意思,不应该强迫你改变CustomerRepository类。

回答你最后一个问题

what is the relation between loose coupling and composition?

没有直接的关系,你仍然可以不实现依赖倒置原理,使用组合来扰乱类之间的耦合。所以你应该问的是-

How to make a tightly coupled code to loosely coupled?

遵循依赖倒置原则。