23:58 

Как провести рефакторинг кода и не облажаться?

zHz00
За этим громким названием скрывается всего лишь один трюк. Он применим только к одной очень конкретной ситуации, которая, как мне кажется, не совсем подходит под определения "рефакторинга".

Но раз уж я написал заголовок, я, пожалуй, всё же отвечу на него.

Так как же провести рефакторинг кода и не облажаться? Ответ: никак.

Но кое-от-чего защититься можно.

Итак, пусть у нас в программе есть об'ект A. Нам надо добавить новый об'ект -- A2, того же класса. Из текущих ситуаций использования A половина должны остаться за ним, а половина -- перейти к A2 (правила определения, кто чем будет заниматься, известны заранее). Ситуации встречаются по всей программе. Об'ект практически глобальный. Как же технически провести эту работу?

Самое очевидное решение -- пролистать все употребления A и часть перевести на A2 (предварительно создав его). Но так есть риск пропустить что-нибудь, даже если использовать глобальный поиск.

Я предлагаю способ, благодаря которому пропустить ни одного употребления просто не выйдет. Об'явление об'екта A надо исключить из программы! Либо удалить A, а вместо него создать массив A0[2], либо переименовать A в определении (и только там!) в A1.

К чему это приведёт? Программа не будет компилироваться из-за употребления несуществующих переменных. Придётся исправлять ошибки...

Хотя и тут есть возможность сфейлиться. В какой-нибудь функции может быть одноимённый локальный об'ект того же класса. Он раньше перекрывался A, а теперь -- нет. В этом случае ошибки не будет.

@темы: Программирование, Лайфхак, Говнокод

URL
Комментарии
2017-04-13 в 19:24 

korrshun
дрыхнущий
а теперь добро пожаловать в мой js hell.

2017-04-13 в 20:11 

Crawling Chaos
chi yo ta ni ke ra ha to ho ra su te no ha te ki ra to na ri ha shi te
js hell
xDDDD

2017-04-13 в 21:35 

zHz00
korrshun, поясни. На ЯваСкрипт почти не писал.

URL
2017-04-14 в 11:34 

korrshun
дрыхнущий
0. js динамический язык и всё проверяет только в рантайме
1. в js слабая типизация, т.е. замена числа 34 на строку "34" в большинстве случаев сломает жизнь лишь в самом непредсказуемом месте или даже не сломает,т.к. в определенных случаях строка преобразуется к числу.
2. js очень раздолбайски относится к вызову функций. Если ему аргументов не доложить, то при вызове они примут значение undefined. Если наоборот - дать лишних, то ничего не произойдёт.

Таким образом единственный возможный путь - это обложить код вагоном тестов, да и то это не всегда прокатывает - мы очень обидно накололись с п. 2, т.к. у нас раньше функция вызывалась для трех аргументов, мы её переделали для двух - тесты прошли. Проблема в том, что семантика передаваемых параметров тоже изменилась - раньше это были id детали и id операции, а теперь это стало id комбинированной сущности - техкарты, в итоге код работал буквально чудом.

Всё усугубляется плохими библиотеками, которые это всё жрут, не давятся и выдают непредсказуемый выхлоп.

P. S. destroyallsoftware.com/talks/wat - бессмертный ролик про заботливо разложенные грабли в динамических языках.

2017-04-14 в 12:35 

zHz00
А, в пхп похожая петрушка. Да, после таких историй возникают сомнения в том, что Си -- язык, где очень легко выстрелить себе в ногу. Есть языки, где это сделать гораздо проще.

URL
2017-04-14 в 22:37 

Crawling Chaos
chi yo ta ni ke ra ha to ho ra su te no ha te ki ra to na ri ha shi te
Не знаю, не знаю, по мне так динамическая типизация не такая уж и проблемная штука, и проблема пых и яваскриптов не в этом)

2017-04-14 в 23:51 

zHz00
korrshun,
>>P. S. destroyallsoftware.com/talks/wat - бессмертный ролик про заботливо разложенные грабли в динамических языках.

Хорошо, но мало. Напомнило статью "сидит, стоит или лежит" -- www.softmixer.com/2012/07/blog-post_2866.html (одна из версий) .

Crawling Chaos, а в чём?

URL
2017-04-15 в 00:55 

korrshun
дрыхнущий
zHz00, в первую очередь отвратительно проработанные автоматические преобразования типов и совершенно убогая по возможностям, плохо структурированная стандартная библиотека, из-за которой есть множество проблем в сторонних библиотеках.
В питоне и руби намного меньше подобных проблем. Отчасти благодаря строгости, отчасти от того, что языки и их библиотека не проектировались на коленке за пару месяцев из говна и палок.

     

Untitled

главная