За этим громким названием скрывается всего лишь один трюк. Он применим только к одной очень конкретной ситуации, которая, как мне кажется, не совсем подходит под определения "рефакторинга".
Но раз уж я написал заголовок, я, пожалуй, всё же отвечу на него.
Так как же провести рефакторинг кода и не облажаться? Ответ: никак.
Но кое-от-чего защититься можно.
Итак, пусть у нас в программе есть об'ект A. Нам надо добавить новый об'ект -- A2, того же класса. Из текущих ситуаций использования A половина должны остаться за ним, а половина -- перейти к A2 (правила определения, кто чем будет заниматься, известны заранее). Ситуации встречаются по всей программе. Об'ект практически глобальный. Как же технически провести эту работу?
Самое очевидное решение -- пролистать все употребления A и часть перевести на A2 (предварительно создав его). Но так есть риск пропустить что-нибудь, даже если использовать глобальный поиск.
Я предлагаю способ, благодаря которому пропустить ни одного употребления просто не выйдет. Об'явление об'екта A надо исключить из программы! Либо удалить A, а вместо него создать массив A0[2], либо переименовать A в определении (и только там!) в A1.
К чему это приведёт? Программа не будет компилироваться из-за употребления несуществующих переменных. Придётся исправлять ошибки...
Хотя и тут есть возможность сфейлиться. В какой-нибудь функции может быть одноимённый локальный об'ект того же класса. Он раньше перекрывался A, а теперь -- нет. В этом случае ошибки не будет.
Но раз уж я написал заголовок, я, пожалуй, всё же отвечу на него.
Так как же провести рефакторинг кода и не облажаться? Ответ: никак.
Но кое-от-чего защититься можно.
Итак, пусть у нас в программе есть об'ект A. Нам надо добавить новый об'ект -- A2, того же класса. Из текущих ситуаций использования A половина должны остаться за ним, а половина -- перейти к A2 (правила определения, кто чем будет заниматься, известны заранее). Ситуации встречаются по всей программе. Об'ект практически глобальный. Как же технически провести эту работу?
Самое очевидное решение -- пролистать все употребления A и часть перевести на A2 (предварительно создав его). Но так есть риск пропустить что-нибудь, даже если использовать глобальный поиск.
Я предлагаю способ, благодаря которому пропустить ни одного употребления просто не выйдет. Об'явление об'екта A надо исключить из программы! Либо удалить A, а вместо него создать массив A0[2], либо переименовать A в определении (и только там!) в A1.
К чему это приведёт? Программа не будет компилироваться из-за употребления несуществующих переменных. Придётся исправлять ошибки...
Хотя и тут есть возможность сфейлиться. В какой-нибудь функции может быть одноимённый локальный об'ект того же класса. Он раньше перекрывался A, а теперь -- нет. В этом случае ошибки не будет.
13.04.2017 в 19:24
13.04.2017 в 20:11
xDDDD
13.04.2017 в 21:35
14.04.2017 в 11:34
1. в js слабая типизация, т.е. замена числа 34 на строку "34" в большинстве случаев сломает жизнь лишь в самом непредсказуемом месте или даже не сломает,т.к. в определенных случаях строка преобразуется к числу.
2. js очень раздолбайски относится к вызову функций. Если ему аргументов не доложить, то при вызове они примут значение undefined. Если наоборот - дать лишних, то ничего не произойдёт.
Таким образом единственный возможный путь - это обложить код вагоном тестов, да и то это не всегда прокатывает - мы очень обидно накололись с п. 2, т.к. у нас раньше функция вызывалась для трех аргументов, мы её переделали для двух - тесты прошли. Проблема в том, что семантика передаваемых параметров тоже изменилась - раньше это были id детали и id операции, а теперь это стало id комбинированной сущности - техкарты, в итоге код работал буквально чудом.
Всё усугубляется плохими библиотеками, которые это всё жрут, не давятся и выдают непредсказуемый выхлоп.
P. S. destroyallsoftware.com/talks/wat - бессмертный ролик про заботливо разложенные грабли в динамических языках.
14.04.2017 в 12:35
14.04.2017 в 22:37
14.04.2017 в 23:51
>>P. S. destroyallsoftware.com/talks/wat - бессмертный ролик про заботливо разложенные грабли в динамических языках.
Хорошо, но мало. Напомнило статью "сидит, стоит или лежит" -- www.softmixer.com/2012/07/blog-post_2866.html (одна из версий) .
Crawling Chaos, а в чём?
15.04.2017 в 00:55
В питоне и руби намного меньше подобных проблем. Отчасти благодаря строгости, отчасти от того, что языки и их библиотека не проектировались на коленке за пару месяцев из говна и палок.