
УМП Технологические подходы к разработке ПО 98
Замечание
Интересно и поучительно проследить историю развития ОО программирования. Все пере-
численные понятия и идеи известны с 1968 года (СИМУЛА-67), в рафинированном виде бы-
ли оформлены в теоретических работах к 1978 году (Б. Лисков и многие другие), получили
общепризнанное языковое выражение к 1988 году (С++) и стали естественным инструмен-
том для профессиональных программистов к 1998 году.
Важным элементом парадигмы ОО программирования является следующая идея: класс
(который тоже является объектом) может иметь методы, называемые конструкторы и де-
структоры, позволяющие в время выполнения программы динамически порождать и
уничтожать экземпляры (объекты) данного класса. Объекты одного класса сходны между
собой (например, наследуют методы класса), но имеют различия (например, имеют раз-
ные значения свойств).
Замечание
Механизм динамического порождения экземпляров оказывается очень полезен, а в некото-
рых случаях незаменим, однако это не всегда так. Более того, очень часто в приложениях
типа информационной системы масштаба предприятия оказывается, что экземпляры объек-
тов если и порождаются, то как пассивные хранилища конкретных наборов значений
свойств, а их методы статически предопределены и неизменны (и, следовательно, достаточ-
но иметь методы в единственном экземпляре). В таком случае, экземпляры объектов (набо-
ры значений свойств) удобно хранить в виде записей таблицы базы данных, а их общие ме-
тоды — в виде специального модуля, содержащего процедуры работы с этой базой. Такой
модуль обычно называется служба (service).
55
Программирование в терминах служб являет-
ся ОО программированием, потому что главным в инкапсуляции является не формальное
объединение данных и процедур их обработки в какой-то специальной программной конст-
рукции, а регламентация доступа к данным (см. также раздел Службы).
Из сказанного следует важный вывод:
56
объектная ориентированность является атрибутом
стиля программирования, присущего конкретному программисту, а не предопределяется
используемым языком или системой программирования. В любой системе программиро-
вания, даже в той, где нет никаких специальных средств поддержки объектов и классов,
можно создавать ОО программы, используя все преимущества ОО программирования,
равно как и в самой современной ОО системе никто не застрахован от безнадежно недис-
циплинированного манипулирования объектами. Более того, в некоторых случаях слиш-
ком автоматизированные средства ОО программирования мешают ОО программирова-
нию, поскольку навязывают программисту конкретные решения. Например, в большин-
стве современных систем ОО программирования требуется, чтобы метод был отнесен в
точности к одному классу, хотя это отнюдь не всегда естественно и удобно.
57
С парадигмой ОО программирования связано развитие и практическое воплощение важ-
ной мысли, (уже упомянутой в разделе Структурное программирование) о неразрывной
связи проектирования и кодирования и о примате проектирования. Человек мыслит ре-
альный мир состоящим из объектов.
58
Кодированию всегда
59
предшествует проектирова-
ние, важнейшей частью которого является моделирование, т.е. вычленение в предметной
области задачи объектов и связей, которые существенны для решения задачи. ОО про-
граммирование позволяет установить прямое соответствие между программными конст-
рукциями и объектами реального мира через объекты модели. Таким образом, ОО система
программирования поддерживает не только кодирование, но и (до некоторой степени)
проектирование. При написания ОО программы основные усилия программист тратит на
определение состава классов, их методов и свойств. Эта информация является в чистом
55
Впервые этот термин был введен И.В. Романовским в статье "Программирование в терминах служб" (1974). Часто
используемый сейчас эквивалентный термин "сервис", полученный прямой транслитерацией, гораздо менее удачен с
точки зрения чистоты русского языка.
56
См. последний абзац в разделе Структурное программирование.
57
Утрируя, можно сказать, что самым ОО языком является Фортран, поскольку он не навязывает никаких ОО решений.
58
Это свойство нашего мышления, но не свойство реального мира.
59
У неумелых программистов неявно и бессознательно, у умелых – явно и осознанно.