Ознакомьтесь с нашей политикой обработки персональных данных
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
IT'S RAINING TUNA!!!
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
IT'S RAINING TUNA!!!
Не знаю, не знаю, по мне так динамическая типизация не такая уж и проблемная штука, и проблема пых и яваскриптов не в этом)

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

главная