Шаг 48.
Унифицированный язык моделирования UML.
Выбор отношений

    На этом шаге рассмотрим выбор отношений между классами и объектами.

    Выбор отношений между классами и объектами зависит от выбора операций. Если проектировщик хочет, чтобы объект X послал объекту Y сообщение М, то прямо или косвенно класс X должен иметь доступ к классу Y, иначе операцию M невозможно вызвать в классе X. Под доступом понимается способность одной абстракции находить другую и обращаться к ее открытым ресурсам. Абстракции доступны друг для друга только тогда, когда их области видимости перекрываются и они обладают необходимыми правами доступа (например, закрытая часть класса доступна только его членам и друзьям). Таким образом, связанность отражает степень видимости.

    Выбирая отношения, целесообразно пользоваться законом Деметера (Demeter), утверждающим, что методы класса не должны зависеть от структуры других классов, за исключением ближайшей структуры (верхнего уровня) самого класса. Кроме того, каждый метод должен посылать сообщения только объектам, принадлежащим предельно ограниченному множеству классов [Sakkinen, M. December 1988. Comments on "the Law of Demeter" and C++. SIGPLAN Notices vol. 23(12), p. 38.]. Следование этому закону позволяет создавать слабо связанные классы, реализация которых инкапсулирована. Такие классы достаточно автономны, т.е. чтобы разобраться в их работе, нет необходимости знать строение других классов.

    При анализе структуры классов системы в целом может оказаться, что иерархия наследования либо слишком широкая и мелкая, либо слишком узкая и глубокая, либо сбалансированная. Широкая и мелкая структура классов выглядит как лес из свободно стоящих деревьев, смешивающихся и согласующихся между собой. Узкая и глубокая структура классов напоминает дерево классов, имеющих общего предка [Lea, D. August 12,1988. User's Guide to GNU C++ Library. Cambridge, MA: Free Software Foundation, p. 12.]. Каждый из этих вариантов имеет свои достоинства и недостатки.

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

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

    Иногда необходимо найти компромисс между отношениями наследования, агрегации и зависимости. Например, должен ли класс Саr (Автомобиль) наследовать, содержать или использовать классы Engine (Двигатель) и Wheel (Колеса)? В данном случае отношение агрегации более целесообразно, чем наследование. По мнению Мейера (Meyer), между классами А и В наследование приемлемо, если любой экземпляр класса В может одновременно рассматриваться и как объект класса А. Отношение клиента следует выбирать тогда, когда каждый экземпляр класса В просто владеет одним или несколькими свойствами класса А [Meyer. Object-Oriented Software Construction, p. 332.].

    С другой стороны, если объект является чем-то большим, чем простая сумма его частей, то следует предпочесть отношение наследования.

    Отношения между объектами зависят от механизмов их взаимодействия. Перед проектировщиком стоит простой вопрос: как разделить знания между объектами? Например, на ткацкой фабрике партии материалов поступают для обработки на производственные участки. О поступлении партии на участок необходимо известить управляющего, который должен выбрать определенное действие.

    Таким образом, проектировщик должен решить, является ли поступление партии материала на участок операцией над участком, над материалом, или тем и другим одновременно. Если это операция над участком, то класс участка должен быть видим для класса материала. Если это операция над материалом, то класс материала должен быть видим для класса участка, так как партия материала должна различать участки. Если это операция над участком и партией материала одновременно, то необходимо обеспечить их взаимный доступ. Кроме того, следует определить отношение между управляющим и участком (но не материалом и управляющим): либо управляющий должен знать все о своем участке, либо участок должен знать о своем управляющем.

    На следующем шаге рассмотрим выбор реализации класса.




Предыдущий шаг Содержание Следующий шаг