Шаблон High Cohesion Java

С помощью этого шаблона можно обеспечить возможность управления слож­ностью, распределив обязанности, поддерживая высокую степень зацепления.

Зацепление – мера сфокусированности класса. При высоком зацеплении обязанности класса тесно связаны между собой, и класс не выполняет работ непомерных объёмов. Класс с низкой степенью зацепления выполняет много разнородных действий или не связанных между собой обязанностей.

Возникают проблемы, связанные с тем, что класс:

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

· сложен в поддержке и повторном использовании из-за того, что он должен быть использован вместе с зависимыми классами;

· ненадежен, постоянно подвержен изменениям.

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

Пусть необходимо создать экземпляр класса Quest и связать его с заданным тестом. Какой класс должен выполнять эту обязанность? В предметной области сведения о вопросах на текущий момент времени при прохождении теста записываются в объекте Course, согласно шаблону для создания экземпляра объекта Quest можно использовать объект Course. Тогда экземпляр объекта Course сможет отправить сообщение makeTest() объекту Test. За прохождение теста отвечает объект Course, т.е. объект Course частично несет ответственность за выполнение операции makeTest(). Однако если и далее возлагать на класс Course обязанности по выполнению все новых функций, связанных с другими системными операциями, то этот класс будет слишком перегружен и будет обладать низкой степенью зацепления.

Этот шаблон необходимо применять при оценке эффективности каждого проектного решения.

Виды зацепления:

1. Очень слабое зацепление. Единоличное выполнение множества разнород­ных операций.

/*пример # 6 : очень слабое зацепление : Initializer.java */

public class Initializer {

public void createTCPServer(String port) {

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

}

public int connectDataBase(URL url) {

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

}

public void createXMLDocument(String name) {

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

}

}

2. Слабое зацепление. Единоличное выполнение сложной задачи из одной функциональной области.

/*пример # 7 : слабое зацепление : NetLogicCreator.java */

public class NetLogicCreator {

public void createTCPServer() {

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

}

public void createTCPClient() {

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

}

public void createUDPServer() {

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

}

public void createUDPClient() {

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

}

}

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

/*пример # 8 : среднее зацепление : TCPServer.java */

public class TCPServer {

public void createTCPServer() {

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

}

public void receiveData() {

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

}

public void sendData() {

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

}

public void compression() {

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

}

public void decompression() {

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

}

}

4. Высокое зацепление. Среднее количество обязанностей из одной функциональной области при взаимодействии с другими классами.

/*пример # 9 : высокое зацепление : TCPServerCreator.java : DataTransmission.java : CodingData.java */

public class TCPServerCreator {

public void createTCPServer() {

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

}

}

public class DataTransmission {

public void receiveData() {

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

}

public void sendData() {

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

}

}

public class CodingData {

public void compression() {

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

}

public void decompression() {

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

}

}

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

Вы можете следить за любыми ответами на эту запись через 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