Бірлік 8 / 12

Рефакторинг және техникалық қарызды басқару

Табыстар:

  • Рефакторингке дейін ағымдағы әрекетті түсіретін сынақ қауіпсіздік желісін орнату мүмкіндігі
  • AI-дан кішігірім, бір қадамдық, мінез-құлықты сақтайтын түрлендірулерді сұрау және әрбір қадамды растау мүмкіндігі
  • Бизнес контекстінде техникалық қарызды анықтау және басымдық беру мүмкіндігі

Рефакторинг – кодтың ішкі құрылымын оның сыртқы әрекетін өзгертпестен жақсарту: оны оқуға ыңғайлы, қарапайым және техникалық қызмет көрсетуге ыңғайлы ету. Техникалық қарыз, екінші жағынан, тез шешім табу үшін жасалған және уақыт өте келе «пайызбен» қайтарылған дизайн ымырасы — бүгін кескен әрбір бұрыш ертең баяулау немесе қате ретінде қайта оралады. Жасанды интеллект қайталанатын және механикалық рефакторинг тапсырмаларын жылдамдататын қуатты көмекші болып табылады; Бірақ рефакторингтің бір алтын ережесі бар және AI ғана оған кепілдік бере алмайды: мінез-құлық өзгермеуі керек.

Бұл бөлімде біз AI көмегімен қауіпсіз рефакторингті қалай жасау керектігін үйренеміз: шағын және қайтымды қадамдар, сынақтармен қорғау, кодтық иістерді анықтау және техникалық қарызға басымдық беру. Сыни нүкте мынада: мінез-құлықтың сақталғанын АИ сөзі емес, өткен сынақтар дәлелдейді.

Рефакторингтің алтын ережесі: мінез-құлық тұрақты болып қалады

Рефакторингті қауіпті ететін нәрсе - "мен жақсарып жатырмын" деп білмей әрекетті өзгерту. Шартты жеңілдету кезінде шеткі регистрді түсіру, циклды түрлендіру кезінде тәртіпті бұзу, функцияны бөлу кезінде жанама әсерді жоғалту - барлығы «таза көрінетін», бірақ бұзылған кодты шығарады.

Сондықтан тестілеу рефакторингтің міндетті шарты болып табылады: өзгертуден бұрын сізде бар мінез-құлықты қамтитын сынақтар болуы керек. Бұл сынақтар «қауіпсіздік желісі» болып табылады; Рефакторинг кезінде кездейсоқ бір нәрсені бұзсаңыз, олар бұзып, сізге ескертеді. Егер сізде сынақтар болмаса, алдымен бар мінез-құлықты түзететін сынақтарды жазыңыз (5-бөлімде білгеніміздей) — дәл осы жерден AI секіреді.

Абайлаңыз: AI көмегімен сынақ желісінсіз рефакторинг қателердің ең жасырын көздерінің бірі болып табылады. «Мен мінез-құлықты сақтадым» деп айту оңай; Дәлел сол сынақтар өзгеріске дейін де, кейін де өтеді.

Қадамдық: қауіпсіз рефакторинг ағыны

  1. Қауіпсіздік торын орнатыңыз. Сіз қайта өңдейтін кодтың ағымдағы әрекетін түсіретін сынақтар болсын; Егер жоқ болса, алдымен оларды жазып алыңыз (және олардың өтіп жатқанын қараңыз).
  2. Иісті атаңыз. Сіз нені жақсартасыз және неге? «Бұл функция 3 әрекетті орындайды», «бір логика 4 жерде қайталанады», «аттар жаңылыстырады».
  3. Шағын, бір қадамдық қадамдарды сұраңыз. Бүкіл файлды қайта жазуды емес, AI-дан бір түрлендіруді сұраңыз (мысалы, «бұл функцияны екіге бөліңіз»).
  4. Тесттерді орындаңыз. Әр қадамнан кейін. Жасыл болса, жалғастыр, қызыл болса, қайтар.
  5. Айырмашылықты оқу. Өзгеріс шынымен де мінез-құлықты сақтайтынын жол-жол растаңыз; AI «жай құрылым» деп айтқан кезде логикалық ауытқу болуы мүмкін.
  6. Кішкене бөліктерге біріктіріңіз. Үлкен бір реттік рефакторингтік PR тәуекелді және қайта қаралмайтын болып табылады.

Үш шағын корпус

