Вам обычно не удастся переделать имеющуюся структурную программу в объектно-ориентированную
Одним из побочных эффектов только что описанной организации является то, что обычно невозможно преобразовать структурный подход в соответствии с этим образом мыслей без полного переписывания кода. Возвращаясь вновь к печати, отметим, что соответствующим сообщением могло бы быть "воспроизвести себя на этом устройстве", а обработчику сообщения могла быть передана ссылка на обобщенный объект device, которому нужно переслать данные. Код, который фактически выполняет воспроизведение, на самом деле находится внутри
этого объекта. (В порядке разъяснения: нет причины, из-за которой нельзя поддерживать несколько сообщений типа "воспроизведи себя". Например, объект электронной таблицы мог бы поддерживать сообщения "воспроизвести себя в виде таблицы", "воспроизвести себя в виде графика" и "воспроизвести себя в виде круговой диаграммы").
В структурной системе код, который выполняет воспроизведение, является внешним. Некая функция получает откуда-то объект, после чего делает различные системные вызовы для вывода его на экран. Если вы говорите о printf(), то вызовы не очень сложные, но если речь заходит о Windows или Motif —
у вас появляется проблема. Объектно-ориентированный проект фактически является вывернутым наизнанку в сравнении со структурным проектом.
Преимущество объектно-ориентированного подхода — в том, что вы можете менять операционную среду путем изменения реализации объекта device, и при этом остальной код
в программе не затрагивается. Несмотря на это, вызванные изменения столь фундаментальны, что полный перевод возможен лишь после переработки в программе каждой функции, которая прямо вызывает функцию операционной системы. Это нетривиальное мероприятие, которое вероятно потребует отбрасывания большей части кода в существующем приложении.
Сообщение "модифицировать себя" аналогично: диалоговое окно модификации в стандартной структурной программе изображается внешним кодом. В объектно-ориентированном проекте объект сам взаимодействует с пользователем в ответ на получение сообщения "модифицировать себя" —
наизнанку в сравнении со структурным подходом. И снова преимущество в том, что изменения полей, которые должны быть модифицированы, концентрируются в определении класса. Вам не нужно искать по всей программе код, который использует объекты класса, каждый раз, когда меняется поле в определении класса.
Мой опыт с гибридными приложениями не очень удачен: кажется, что в них соединяются все проблемы как структурных, так и объектно-ориентированных систем без каких то преимуществ тех и других. Это реальная опасность для тех, у кого "нет времени, чтобы делать все правильно" — они могут получить в итоге несопровождаемый гибрид.
Ошибочно рассматривать тело существующего кода, вне зависимости от его размера, в качестве "ценного имущества", в которое вы должны постоянно инвестировать. Вы не выбросите деньги, потраченные на написание существующего кода, когда решитесь от него отказаться. Деньги, потраченные на написание кода, уже, наверное, окупились за счет продаж, и теперь, чтобы чего-то достичь, вы должны не дорабатывать существующий код, а писать новый. Начинающая фирма-конкурент, способная лишь куснуть вас за пятку, разрабатывает свой продукт с самого начала и получает преимущество за счет использования современной технологии и идей по методологии проектирования. Между тем ваш существующий код запирает вас в рамках обветшалого проекта и устаревшей технологии. Нельзя просто откинуться на спинку кресла и почить на лаврах — вы должны постоянно переписывать свой продукт заново, чтобы совершенствовать его сколь-нибудь заметным образом.
Я должен сказать, что многие со мной в этом месте не согласны. Рецензент одной из моих недавних статей ответил на (возможно, слишком упрощенное) утверждение, что гибридные приложения "не работают", заявив: "Я знаю массу торгово-транспортных приложений, которые написаны именно таким образом, приносят прибыль своим создателям и, следовательно, работают". С другой стороны, тот факт, что этот рецензент работает в фирме, владеющей несколькими огромными гибридными приложениями, очевидно, повлиял на его отзыв. Один из этих гибридов задерживался с выходом на рынок более чем на год во время, когда писалась рецензия, и сопровождение было постоянным кошмаром для большинства остальных, но я думаю, что эти проблемы были недостаточно важными, чтобы их учитывать, потому что этот конкретный программист не занимался сопровождением.