Шаблон Low Coupling Java

Степень связанности классов определяет, насколько класс связан с другими классами и какой информацией о других классах он обладает. При проектировании отношений между классами следует распределить обязанности таким образом, чтобы степень связанности оставалась низкой.

Наличие классов с высокой степенью связанности нежелательно, так как:

· изменения в связанных классах приводят к локальным изменениям в данном классе;

  • затрудняется понимание каждого класса в отдельности;
  • усложняется повторное использование, поскольку для этого требуется дополнительный анализ классов, с которыми связан данный класс.

Пусть требуется создать экземпляр класса Quest и связать его с объектом Test. В предметной области регистрация объекта Test выполняется объектом Course.

clip_image002

Рис. 5.3. Классы, которые необходимо связать

Далее экземпляр объекта Course должен передать сообщение makeQuest() объекту Test. Это значит, что в текущем тесте были получены идентификаторы всех вопросов, составляющих тест и становится возможным создание объектов типа Quest и наполнение собственно теста.

clip_image004

Рис. 5.4. Пример плохой реализации шаблона Low Coupling

/* пример # 4 : шаблон Low Coupling : Qest.java : Test.java : Course.java */

public class Course {

private int id;

private String name;

public void makeTest(){

Test test = new Test(параметры);

// реализация

while(условие){

Quest quest = new Quest(параметры);

// реализация

test.addTest(quest);

}

// реализация

}

}

public class Test {

// поля

public void addTest(Quest quest){

// реализация

}

}

public class Quest {

// поля и методы

}

При таком распределении обязанностей предполагается, что класс Course связывается с классом Quest.

Второй вариант распределения обязанностей с уклонением класса Course от создания объектов вопросов представлен на рисунке 5.5.

clip_image006

Рис. 5.5. Пример правильной реализации шаблона Low Coupling

/* пример # 5 : шаблон Low Coupling: Qest.java: Test.java: Course.java */

public class Course {

private int id;

private String name;

public void makeTest() {

Test test = new Test(параметры);

// реализация

test.addTest();

// реализация

}

}

public class Test {

// поля

public void addTest() {

// реализация

while(условие) {

Quest quest = new Quest(параметры);

// реализация

}

}

}

public class Quest {

// поля и методы

}

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

В обоих случаях предполагается, что объекту Test должно быть известно
о существовании объекта Quest.

При использовании первого способа, когда объект Quest создается объектом Course, между этими двумя объектами добавляется новая связь, тогда как второй способ степень связывания объектов не увеличивает. Более предпочтителен второй способ, так как он обеспечивает низкую связываемость.

В ООП имеются некоторые стандартные способы связывания объектов A и B:

· объект A содержит атрибут, который ссылается на экземпляр объекта B;

· объект A содержит метод, который ссылается на экземпляр объекта B, что подразумевает использование B в качестве типа параметра, локальной переменной или возвращаемого значения;

· класс объекта A является подклассом объекта B;

· B является интерфейсом, а класс объекта A реализует этот интерфейс.

Шаблон Low Coupling нельзя рассматривать изолированно от других шаблонов (Expert, Creator, High Cohesion). Не существует абсолютной меры для определения слишком высокой степени связывания.

Преимущества следования шаблону Low Coupling:

· изменение компонентов класса мало сказывается на других классах;

· принципы работы и функции компонентов можно понять, не изучая другие классы.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100