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