- •3 Системное программное обеспечение.
- •Инструментарий технологии программирования.
- •Пакеты прикладных программ.
- •Суть поиска подходящих объектов при проектировании.
- •Специфицирование интерфейсов объекта.
- •Специфицирование реализации объектов.
- •Механизмы повторного использования.
- •Сравнение структур времени выполнения и времени компиляции.
- •Проектирование с учетом будущих изменений
- •Прикладные программы. Инструментальные библиотеки. Каркасы приложений.
- •Признаки плохого проекта.
- •Принцип персональной ответственности
- •15. Принцип открытия – закрытия (оср)
- •17. Принцип инверсии зависимостей.
- •Обратное влияние клиентов на интерфейсы
Принцип персональной ответственности
Приложение, выполняющее геометрические вычисления |
|
Rectangle |
|
|
|
||||
|
|
|
|||||||
+ draw() + area(): double |
приложение |
||||||||
|
|
||||||||
|
|
V |
|
|
|
||||
|
Графический интерфейс пользователя |
|
|
||||||
|
|
|
|
Рис.1 В описанном проекте нарушается принцип персональной ответственности (SRP). На класс Rectangle возлагаются две ответственности. Смысл первой ответственности заключается в реализации геометрии прямоугольника. Суть второй ответственности заключается в представлении прямоугольника средствами графического интерфейса пользователя. Нетрудно заметить, что в данном случае нарушается принцип персональной ответственности (SRP). В результате появляется ряд проблем. Во-первых, придется включать класс GUI в приложение, реализующее геометрические вычисления. Во-вторых, в случае, если изменение GraphicalApplication приводит к модифицированию Rectangle, потребуется повторно сформировать, протестировать и развернуть ComputationalGeometryApplication. Если эти этапы пропущены, это может привести к непредсказуемому сбою в работе приложения. В этом проекте вычислительные операции модуля Rectangle выполняются классом GeometricRectangle. Теперь изменения, влияющие на способ отображения прямоугольника, не затрагивают ComputationalGeometryApplication.
Приложение, выполняющее |
|
Графическое |
|
|
|
||
геометрические вычисления |
приложение |
|
|
||||
\ |
' |
|
\ |
1 |
|
\ |
1 |
Geometric Rectangle |
|
Rectangle |
|
Графический интерфейс |
|||
|
|||||||
|
|
||||||
+ area(): double |
|
|
пользо |
Вателя |
В контексте SRP-принципа ответственность определяется в качестве "причины для изменения". Если существует несколько мотивов для изменения класса, ему соответствует более одной ответственности. Порой этот факт не так уж просто распознать. Чаще имеют в виду ответственность, распределяемую в группах.
нарушение принципа SRP
interface Modem {
public void dial(String pno);
public void hangup();
public void send(char c);
public char recv(); }
Здесь представлены две ответственности. Суть первой ответственности заключается в управлении соединением. Вторая ответственность заключается в осуществлении передачи данных. Функции dial и hangup управляют соединением, устанавливаемым модемом, а функции send и recv обеспечивают передачу данных. . Если применяемые при этом методы влияют на сигнатуру функций, устанавливающих соединение, проект станет излишне "закрепощенным". Это связано с тем, что классы send и recv придется компилировать и повторно использовать гораздо чаще, чем следовало бы. В этом случае следует разделять две ответственности. С другой стороны, если при изменении приложения не применяются способы, приводящие к изменению двух ответственностей в различное время, разделять их вовсе не требуется. В противном случае мы имели бы дело с избыточной сложностью. Из всего сказанного напрашивается вполне логичный вывод. Ось изменения является таковой лишь в том случае, если изменения действительно происходят. Следует применять принцип SRP только в том случае, когда это оправдано. На рис. 1 рассматриваются две ответственности, спаренные в классе Modemlmplementation. Это не всегда желательно, но иногда может быть необходимо. Весьма часто возникают причины, связанные с аппаратным обеспечением или операционной системой, принуждающие к выполнению спаривания. В этом случае благодаря разделению интерфейсов можно разделять концепции таким образом, чтобы не затрагивать остальные компоненты приложения. Класс Modemlmplementation можно рассматривать как некое искусственное образование. Обратите внимание на то, что все зависимости протекают вне этого класса. Зависимость от этого класса не является обязательной. В этом случае никакой другой модуль, исключая main, не нуждается в знании относительно существования этого класса. В результате возможные неприятности ограждаются своеобразным "барьером". Благодаря этому не "загрязняется" остальной код приложения.
I |
|
Employee |
Подсистема обеспечения уотойчивости |
|
|
< |
+ Calculate Pay + Store |
|
|
|
На этом рис. демонстрируется общий случай нарушения принципа SRP. Класс Employee включает деловые правила, а также обеспечивает контроль устойчивости. Эти две ответственности практически никогда не смешиваются. Деловые правила могут достаточно часто изменяться, и хотя то же самое нельзя сказать относительно устойчивости, изменение последней происходит в силу совершенно иных причин. Связывание деловых правил с подсистемой обеспечения устойчивости может привести к появлению определенных проблем.