【问题标题】:loose coupling related to composition与组合相关的松散耦合
【发布时间】:2015-05-13 06:29:54
【问题描述】:

在搜索了与紧密耦合相关的不同论坛后(当一组类高度依赖于彼此时) 示例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 是如何紧密耦合的,因为它基于组合?其次,松耦合和组合是什么关系?

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,我想知道松耦合和组合是什么关系?组合在完成对类的访问后如何支持松散耦合??
    • Composition 描述了将一个类的实例作为属性放在另一个类上。第二类是由它自己和另一个类“组成”的;即它可以使用其他类的功能而无需“成为”另一个类(就像extend 会做的那样)。 “松散耦合”通常描述不硬编码依赖项并允许它们被替换的想法。组合是实现这一目标的一种典型方式。
    【解决方案2】:

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

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

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

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

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

    第二个例子取决于接口,而不是像第一个例子那样的具体类。现在出现了困惑——为什么接口很特别,为什么一个类不做同样的事情呢?

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

    回答你的最后一个问题

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

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

    如何让紧耦合的代码变成松耦合的?

    遵循依赖倒置原则。

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 1970-01-01
      • 2017-06-05
      • 2020-10-26
      • 2018-11-19
      • 2010-10-22
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      相关资源
      最近更新 更多