Слабая связь, связанная с составом

После поиска на разных форумах, связанных с тесной связью (когда группа классов сильно зависит друг от друга) Пример 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, тогда я искал слабую связь, поэтому изменил вышеупомянутый класс, чтобы удалить зависимость тесной связи. Example2

   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 ответа

Решение

То, что у вас там, не очень тесная связь. Плотная связь была бы такой:

class CustomerRepository {
    private readonly Database database;

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

У класса есть жесткая зависимость от определенного Database класс, который нельзя заменить. Это действительно тесная связь.

Пример компоновки, который вы показываете, уже слабо связан, поскольку вполне возможно заменить зависимость, вводимую в конструктор, любым другим Database наследующий класс.

Ваш второй пример еще более слабо связан, так как он использует интерфейс вместо конкретного класса; но это мелочи

deceze 's объясняет большинство ваших вопросов. Я просто добавляю свои 2 цента к его ответу.

Оба примера слабо связаны, но в разной степени.

Пример -1 Вам разрешено вводить объект конкретного типа через его конструктор.

Пример -2 Вам разрешено вводить объект абстрактного типа через его конструктор.

Что делает пример 2 более слабосвязанным, так это принцип инверсии зависимостей. Его главная идея - нужно "полагаться на абстракции. Не зависит от конкрементов ".

Второй пример зависит от интерфейса, а не от класса Concrete, как первый. Теперь прибывает путаница - почему интерфейс особенный, почему не класс, оба они делают то же самое?

Предположим, завтра, если вы хотите удалить Database Класс и заменить его новым классом FlatFile нужно поменять CustomerRepository класс в первом примере, но не во втором. Во втором примере человек, который будет создавать экземпляр CustomerRepository только стоит побеспокоиться о замене Database класс с FlatFile Учебный класс. В этом смысл смены коплинга Database класс не должен заставлять вас меняться CustomerRepository учебный класс.

Чтобы ответить на ваш последний вопрос

Какова связь между слабой связью и составом?

Прямой зависимости нет, вы все равно можете использовать композицию и испортить связь между классами, не реализовав принцип инверсии зависимости. Поэтому правильный вопрос, который вы должны задать, -

Как сделать тесно связанный код со слабосвязанным?

Следуйте принципу инверсии зависимостей.

Другие вопросы по тегам