松散耦合与成分有关

时间:2015-05-13 06:29:55

标签: oop composition loose-coupling tightly-coupled-code

搜索与紧耦合相关的不同论坛(当一组类高度依赖于彼此时) 例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)
            {
            }
        }

上面的类CustomerRepository依赖于Database类,因此它们是紧密耦合的。我认为这个类也是Compostion的一个例子,然后我搜索松耦合,所以改变上面的类,以便消除紧耦合依赖。 例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是如何紧密耦合的,因为它基于组合?其次松散耦合和组合之间的关系是什么?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

你所拥有的并不是真正紧密耦合。紧耦合就是这样:

class CustomerRepository {
    private readonly Database database;

    public CustomerRepository() {
        this.database = new Database;
    }
}

该类具有对特定Database类的硬编码依赖,无法替换。这真的很紧密。

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

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

答案 1 :(得分:2)

@deceze解释了您的大部分问题。我只是将他的2美分加到他的答案中。

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

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

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

由于Dependency Inversion Principle导致示例2更加松散耦合的原因。它的主要思想是 - 应该“依赖于抽象。不要依赖于结核。“

第二个例子取决于接口而不是像第一个那样取决于Concrete类。现在出现了混乱 - 为什么不是一个类它们都做同样的事情?

让我们假设明天如果要删除Database类并将其替换为新类FlatFile,则需要在第一个示例中更改CustomerRepository类,而不是在第二个示例中更改CustomerRepository类。在第二个示例中,仅创建Database实例的人应该担心将FlatFile类替换为Database类。这是松散复制更改CustomerRepository类的含义,不应强迫您更改CREATE TABLE t ( id SERIAL PRIMARY KEY, c1 text, c2 text, c3 text ) ; CREATE EXTENSION file_fdw; CREATE SERVER my_csv_server FOREIGN DATA WRAPPER file_fdw; CREATE TABLE csv ( id integer, c1 text, c2 text, c3 text ) SERVER my_csv_server OPTIONS ( filename '/home/me/data.csv', format 'csv' ); SELECT id, CASE WHEN t.c1 = csv.c1 AND t.c2 = csv.c2 AND t.c3 = csv.c3 THEN 'Max' WHEN t.c1 = csv.c1 AND t.c2 = csv.c2 THEN 'High' WHEN t.c1 = csv.c1 THEN 'Mid' ELSE 'Low' -- only id match END as report FROM t JOIN csv USING (id) 类。

回答你的上一个问题

  

松散耦合和组合之间的关系是什么?

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

  

如何使紧密耦合的代码松散耦合?

遵循依赖性倒置原则。