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

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

Я искал, что композиция поддерживает слабую связь, и теперь мой вопрос заключается в том, как сильно связан пример 1, так как он основан на композиции? во-вторых, какова связь между слабой связью и композицией?

Любая помощь будет оценена.


person Ali    schedule 13.05.2015    source источник


Ответы (2)


То, что у вас есть, не является действительно жесткой связью. Жесткая связь будет такой:

class CustomerRepository {
    private readonly Database database;

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

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

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

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

person deceze♦    schedule 13.05.2015
comment
спасибо, я хочу знать, какова связь между слабой связью и композицией? как композиция поддерживает слабую связь, поскольку она завершила доступ к классу?? - person Ali; 13.05.2015
comment
Композиция описывает размещение экземпляра одного класса в качестве свойства другого класса. Этот второй класс состоит из самого себя и другого класса; то есть он может использовать функциональность других классов, не будучи другим классом (как это сделал бы extend). Слабое связывание обычно описывает идею отсутствия жесткого кодирования зависимостей и возможности их замены. Композиция — один из типичных способов добиться этого. - person deceze♦; 13.05.2015

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

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

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

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

Что делает пример 2 более слабо связанным, так это из-за принципа инверсии зависимостей. Основная идея заключается в том, что следует «зависеть от абстракций. Не полагайтесь на конкреции».

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

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

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

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

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

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

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

person Carbine    schedule 13.05.2015