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