Extract method — mavjud method ichidagi yaxlit kod bo‘lagini yangi, nomlangan methodga ko‘chirish refactoring usulidir. Maqsad kodning observable xatti-harakatini o‘zgartirmasdan niyatni aniqroq ifodalash, murakkablikni bo‘lish yoki takrorlanadigan mantiq uchun chegara yaratishdir. Yangi method nomi implementation qadamini emas, biznes yoki texnik maqsadni tushuntirishi kerak.
Nomzodni tanlash
Izoh bilan ajratilgan blok ko‘pincha extraction uchun nomzod: izohdagi ma’no method nomiga aylanishi mumkin. Turli abstraction darajalari aralashgan functionda parsing, validation va persistence alohida methodlarga ajratiladi. Error handling yoki loop tanasi ham mustaqil invariantga ega bo‘lsa chiqarilishi mumkin.
Blokning inputlari tashqaridan o‘qiladigan local qiymatlar, outputlari esa keyingi kodga ta’sir qiladigan natijalardir. Juda ko‘p parameter va return kerak bo‘lsa asl methoddagi data grouping yoki responsibility muammosi mavjud. Parameter object yoki kichik domain type extractionni soddalashtirishi mumkin.
Amalga oshirish
Avval mavjud testlar yashil ekanligi tasdiqlanadi. Kod bo‘lagi yangi methodga ko‘chiriladi, local dependencylar parameterga uzatiladi va kerakli natija qaytariladi. Original joy method call bilan almashtiriladi. Har qadamdan keyin test va static check bajariladi.
Bir nechta qiymat qaytarish uchun tuple ishlatish mumkin, ammo nomlangan result type ma’noni yaxshiroq ifodalaydi. Mutable obyekt orqali yashirin output berish side effectni ko‘paytiradi. Exception, early return, break yoki continue mavjud blok extractionda control flow semantikasini ehtiyotkor ko‘rib chiqishni talab qiladi.
Sifat mezonlari
Yaxshi extracted method bitta darajadagi ishni bajaradi va nomi call site’ni gap kabi o‘qitadi. processData yoki doStuff eski murakkablikni faqat yashiradi. Method juda kichik bo‘lishi mumkin, agar nom muhim domen qarorini ifodalasa; oddiy operatorni ma’nosiz wrapperga olish shart emas.
Private method class invariantiga yaqin qoladi. Agar yangi method faqat boshqa class ma’lumotiga ishlasa Move Method yoki yangi collaborator kerak bo‘lishi mumkin. Extraction designni ko‘rish vositasi: ko‘p parameter, global state yoki private fieldga keng bog‘liqlik keyingi refactoring yo‘lini ko‘rsatadi.
Test va performance
Refactoring behaviorni o‘zgartirmasligi sabab oldingi black-box testlar asosiy himoya. Yangi method murakkab pure logicni ajratsa unit test qo‘shish osonlashadi, ammo private implementationni haddan tashqari testga bog‘lash kelajak refactoringni qiyinlashtiradi.
Method call xarajati odatda readabilitydan kichik, optimizer hot kichik methodni inline qilishi mumkin. Performance-sensitive loopda profiler va benchmark qaror beradi. Extraction allocation, locking yoki exception boundaryni bilmasdan o‘zgartirmaydi. Commit faqat mexanik refactoringni saqlasa code review xatti-harakat o‘zgarmaganini aniqroq tekshiradi.
Asinxron kodni ajratish
Async function ichidan blok chiqarilganda cancellation, timeout va context propagation yangi method contractiga kiradi. Faqat async keywordni ko‘chirish yetarli emas; qaysi bosqich side effect qilgani va retry xavfsizligi saqlanadi. Transaction ichidagi database call alohida methodga o‘tsa transaction context yashirin global emas, aniq parameter yoki unit-of-work orqali uzatiladi. Tracing span yangi method chegarasiga avtomatik ko‘payib shovqin qilmasligi kerak. Pure transformatsiya I/O’dan ajratilsa test va retry soddalashadi. Biroq remote callni “oddiy method” ortiga yashirish latency hamda failure semantikasini call site’dan yo‘qotmasligi kerak.
Yangi method nomi domen lug‘atiga mos bo‘lsa keyingi developer uning ichini ochmasdan niyatni anglaydi.
Bog‘liq tushunchalar
Refactoring, Code smell, Cohesion, Single responsibility, Move method, Inline method, Unit testing