По
наводке ailev ознакомился с книжкой Криса Партриджа “Business Objects: Re-Engineering for Re-Use”. Прекрасное чтение после какого-нибудь руководства по “мейнстримному” объектно-ориентированному проектированию с использованием UML, а главное - в любимом мной жанре “прикладной философии”.
Как и полагается в книгах такого типа, где предлагается какой-то фундаментально новый подход, не обошлось без вступления в духе “вы все пидоры, а я Д’Артаньян”. Утверждается, что “стандартный” подход к проектированию информационных систем, который автор назвал “сущностным” (entity), несмотря на все заявления его авторов, не позволяет строить сколь-либо сложные модели реальных систем, и не позволяет прямо соотнести возникающие сущности с реальностью. Это подтверждается примером из статьи Стива Кука и Джона Дениэлса “Object-Oriented Methods and the Great Object Myth”, в котором “миф” о том, что мир состоит из объектов и операций (взаимно-однозначно соответствующих объектам и операциям в модели) разрушается простым примером - когда мы пьем чай, мы не вызываем операцию “пить”, принадлежащую объекту “чашка” - и вообще, представить это простое действие с помощью “объектно-ориентированной” модели очень сложно.
Для нового, единственно верного и всячески правильного подхода к проектированию предлагается сменить парадигму - то есть смотреть на мир, не как на состоящий из сущностей (entity, это общепринятый термин, например, в так называемой ER-модели) или субстанций (substance, это более высокий уровень абстракции и общепринятый
философский термин), а составленный из более сложных для представления “объектов”. То, что называется “объектами” в учебниках по ООП - это, в терминологии книги, “сущности” либо “субстанции”. Картина мира, использующая “сущности”, неявно существует и в “бумажных” информационных системах. Взаимно-однозначное соответствие между терминами из теории реляционных БД, “бумажных” картотек и “сущностной” парадигмы - не просто совпадение, а подтверждение единой картины мира, представляемой тремя способами.
В любой предметной области можно выделить четыре “рода” вещей (kinds of things) - конкретные вещи (”белый ВАЗ-2101 с проколотыми колесами, ржавеющий в моем дворе”), типы вещей (”все автомобили «Жигули»”), отношения между вещами (”Иван Иваныч - владелец белого ВАЗ-2101 и далее по тексту”) и изменения, происходящие с этими вещами (вышеупомянутым “Жигулям” выбили стекло, вытащили все сиденья и насрали внутри). Оказывается, что модель мира, состоящего из “сущностей” или “субстанций” не вполне адекватно позволяет описывать все это. Например, “сущности” убивает классический пример из все той же греческой философии - “корабль Тесея”. Жители Афин поставили корабль, на котором Тесей вернулся с Крита, победив Минотавра, на “вечную стоянку” - как крейсер “Аврора”. При этом они его постоянно ремонтировали (как крейсер “Аврора”), и наконец, настал момент, когда все досочки и гвоздики были поменяны (ну точно “Аврора”). Можно, конечно, ввести дополнительную сущность - например, ПТС, где отражать все замены номерных агрегатов - но древние греки до этого не дошли, и более-менее приемлемо парадокс разрешил Аристотель, рассматривая “субстанции” - грубо говоря то, что остается от предмета, если его лишить всех свойств. “Субстанция” нематериальна, и с точки зрения Аристотеля, сохраняется даже при замене всех “материальных” частей.
Так или иначе, но современное ООП предлагает смотреть на мир, как на множество объектов-субстанций, которые имеют изменяющиеся со временем свойства. В аристотелевскую картину мира укладывается и понятие наследования вместе с “общими” категориями объектов - как существование более общих, “вторичных” субстанций и свойств - но не все гладко с отношениями - для них приходится вводить дополнительные свойства объектов (например, у автомобиля есть свойство “владелец”) - и с изменениями - фактически предложенное Аристотелем решение предлагает учитывать изменения, как какие-то новые “частицы” в картине мира.
Если непонятно про Аристотеля - то вот более “жизненный” пример. Используемая в проектировании баз данных модель “сущность-связь” (entity-relationship, или ER-модель) возникает как раз при использовании “сущностей” или “субстанций”. Отношения (или “связи”) в ней предлагается представлять в виде дополнительных атрибутов объектов или же (в случае отношения “многие-ко-многим”) - строить “фиктивную” таблицу, представляющую отношения. Эти решения точно так же вводят в картину мира новые “элементарные частицы”, которые существуют наравне с “настоящими”, но ничего “реального” не представляют.
В книге предлагается принятую в современном ООП аристотелевскую модель последовательно перестраивать, приводя ее к “истинно объектному”, по мнению автора, виду - в отличие от понимания “объектов” в современном ООП. Как один из “промежуточных” шагов рассматривается “логическая” модель. Вместо атрибутов предлагается рассматривать принадлежность к классам (не в смысле “обычного” ООП) - например, вышеупомянутые “Жигули” Ивана Ивановича можно отнести к классам “автомобили”, “все белое”, “все ржавое” и так далее. Для того, чтобы представлять отношения, в картине мира появляются “кортежи” (tuple), которые, как и индивидуальные предметы, могут входить в какие-то классы. Например, пара <Иван Иваныч, ржавые Жигули> входит в класс, который можно назвать “владеет” - равно как и пара <Иван Иваныч, участок в 6 соток за 101 километром>. Точно так же можно представлять отношения из многих элементов - например, “Иван Иваныч выписал любимому внуку доверенность на “Жигули”" можно представить тройкой <Иван Иваныч, любимый внук, Жигули>, входящей в класс “кто-то выписал кому-то доверенность на что-то”. Всякий же объект оказывается представителем универсальной категории “логических объектов”.
Важное новшество в этой модели - возможность рассматривать “классы объектов” с позиции теории множеств. “Класс” - это множество объектов, которое само может являться подмножеством другого класса. Примером такого взаимоотношения между классами можно назвать цвета - класс “все раскрашенное” содержит классы “все белое” и “все красное” как подмножества. Это позволяет рассматривать иерархии классов, более точно отражающие реальный мир, чем в случае других моделей. Некоторой сложностью в главе про логическую модель оказывается понимание автором теории множеств. Например, если множество “всех красных” объектов - это объекты A и B, а “всех белых” - Y и Z, то описанный выше класс “всего раскрашенного” будет содержать не два описанных класса, а четыре объекта A, B, Y и Z. При этом автор использует термин “member of” - то есть описывает множество {{A, B}, {Y, Z}} вместо {A, B, Y, Z}.
Кстати, с помощью логической модели можно проектировать реляционные базы данных. Да, они получаются сложнее, чем в книжке “PHP и MySQL для чайников” - но понимание того, что таблица БД - это список кортежей, входящих в какое-то отношение (поэтому БД и “реляционная”), а не “записей об объектах”, позволяет представлять многие вещи куда эффективнее. Фактически это обобщение принципов, заложенных в ER-модель на отношения с количеством членов, большим двух.
Логическая модель снимает сложности с отношениями, но проблема представления изменений остается. Для ее решения предлагается ввести “четвертое измерение” - время, и вместо локализованных во времени “логических объектов” рассматривать объекты на протяжении всего их жизненного цикла. Фактически, это замена значения функции на саму функцию или ее график, то есть некоторую кривую - очень плодотворная идея в математике и, как ни странно, в науке о представлении окружающего мира. Эту модель автор называет “объектной” - в очередной раз вворачивая модное слово и совершенно смущая читателя - особенно того, который обнаружил в главе о “субстанциальной” модели все понятия современного ООП.
Кстати, в книге очень сложная и непривычная на первый взгляд терминология. Например, “объектами” называют совсем не то, что понимается под словом “объект” в книжках “по UML”, а с первого раза понять слово “substance” вообще невозможно. Про странное понимание терминов теории множеств я уже упоминал. Оно только запутывает читателя, хорошо знакомого с этими терминами.
После последовательного построения “объектной” (в терминологии автора) модели она применяется к нескольким примерам, разумеется, весьма успешно. Построенная методология преобразования “сущностных” моделей в “объектные” называется красивыми словами REV-ENG™ (да-да, именно со значком trade mark), предлагается автором в качестве абсолютно универсальной и везде-везде применимой. Насчет абсолютной ее применимости не знаю - хотя очень похожий метод лежит в основе стандарта обмена данными ISO 15926, и по утверждениям все того же
ailev, это “наше все” и вообще, будущее человечества. Во всяком случае, книжка круто “расширяет сознание” и заставляет по-новому взглянуть на привычные вещи.
PS Несмотря на то, что я поставил тег “программирование”, в книге нет ни единой строчки кода ни на одном из языков программирования. Читать можно всем без исключения, хотя очень желательно понимание существующих методов работы с разнообразными данными - хотя бы в рамках UML и того, что называется “теорией баз данных”.
Запись опубликована в
блоге Шуры Люберецкого. Вы можете оставлять свои комментарии
там, используя свое имя пользователя из ЖЖ (вход по OpenID).