Шаг 54.
Унифицированный язык моделирования UML.
Понятие классификации

    На этом шаге рассмотрим понятие классификации.

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

    Идентификация классов и объектов — одна из самых сложных задач объектно- ориентированного анализа и проектирования. Ее решение содержит в себе элементы открытия и изобретения. Открытия позволяют распознать основные абстракции и механизмы, образующие словарь предметной области. Изобретения помогают сконструировать обобщенные абстракции и новые механизмы, определяющие способы взаимодействия объектов. Итак, классификация всегда сопряжена с открытиями и изобретениями. Целью классификации является выявление общих свойств объектов. Классификация позволяет объединить в одну группу объекты, имеющие одинаковую структуру или одинаковые свойства.

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

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

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

    Факт, что разумная классификация представляет собой сложную проблему, известен давно. Подтвердим этот тезис примерами классификации в биологии и химии, имеющими аналоги в объектно-ориентированном проектировании.

    Вплоть до XVIII века в биологии доминировала идея о возможности упорядочить живые организмы по мере возрастания степени их сложности. Мера сложности была чрезвычайно субъективной (поэтому неудивительно, что человек оказался на вершине списка). В середине XVIII века шведский ботаник Карл Линней (Carolus Linnaeus) предложил более подробную таксономию для классификации организмов: по родам (genus) и видам (species). Через сто лет Дарвин (Darwin) предложил теорию, согласно которой механизмом эволюции является естественный отбор, а ныне существующие виды животных произошли от более древних. Теория Дарвина основывалась на разумной классификации видов. Дарвин утверждал, что натуралисты пытаются объединить виды, роды, семейства в классы, образующие то, что называется естественной системой. Но что подразумевается под этой системой? Некоторые авторы считают ее схемой группировки схожих организмов в один класс и распределения непохожих организмов по разным классам [Darwin, C. 1984. The Origin of Species. Vol. 49 of Great Books of the Western World. Chicago, IL: Encyclopedia Britannica, p. 207.]. В биологии термин "классификация" означает "установление иерархической системы категорий на основе предположительно существующих естественных отношений между организмами" [The New Encyclopedia Britannica. 1985. Chicago, IL: Encyclopedia Britannica, vol. 3, p. 356.]. Наиболее общая категория в биологической таксономии — это фауна (kingdom), затем, в порядке возрастания специализация: тип (phylum), подтип (subphylum), класс (class), отряд (order), семейство (family), род (genus) и, наконец, вид (species).

    Разные критерии классификации одних и тех же организмов приводят к разным результатам. Мартин (Martin) утверждает, что все зависит от того, что вы хотите от классификации. Если ваша цель — отразить генетическую связь между видами, то вы получите один ответ. Если же вы желаете каким-то образом охарактеризовать уровни адаптации, то ответ будет другой [As quoted in Lewin, R. November 4, 1988. Family Relationships Are a Biological Conundrum. Science vol. 242, p. 671.]. Итак, даже в строгих научных дисциплинах классификация сильно зависит от своего предназначения. Аналогичные уроки можно извлечь, изучая химию [The New Encyclopedia Britannica vol. 3, p. 156.]. В древние времена считалось, что все вещества представляют собой комбинации земли, воздуха, огня и воды. В настоящее время такую классификацию нельзя считать удовлетворительной. В середине XVII века Роберт Бойль (Robert Boyle) предположил, что простейшими химическими абстракциями являются элементы, из которых состоят более сложные структуры. Век спустя, в 1789 году, Лавуазье (Lavoisier) опубликовал первый список, содержащий 23 элемента, некоторые из которых, как выяснилось позднее, элементами вовсе не являются. Однако открытие новых элементов продолжалось и список увеличивался, пока в 1869 году Менделеев не открыл периодический закон, дававший точные критерии для классификации известных элементов и предсказывавший свойства еще не открытых элементов. И все же даже периодический закон не был завершением истории о классификации элементов. В начале XX века были открыты элементы с одинаковыми химическими свойствами, но с разными атомными весами — изотопы.

    Лучшие проекты программного обеспечения выглядят просто, но разработать простую архитектуру очень трудно.

    Изложенная история подчеркивает, что разумная классификация — это сложная интеллектуальная работа и лучший способ ее выполнения — последовательный, итеративный процесс. Как отметил Шоу (Shaw), при проектировании программного обеспечения разработка отдельных абстракций часто основана на общих шаблонах. Сначала проблема решается приблизительно. Потом, по мере накопления опыта, некоторые решения оказываются лучше других и возникает что-то вроде фольклора, неформально распространяющегося между людьми. В итоге удачные решения систематически изучаются, программируются и анализируются. Это позволяет создавать модели, поддерживающие их автоматическую реализацию, и разрабатывать теории, обобщающие найденное решение. Это в свою очередь обогащает практику и позволяет решать еще более сложные задачи, которые снова решаются в первом приближении, начиная новый виток спирали [Shaw, M. May 1989. Larger Scale Systems Require Higher-Level Abstractions. SIGSOFT Engineering Notes vol. 14(3), p. 143.].

    Поступательная и итеративная природа классификации непосредственно влияет на конструирование иерархий классов и объектов при разработке сложного программного обеспечения. На практике, как правило, за основу берется структура классов, использованная в одном из предыдущих проектов, которую постепенно совершенствуют. Качество классификации можно оценить лишь на поздней стадии разработки, когда созданы клиенты, использующие разработанную структуру. Основываясь на полученном опыте, можно создать новые подклассы существующих классов (вывод), разделить большой класс на много маленьких (факторизация) или объединить несколько маленьких классов в один большой класс (композиция). Иногда в процессе проектирования выявляют ранее незамеченные общие свойства, позволяющие создать новый класс (абстракцию) [Goldstein, T. May 1989. The Object-Oriented Programmer. The C++ Report vol. 1(5).].

    Трудность классификации объясняется двумя основными причинами:

  1. Идеальной классификации не существует, хотя, естественно, некоторые классификации лучше других. Любая классификация зависит от точки зрения выполняющего его наблюдателя.
  2. Разумная классификация требует огромных творческих усилий.

    На следующем шаге рассмотрим три подхода к классификации.




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