среда, 16 октября 2013 г.

Коротко. По поводу примесей, UML и "поощрения" дублирования кода

По мотивам -
http://18delphi.blogspot.ru/2013/10/blog-post_4433.html?showComment=1380759481347#c3311699835491530438
http://18delphi.blogspot.ru/2013/10/blog-post_4433.html?showComment=1380829107352#c4812680278845440062

Надо понимать ещё ОДНУ простую вещь. Если "примесь" или "статический" код (не обременённый виртуальностью или интерфейсами) - разворачиваются "по месту использования", то линкер - ГАРАНТИРОВАННО выкидывает всё ненужное. Т.е. о "code blast" - говорить не приходится.

Если код РЕАЛЬНО используется, то он - ИСПОЛЬЗУЕТСЯ. Если не используется, то он - ВЫКИДЫВАЕТСЯ. Тут и говорить не о чем.

Но при этом мы экономим "сотни вызовов" на отсутствии обеспечения "динамического полиморфизма".

Вместо:

Case vItemType of
 vInteger : Result := ItemToInt(Item) = ItemToInt(ToFound);
 vString: Result := ItemToString(Item) = ItemToString(ToFound);
...
etc.

Получаем:
Result := Item = ToFound;

А это - "сотни вызовов". Даже - "тысячи".

Так что "дублирование кода" - не мы одни "придумали". Оно очень даже применяется. Со времён Страуструпа. Хотя (я думаю) и раньше.

Главное ПОНИМАТЬ - физическое это дублирование кода или логическое.

Адепты Python или C# меня конечно вряд ли поймут. Но я их "в свою веру" и не агитирую.

Хотя в C# есть Boxing/Unboxing. Тоже - тот ещё "костыль". Но - "спасает" ситуацию.

------------------------------------------------------

Про Java - говорить - ВООБЩЕ не буду. Пока мой клиент SmartSVN (написанный на Java) не перестанет постоянно зависать. Простите уж. "Практика - критерий истины". Зависает он. А другой "нативный" клиент (CornerStone) - зависает гораздо реже.

Вот вам и "всё является объектом" и "сборка мусора".

Простите уж...
-------------------------------------------------------

А что до "дублирования" кода - оно ЕСТЬ. И видимо - ВСЕГДА будет.

Как ни горько осознавать это.

Посему - ПРОЩЕ и ТЕХНОЛОГИЧНЕЕ - ОДИН раз шаблонизировать "дублирующийся" (параметризуемый по месту) код. И ГЕНЕРИРОВАТЬ его с модели.

А ПОТОМ уже - если вдруг возникнет ОЗАРЕНИЕ - поменять все "дублируемые" куски СКОПОМ и РАЗОМ. На уровне кодогенерации.

И это - РЕАЛЬНОСТЬ и ПРАКТИКА, а не "абстрактные размышления", о "сферических конях в вакууме".

Т.е. на ПРАКТИКЕ всё выглядит так - "дублируемый" код - находится. Шаблонизируется. Генерируется. ОДИН в ОДИН как если бы он был бы написан "руками". Потом он какое-то время живёт. Потом - проводится РЕФАКТОРИНГ. Придумывается ЛУЧШЕЕ решение. Правятся шаблоны. и "дублируемый" код - "сворачивается".

Так было не раз. На ПРАКТИКЕ.

Так что "дублирование" кода - никто не "ПООЩРЯЕТ", мы с ним лишь МИРИМСЯ. На ВРЕМЯ.

Комментариев нет:

Отправить комментарий