1-жағдай — 220 жолдық функция қауіпсіз бөлінген. Бір командада 220 жолдық тапсырысты өңдеу функциясы болды. Ағымдағы мінез-құлықты анықтайтын алғашқы 14 сынақ жазылды (AI көмегімен), олардың барлығы өтті. Содан кейін функция AI арқылы қадам бойынша 5 кіші функцияға бөлінді; Әр қадамнан кейін сынақтар жүргізілді. Бір қадамда екі сынақ сынды - AI шеткі жағдайда қайтаруды өткізіп алды. Сынақтар мұны бірден анықтады және түзетеді. Желі болмаса, қате өндіріске дейін баруы мүмкін еді.

2-жағдай – сынақ желісі жоқ апат. Басқа әзірлеуші ​​AI сынақтары жоқ күнді есептеу модулін «тазалады». Код жақсырақ көрінді, бірақ ол кібісе жылды қате есептеді; Қате екі аптадан кейін тұтынушылардың шағымымен шықты. Жоғалту рефакторингтен үнемделген уақыттан әлдеқайда асып түсті. Сабақ: тестілеусіз рефакторинг - құмар ойын.

3-жағдай — Техникалық берешектің басымдығы. Бір команда AI-ға 30 немесе одан да көп «жақсартылатын» ұпай берді және әрқайсысы «өзгеріс жиілігі × тәуекел × күш» осінде ұпай жинады. Алынған кестеде сирек түртілетін ұсқынсыз модуль шын мәнінде төмен басымдылыққа ие болды, ал жиі өзгеретін күрделілігі орташа модуль жоғары басымдыққа ие болды. Команда күш-қуатын дұрыс жерге бағыттады.

Көшірілетін төрт үлгі

Код иісін анықтау және басымдық беру:

Осы кодтағы рефакторинг кандидатының «иістерін» тізімдеңіз: ұзақ функция, қайталау (DRYViolation), жаңылыстыратын атау, терең кірістірілген жағдай, жасырын жанама әсер, сиқырлы сан. Әрқайсысы үшін: орналасқан жері, мәселенің себебі, ұсынылған шағын қадам, болжамды тәуекел (төмен/орта/жоғары). Кодты әлі ӨЗГЕРТПЕҢІЗ, жай ғана жоспарлаңыз.{{code}}

Бір сатылы, мінез-құлықты сақтайтын түрлендіру:

ТЕК мына әрекетті орындаңыз: {{бір түрлендіру, мысалы. Бұл функцияны 3 кішірек аталған функцияға бөліңіз}}. Көрінетін әрекетті, қолтаңбаны және қайтару мәндерін ӨЗГЕРТІҢІЗ. Неліктен өзгерткеніңіздің бәрі әрекетті сақтайтынын 1 сөйлеммен жазыңыз.{{code}}

Рефактор алдындағы қауіпсіздік торы (сипаттау сынағы):

Осы функцияның АҒЫМДАУ әрекетін түсіретін сынақтарды жазыңыз (дұрыс немесе жоқ); мақсаты - рефакторинг кезінде мінез-құлық өзгергенін анықтау. Типтік + жиек жазбаларын қосыңыз. Функцияның ағымдағы шығысына негізделген күтулерді жазыңыз.{{функция}}

Техникалық берешекті есепке алу (артта қалу):

Келесі иістердің тізімін басымдық кестесіне салыңыз: зат, әсер ету аймағы, өзгеру жиілігі (менің білімім: {{...}}), тәуекел, болжалды күш, ұсынылған басымдық. Жоғары әсер + аз күш-жігерді жоғарғы жағына қойыңыз. {{smell_list}}

Әлсіз шақыру / Күшті шақыру

Әлсіз: «Бұл кодты тазалап, оны жақсартыңыз».
Күшті: "Сыртқы мінез-құлқы мен қолтаңбасын өзгертпестен, осы 90 жолды функцияны бір жауапкершілікпен 3 кішірек функцияға бөліңіз. Жанама әсерлерді (ДБ жазады) ағымдағы ретпен сақтаңыз. Менде сынақтар бар, мінез-құлық өзгеріссіз қалуы керек. Айырмашылықты беріңіз және әрбір бөлудің неге мінез-құлықты сақтайтынын бір сөйлеммен түсіндіріңіз. [код]"

Күшті нұсқасы; Ол бір ғана спецификалық түрлендіруді талап етеді, мінез-құлық пен қол қоюға шектеу қояды және негіздеуді талап етеді. «Жақсы істеу» сияқты анық емес сұраулар бақыланбайтын және қауіпті өзгерістерге әкеледі.

Рефакторинг түрі

AI сенімділігі

Алғы шарт

атын өзгерту

жоғары

Ауқым дұрыс па?

Функцияның бөлінуі

орташа-жоғары

Testnet міндетті болып табылады

