Периодически смотрю на когда-то написанный код и удивляюсь: как мне могло прийти в голову такое дурацкое решение — хоть алгоритмически, хоть в плане реализации. Ладно бы на момент написания я не знал чего-то существенного, но все было известно, просто мозг так сработал.
Например, только что обнаружил такой ляп в коде двухлетней давности. Делал реализации трех похожих системных интерфейсов, вынеся общее в базовый класс, и сделав отдельный производный класс под каждый интерфейс. Каждый интерфейс обрабатывает системные запросы, присылаемые не через виртуальные функции, как обычно, а через табличные обработчики, которые для удобства завел напрямую в базовый класс. Но в этих запросах система присылает адреса объектов производных классов, поэтому потребовались функции для получения адреса объекта базового класса по объекту заранее неизвестного производного. А поскольку все эти интерфейсы основаны на COM, мне на тот момент почему-то показалось, что единственно правильным решением будет определить GUID интерфейса базового класса и добавить соответствующий код в QueryInterface. Мысли о том, что гораздо проще и правильнее было бы сделать для этого отдельную виртуальную функцию, не возникло. Мозг тупо пошел на поводу у подхода, принятого в COM.
Интересно, насколько часто подобные ляпы встречаются в народе?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>как мне могло прийти в голову такое дурацкое решение — хоть алгоритмически, хоть в плане реализации.
Мне кажется, в момент написания у разработчика в голове зреют какие-то планы развития этого участка кода. Планы влияют на решение, а потом не сбываются.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Интересно, насколько часто подобные ляпы встречаются в народе?
У меня всё гораздо хуже. Иногда кажется, что я мало способен к проектированию и пишу программы исключительно снизу вверх. То есть не начинаю с продумывания архитектуры, а архитектура рождается в процессе усложнения системы. Поэтому большая часть моих программ является нагромождением костылей разного уровня кривости.
Здравствуйте, Mihas, Вы писали:
M>Мне кажется, в момент написания у разработчика в голове зреют какие-то планы развития этого участка кода.
У меня на тот момент совершенно точно ничего подобного не зрело. Просто сработала первая ассоциация "раз COM — значит, интерфейс нужно получить через QueryInterface, а для этого нужно определить GUID". Задача была решена, и за два года (этот кусок мне несколько раз попадался на глаза) даже подозрения не возникло, что он кривой. Вот только сегодня торкнуло.
N>У меня всё гораздо хуже. Иногда кажется, что я мало способен к проектированию и пишу программы исключительно снизу вверх. То есть не начинаю с продумывания архитектуры, а архитектура рождается в процессе усложнения системы.
Аналогично.
N>Поэтому большая часть моих программ является нагромождением костылей разного уровня кривости.
Решается рефакторингом обычно. Возможно, если начинать с продумывания, то рефакторинга можно было бы избежать, но так как продукт развивается, то архитектура и реализация всё равно меняются со временем, поэтому всё ли так плохо — не знаю.
Хорошая мысля приходит опосля, как говорится. Полезно иногда со свежей головой почитать свой код. Хотя я считаю подобные вещи мелочью. Работает корректно и фиг с ним. Исправляется в 10 строк — значит и проблемы никакой не было, не о чем думать. Вот когда фундаментально подход оказывается неоптимальным и хочется немного архитектуру переколбасить, вот это неприятно, тут или куча работы, которую потом долго тестировать или сидеть с неоптимальным кодом, что тоже неприятно.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Периодически смотрю на когда-то написанный код и удивляюсь: как мне могло прийти в голову такое дурацкое решение — хоть алгоритмически, хоть в плане реализации. Ладно бы на момент написания я не знал чего-то существенного, но все было известно, просто мозг так сработал.
[skip]
ЕМ>Интересно, насколько часто подобные ляпы встречаются в народе?
«Code Complete» Стива Макконнелла хорошо просвещает, что с этим делать, как бороться. И главное, как и что именно возглавить, если победить в этой борьбе не получается
Ну и еще пара книжек хороши по архитектуре: Брукс, Алистер Коберн… Как думать, проектировать, и.т.д. чтобы в таком «болоте» не увязнуть совсем, напрочь — по ноздри, когда уже проще с нуля переписать, чем ковыряться.
Здравствуйте, Carc, Вы писали:
C>«Code Complete» Стива Макконнелла хорошо просвещает, что с этим делать, как бороться.
Спасибо, книжка хорошая. Только подобные книжки годятся в основном для классических программ, в которых реализации идеи не мешает ничто, кроме квалификации и ресурсов программистов. А у меня всю жизнь преобладают задачи типа "вот это реализовано бедно/криво/убого, надо туда как-то влезть и расширить и/или исправить". Когда встраиваешься в изначально кривую реализацию, будучи сильно ограничен ее особенностями, редко удается выдержать стройную архитектуру и соблюсти прочие правила хорошего тона.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Carc, Вы писали:
C>>«Code Complete» Стива Макконнелла хорошо просвещает, что с этим делать, как бороться.
ЕМ>Спасибо, книжка хорошая. Только подобные книжки годятся в основном для классических программ, в которых реализации идеи не мешает ничто, кроме квалификации и ресурсов программистов. А у меня всю жизнь преобладают задачи типа "вот это реализовано бедно/криво/убого, надо туда как-то влезть и расширить и/или исправить". Когда встраиваешься в изначально кривую реализацию, будучи сильно ограничен ее особенностями, редко удается выдержать стройную архитектуру и соблюсти прочие правила хорошего тона.
Это самая "кривая реализация", в которую надо "влезть", она своя?
Или чужая? Которую нельзя изменить по каким-то причинам?
Здравствуйте, Nuzhny, Вы писали:
N>У меня всё гораздо хуже. Иногда кажется, что я мало способен к проектированию и пишу программы исключительно снизу вверх.
Иногда это не худший вариант. Я вот постоянно ловлю себя на том, что очень много обобщаю и нагромождаю всякой, ненужной потом, "архитектуры". Трачу кучу времени на это, хотя можно было просто писать конкретную реализацию, а потом, если надо, уже отрефакторить и обобщить.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.