5. Если вы знакомы с двумя (или более) естественными языками, опишите ситуацию,
когда один язык направляет говорящего в одном направлении, в то время как
другой язык приводит к иному ходу мысли.
Глава 2 : Объектно- ориентированное проектирование
Когда программисты спрашивают друг друга: «Чем же, в конце концов, является
объектно-ориентированное программирование?», ответ чаще всего подчеркивает
синтаксические свойства таких языков, как C++ или Object Pascal, по сравнению с их
более ранними, не объектно-ориентированными версиями, то есть C или Pascal. Тем
самым обсуждение обычно переходит на такие предметы, как классы и наследование,
пересылка сообщений, виртуальные и статические методы. Но при этом опускают
наиболее важный момент в объектно-ориентированном программировании, который не
имеет ничего общего с вопросами синтаксиса.
Работа на объектно-ориентированном языке (то есть на языке, который поддерживает
наследование, пересылку сообщений и классы) не является ни необходимым, ни
достаточным условием для того, чтобы заниматься объектно-ориентированным
программированием. Как мы подчеркнули в главе 1, наиболее важный аспект в ООП —
техника проектирования, основанная на выделении и распределении обязанностей. Она
была названа проектированием на основе обязанностей или проектированием на основе
ответственности (responsibility-driven design) [Wirfs-Brock 1989b, Wirfs-Brock 1990].
2.1. Ответственность подразумевает невмешательство
Как может констатировать любой, кто помнит себя ребенком (или кто воспитывает детей),
ответственность — обоюдоострый меч. Когда вы заставляете какой-либо объект (является
ли он ребенком, или программной системой) быть ответственным за конкретные действия,
вы ожидаете с его стороны определенного поведения, по крайней мере пока не нарушены
правила. Но, в равной степени важно, что ответственность подразумевает определенный
уровень независимости или невмешательства. Если вы скажете своей дочке, что она
отвечает за уборку своей комнаты, вы, как правило, не стоите рядом с ней и не
наблюдаете за выполнением работы — это противоречило бы понятию ответственности.
Вместо этого вы рассчитываете, что после выдачи распоряжения будет получен желаемый
результат.
Аналогично в случае примера с цветами из главы 1, когда я передаю запрос хозяйке
цветочного магазина с просьбой переслать цветы, я не задумываюсь о том, как мой запрос
будет обслужен. Хозяйка цветочного магазина, раз уж она взяла на себя ответственность,
действует без вмешательства с моей стороны.
Разница между традиционным и объектно-ориентированным программированием во
многих отношениях напоминает различие между активным наблюдением за тем, как
ребенок выполняет работу, и передачей (делегированием) ребенку ответственности за эту
деятельность. Традиционное программирование основывается в основном на приказаниях
чему-либо сделать что-то — к примеру, модифицировать запись или обновить массив
данных. Тем самым фрагмент кода привязан посредством передачи управления и
соглашений о структуре данных ко многим другим разделам программной системы. Такие
зависимости могут возникать через использование глобальных переменных, значений
указателей или попросту из-за неправильного применения или зависимой реализации
других фрагментов кода. Проектирование, основанное на ответственности, старается
PDF created with pdfFactory Pro trial version www.pdffactory.com