Қайталауды бөлісу

орташа

Мінез-құлық айырмашылығы жасырын болуы мүмкін

Алгоритмді/құрылымды өзгерту

төмен

Кең ауқымды тестілеу + адамның валидациясы

Архитектуралық қайта құру

төмен

Адам басқаратын, AI қолдайтын

Техникалық қарызды басқару, оны қалпына келтіру емес

Техникалық қарыздың бәрі жаман емес; Кейде саналы қарыз алу (жеткізуді қанағаттандыру үшін) дұрыс шешім болып табылады. Мақсат – қарызды жою емес, оны көрінетін және басқарылатын ету. AI қарызды анықтауда және басымдық беруде жылдам, бірақ «қай қарызды төлеу керек және қайсысынан бас тарту керек» деген шешім бизнес контекстін талап етеді: бұл модуль қаншалықты жиі өзгереді, ол қанша адамға әсер етеді, тәуекел қандай? Бұл шешімді кодтық базаны және өнімді білетін топ қабылдайды; AI жай ғана опцияларды түсіндіреді.

Кеңес: Рефакторингтік PR-ды мінез-құлықтың өзгеруін қамтитын PR-дан бөлек ұстаңыз. «Бұл PR - бұл жай ғана рефакторинг, мінез-құлық бірдей» деп айта алу тергеуді жеңілдетеді және мәселе туындаса, себебін жылдам қысқартуға мүмкіндік береді.

Жалпы қателер

  • Тест желісінсіз рефакторинг. Сіз мінез-құлық сақталғанын дәлелдейтін ештеңесіз қалдыңыз.
  • Бұл «барлық файлды тазалау» дегенді білдіреді. Үлкен, бақыланбайтын өзгерістер қатені жасырады және оларды тексеру мүмкін емес.
  • Айырмашылықты оқымай-ақ қабылдау. AI «жай құрылым» деп айтқан кезде кейбір логиканы жоғалтқан болуы мүмкін.
  • Рефакторингті мінез-құлықтың өзгеруімен шатастыру. Екеуін бірдей PR-да орындау негізгі себептерді бақылауды мүмкін емес етеді.
  • Әрбір иісті түзетуге тырысады. Сирек өзгеретін ұсқынсыз код көбінесе төмен басымдылыққа ие; Энергияны жиі өзгеретін жерге бөліңіз.

Қысқаша айтқанда

Рефакторингтің жалғыз ережесі - бұл мінез-құлық тұрақты болып қалады және оның дәлелі - сынақтар. AI код иістерін, бір қадамдық түрлендірулерді анықтауда және техникалық қарызға басымдық беруде күшті; бірақ қауіпсіздік желісін орнату, сынақтарды орындау және әр қадамнан кейін айырмашылықты оқу керек. Шағын, қайтымды қадамдар жасаңыз; рефакторингті мінез-құлықтың өзгеруінен ажырату; және бизнес контекстін білетін команда қандай қарызды төлеу керектігін шешсін.

Қолданбалы тапсырма

Код базасынан сізге ұзақ немесе күрделі болып көрінетін функцияны таңдаңыз. Алдымен оның ағымдағы әрекетін "қауіпсіздік желісі" үлгісімен түсіретін сынақтарды басып шығарыңыз және олардың барлығынан өткенін тексеріңіз. Содан кейін функцияны «бір қадамдық, мінез-құлықты сақтайтын түрлендіру» үлгісімен бір жолмен рефакторациялаңыз (мысалы, екіге бөлу) және сынақтарды қайта іске қосыңыз. Егер сынақ үзілсе, себебін анықтаңыз; Егер ол мүлде бұзылмаса, мінез-құлықтың шынымен сақталғанын растау үшін айырмашылықты жол бойынша оқыңыз.

бақылау парағы

  • [ ] Мен рефакторинг мінез-құлықты өзгертпеуі керек екенін білемін және оны дәлелдейтін сынақтар бар.
  • [ ] Мен рефактордан бұрын ағымдағы әрекетті ұстайтын қауіпсіздік желісін орнатып жатырмын.
  • [ ] Мен AI-дан үлкен бір реттік емес, кішігірім, бір қадамдық өзгерістерді қалаймын.
  • [ ] Әр қадамнан кейін мен сынақтарды орындап, айырмашылықты оқимын.
  • [ ] Мен PR-ды мінез-құлықты өзгерту пиарынан бөлек рефакторингті жалғастырамын.
  • [ ] Мен бизнес контекстімен техникалық қарызға басымдық беремін, соқыр түрде нөлге жетуге тырыспаймын.