JavaRush /Java blogi /Random-UZ /Java-da refaktoring qanday ishlaydi

Java-da refaktoring qanday ishlaydi

Guruhda nashr etilgan
Dasturlashni o'rganishda kod yozishga ko'p vaqt sarflanadi. Ko'pgina boshlang'ich ishlab chiquvchilar bu ularning kelajakdagi faoliyati deb hisoblashadi. Bu qisman to'g'ri, lekin dasturchining vazifalari kodni saqlash va qayta ishlashni ham o'z ichiga oladi. Bugun biz refaktoring haqida gaplashamiz. Java-da refaktoring qanday ishlaydi - 1

JavaRush kursida refaktoring

JavaRush kursi ikki marta refaktoring mavzusini qamrab oladi: Katta vazifa tufayli amalda haqiqiy refaktoring bilan tanishish imkoniyati mavjud va IDEA-da refaktoring bo'yicha ma'ruza hayotni nihoyatda osonlashtiradigan avtomatik vositalarni tushunishga yordam beradi.

Refaktoring nima?

Bu kodning funksionalligini o'zgartirmasdan tuzilishini o'zgartirish. Masalan, 2 ta raqamni solishtiradigan va birinchisi kattaroq bo'lsa rost , aks holda noto'g'ri qiymatini qaytaradigan usul mavjud :
public boolean max(int a, int b) {
    if(a > b) {
        return true;
    } else if(a == b) {
        return false;
    } else {
        return false;
    }
}
Natija juda og'ir kod edi. Hatto yangi boshlanuvchilar ham kamdan-kam hollarda bunday narsalarni yozadilar, ammo bunday xavf mavjud. if-elseAgar siz usulni 6 qatorga qisqaroq yozishingiz mumkin bo'lsa, nima uchun bu erda blok bor ko'rinadi :
public boolean max(int a, int b) {
     return a>b;
}
Endi bu usul oddiy va oqlangan ko'rinadi, garchi u yuqoridagi misol bilan bir xil ishni bajaradi. Refaktoring shunday ishlaydi: u kodning tuzilishini uning mohiyatiga ta'sir qilmasdan o'zgartiradi. Ko'p refaktoring usullari va usullari mavjud, biz ularni batafsil ko'rib chiqamiz.

Nima uchun refaktoring kerak?

Buning bir qancha sabablari bor. Masalan, kodning soddaligi va ixchamligiga intilish. Ushbu nazariya tarafdorlari, kodni tushunish uchun o'nlab qator sharhlar kerak bo'lsa ham, iloji boricha ixcham bo'lishi kerak, deb hisoblashadi. Boshqa ishlab chiquvchilar kodni minimal miqdordagi sharhlar bilan tushunarli bo'lishi uchun qayta tiklash kerak deb hisoblashadi. Har bir jamoa o'z pozitsiyasini tanlaydi, lekin shuni yodda tutishimiz kerakki, refaktoring qisqartirish emas . Uning asosiy maqsadi kod tuzilishini takomillashtirishdir. Ushbu global maqsadga bir nechta maqsadlarni kiritish mumkin:
  1. Refaktoring boshqa ishlab chiquvchi tomonidan yozilgan kodni tushunishni yaxshilaydi;
  2. Xatolarni topish va tuzatishga yordam beradi;
  3. Dasturiy ta'minotni ishlab chiqish tezligini oshirish imkonini beradi;
  4. Umuman olganda, dasturiy ta'minot tarkibini yaxshilaydi.
Agar refaktoring uzoq vaqt davomida amalga oshirilmasa, ish to'liq to'xtatilgunga qadar rivojlanishda qiyinchiliklar paydo bo'lishi mumkin.

"Kod hidlari"

Agar kod qayta ishlashni talab qilsa, ular "hid" deyishadi. Albatta, tom ma'noda emas, lekin bunday kod haqiqatan ham juda yaxshi ko'rinmaydi. Quyida biz dastlabki bosqich uchun asosiy refaktoring usullarini ko'rib chiqamiz.

Keraksiz katta elementlar

Og'ir sinflar va usullar mavjud bo'lib, ularning kattaligi tufayli ular bilan samarali ishlash mumkin emas.

Katta sinf

Bunday sinfda juda ko'p sonli kod satrlari va juda ko'p turli xil usullar mavjud. Odatda ishlab chiquvchiga yangisini yaratishdan ko'ra mavjud sinfga xususiyat qo'shish osonroq, shuning uchun u o'sib boradi. Qoida tariqasida, ushbu sinfning funksionalligi haddan tashqari yuklangan. Bunday holda, funksionallikning bir qismini alohida sinfga ajratish yordam beradi. Bu haqda biz refaktoring texnikasi bo'limida batafsilroq gaplashamiz.

Katta usul

Ushbu "hid" ishlab chiquvchi usulga yangi funksiya qo'shganda paydo bo'ladi. “Agar men bu yerga yozishim mumkin bo‘lsa, nega men parametrlarni tekshirishni alohida usulga qo‘yishim kerak?”, “Nima uchun massivdagi maksimal elementni topish usulini ajratish kerak, keling, uni shu yerda qoldiraylik. Shunday qilib, kod aniqroq bo'ladi" va boshqa noto'g'ri tushunchalar. Katta usulni qayta tiklash uchun ikkita qoida mavjud:
  1. Agar usulni yozishda siz kodga izoh qo'shmoqchi bo'lsangiz, ushbu funksiyani alohida usulga ajratishingiz kerak;
  2. Agar usul 10-15 qatordan ortiq kodni talab qilsa, siz u bajaradigan vazifalar va pastki vazifalarni aniqlab olishingiz va kichik vazifalarni alohida usulga ajratishga harakat qilishingiz kerak.
Katta usulni yo'q qilishning bir necha yo'li:
  • Usul funksionalligining bir qismini alohida usulga ajratish;
  • Agar mahalliy o'zgaruvchilar funksiyaning bir qismini ajratib olishga imkon bermasa, siz butun ob'ektni boshqa usulga o'tkazishingiz mumkin.

Ko'p ibtidoiy ma'lumotlar turlaridan foydalanish

Odatda, bu muammo sinfdagi ma'lumotlarni saqlash uchun maydonlar soni vaqt o'tishi bilan o'sib borayotganida yuzaga keladi. Misol uchun, agar siz ma'lumotlarni saqlash uchun kichik ob'ektlar o'rniga ibtidoiy turlardan foydalansangiz (valyuta, sana, telefon raqamlari va boshqalar) yoki har qanday ma'lumotni kodlash uchun doimiylar. Bu holatda yaxshi amaliyot maydonlarni mantiqiy guruhlash va ularni alohida sinfga joylashtirish (sinfni tanlash) bo'ladi. Bundan tashqari, sinfga ushbu ma'lumotlarni qayta ishlash usullarini kiritishingiz mumkin.

Variantlarning uzoq ro'yxati

Juda keng tarqalgan xato, ayniqsa katta usul bilan birgalikda. Odatda, agar usulning funksionalligi haddan tashqari yuklangan bo'lsa yoki usul bir nechta algoritmlarni birlashtirganda paydo bo'ladi. Parametrlarning uzun ro'yxatini tushunish juda qiyin va bunday usullardan foydalanish noqulay. Shuning uchun, butun ob'ektni o'tkazish yaxshiroqdir. Agar ob'ektda etarli ma'lumotlar bo'lmasa, u mantiqiy bog'liq ma'lumotlarni qayta ishlash uchun umumiyroq ob'ektdan foydalanishga yoki usulning funksionalligini ajratishga arziydi.

Ma'lumotlar guruhlari

Mantiqiy bog'liq ma'lumotlar guruhlari ko'pincha kodda paydo bo'ladi. Masalan, ma'lumotlar bazasiga ulanish parametrlari (URL, foydalanuvchi nomi, parol, sxema nomi va boshqalar). Agar elementlar ro'yxatidan bitta maydonni olib tashlashning iloji bo'lmasa, u holda ro'yxat alohida sinfga (sinf tanlash) joylashtirilishi kerak bo'lgan ma'lumotlar guruhidir.

OOP kontseptsiyasini buzadigan echimlar

Ushbu turdagi "hid" ishlab chiquvchi OOP dizaynini buzganida paydo bo'ladi. Agar u ushbu paradigmaning imkoniyatlarini to'liq tushunmasa, ulardan to'liq yoki noto'g'ri foydalansa, bu sodir bo'ladi.

Merosdan voz kechish

Agar kichik sinf ota-sinf funktsiyalarining minimal qismidan foydalansa, u noto'g'ri ierarxiya kabi hidlanadi. Odatda, bu holda, keraksiz usullar shunchaki bekor qilinmaydi yoki istisnolar tashlanadi. Agar sinf boshqasidan meros bo'lib qolgan bo'lsa, bu uning funksionalligidan deyarli to'liq foydalanishni anglatadi. To'g'ri ierarxiyaga misol: Java-da refaktoring qanday ishlaydi - 2 noto'g'ri ierarxiyaga misol: Java-da refaktoring qanday ishlaydi - 3

almashtirish bayonoti

Operator bilan nima noto'g'ri bo'lishi mumkin switch? Uning dizayni juda murakkab bo'lsa, bu yomon. Bu, shuningdek, ko'plab ichki bloklarni o'z ichiga oladi if.

Turli interfeyslarga ega muqobil sinflar

Bir nechta sinflar aslida bir xil ishni bajaradi, lekin ularning usullari boshqacha nomlanadi.

Vaqtinchalik maydon

Agar sinfda ob'ektga faqat vaqti-vaqti bilan kerak bo'lgan vaqtinchalik maydon mavjud bo'lsa, u qiymatlar bilan to'ldirilgan bo'lsa va qolgan vaqt bo'sh bo'lsa yoki Xudo saqlasin, nullu holda kod "hidlaydi" va bunday dizayn shubhali. qaror.

O'zgartirishni qiyinlashtiradigan hidlar

Bu "hidlar" jiddiyroq. Qolganlari asosan kodni tushunishga putur etkazadi, bu esa uni o'zgartirishga imkon bermaydi. Har qanday xususiyatni joriy qilganda, ishlab chiquvchilarning yarmi ishdan chiqadi, yarmi esa aqldan ozadi.

Parallel meros ierarxiyasi

Sinfning pastki sinfini yaratganingizda, boshqa sinf uchun boshqa kichik sinf yaratishingiz kerak.

Yagona bog'liqlik taqsimoti

Har qanday modifikatsiyani amalga oshirayotganda siz ushbu sinfning barcha bog'liqliklarini (foydalanishlarini) qidirib topishingiz va ko'plab kichik o'zgarishlar qilishingiz kerak. Bitta o'zgarish - ko'p sinflarda tahrirlar.

Murakkab modifikatsiya daraxti

Bu hid avvalgisiga qarama-qarshidir: o'zgarishlar bir xil sinfning ko'p sonli usullariga ta'sir qiladi. Qoidaga ko'ra, bunday koddagi qaramlik kaskaddir: bitta usulni o'zgartirgandan so'ng, siz boshqasida biror narsani tuzatishingiz kerak, keyin uchinchisida va hokazo. Bir sinf - ko'p o'zgarishlar.

"Axlat hidlaydi"

Bosh og'rig'iga sabab bo'lgan juda yoqimsiz hidlar toifasi. Foydasiz, keraksiz, eski kod. Yaxshiyamki, zamonaviy IDE va ​​linterlar bunday hidlar haqida ogohlantirishni o'rgandilar.

Usuldagi ko'plab sharhlar

Usul deyarli har bir satrda juda ko'p izohli sharhlarga ega. Bu odatda murakkab algoritm bilan bog'liq, shuning uchun kodni bir nechta kichikroq usullarga bo'lish va ularga mazmunli nom berish yaxshiroqdir.

Kodni takrorlash

Turli sinflar yoki usullar bir xil kod bloklaridan foydalanadi.

Dangasa sinf

Sinf juda kam funksionallikni oladi, garchi uning ko'p qismi rejalashtirilgan bo'lsa ham.

Ishlatilmagan kod

Sinf, usul yoki o'zgaruvchi kodda ishlatilmaydi va "o'lik vazn" dir.

Haddan tashqari ulanish

Ushbu toifadagi hidlar koddagi ko'p sonli keraksiz ulanishlar bilan tavsiflanadi.

Uchinchi tomon usullari

Usul boshqa ob'ektning ma'lumotlaridan o'z ma'lumotlaridan ko'ra ko'proq foydalanadi.

Noto'g'ri yaqinlik

Sinf boshqa sinfning xizmat sohalari va usullaridan foydalanadi.

Uzoq sinf qo'ng'iroqlari

Bir sinf boshqasini chaqiradi, u uchinchidan ma'lumotlarni, to'rtinchidan va hokazolarni so'raydi. Bunday uzun qo'ng'iroqlar zanjiri hozirgi sinf tuzilishiga yuqori darajada bog'liqlikni anglatadi.

Sinf-topshiriq-diler

Sinf faqat vazifani boshqa sinfga o'tkazish uchun kerak. Ehtimol, uni olib tashlash kerakmi?

Refaktoring texnikasi

Quyida tavsiflangan kod hidlarini yo'q qilishga yordam beradigan dastlabki refaktoring usullari haqida gapiramiz.

Sinf tanlash

Sinf juda ko'p funktsiyalarni bajaradi; ularning ba'zilarini boshqa sinfga ko'chirish kerak. Masalan, Humanturar joy manzili va to'liq manzilni taqdim etadigan usulni o'z ichiga olgan sinf mavjud:
class Human {
   private String name;
   private String age;
   private String country;
   private String city;
   private String street;
   private String house;
   private String quarter;

   public String getFullAddress() {
       StringBuilder result = new StringBuilder();
       return result
                       .append(country)
                       .append(", ")
                       .append(city)
                       .append(", ")
                       .append(street)
                       .append(", ")
                       .append(house)
                       .append(" ")
                       .append(quarter).toString();
   }
}
Manzil ma'lumotlari va usulini (ma'lumotlarni qayta ishlash harakati) alohida sinfga joylashtirish yaxshi bo'lar edi:
class Human {
   private String name;
   private String age;
   private Address address;

   private String getFullAddress() {
       return address.getFullAddress();
   }
}
class Address {
   private String country;
   private String city;
   private String street;
   private String house;
   private String quarter;

   public String getFullAddress() {
       StringBuilder result = new StringBuilder();
       return result
                       .append(country)
                       .append(", ")
                       .append(city)
                       .append(", ")
                       .append(street)
                       .append(", ")
                       .append(house)
                       .append(" ")
                       .append(quarter).toString();
   }
}

Usul tanlash

Usuldagi har qanday funksionallikni guruhlash mumkin bo'lsa, uni alohida usulga joylashtirish kerak. Masalan, kvadrat tenglamaning ildizlarini hisoblash usuli:
public void calcQuadraticEq(double a, double b, double c) {
    double D = b * b - 4 * a * c;
    if (D > 0) {
        double x1, x2;
        x1 = (-b - Math.sqrt(D)) / (2 * a);
        x2 = (-b + Math.sqrt(D)) / (2 * a);
        System.out.println("x1 = " + x1 + ", x2 = " + x2);
    }
    else if (D == 0) {
        double x;
        x = -b / (2 * a);
        System.out.println("x = " + x);
    }
    else {
        System.out.println("Equation has no roots");
    }
}
Keling, uchta mumkin bo'lgan variantni hisoblashni alohida usullarga o'tkazamiz:
public void calcQuadraticEq(double a, double b, double c) {
    double D = b * b - 4 * a * c;
    if (D > 0) {
        dGreaterThanZero(a, b, D);
    }
    else if (D == 0) {
        dEqualsZero(a, b);
    }
    else {
        dLessThanZero();
    }
}

public void dGreaterThanZero(double a, double b, double D) {
    double x1, x2;
    x1 = (-b - Math.sqrt(D)) / (2 * a);
    x2 = (-b + Math.sqrt(D)) / (2 * a);
    System.out.println("x1 = " + x1 + ", x2 = " + x2);
}

public void dEqualsZero(double a, double b) {
    double x;
    x = -b / (2 * a);
    System.out.println("x = " + x);
}

public void dLessThanZero() {
    System.out.println("Equation has no roots");
}
Har bir usul uchun kod ancha qisqaroq va aniqroq bo'ldi.

Butun ob'ektni uzatish

Parametrli usulni chaqirganda, ba'zida quyidagi kodni ko'rishingiz mumkin:
public void employeeMethod(Employee employee) {
    // Некоторые действия
    double yearlySalary = employee.getYearlySalary();
    double awards = employee.getAwards();
    double monthlySalary = getMonthlySalary(yearlySalary, awards);
    // Продолжение обработки
}

public double getMonthlySalary(double yearlySalary, double awards) {
     return (yearlySalary + awards)/12;
}
Usulda employeeMethodqiymatlarni olish va ularni ibtidoiy o'zgaruvchilarda saqlash uchun 2 ta qator ajratilgan. Ba'zan bunday dizaynlar 10 tagacha chiziqni oladi. Ob'ektning o'zini metodga o'tkazish ancha oson, u erdan kerakli ma'lumotlarni olishingiz mumkin:
public void employeeMethod(Employee employee) {
    // Некоторые действия
    double monthlySalary = getMonthlySalary(employee);
    // Продолжение обработки
}

public double getMonthlySalary(Employee employee) {
    return (employee.getYearlySalary() + employee.getAwards())/12;
}
Oddiy, qisqa va ixcham.

Maydonlarni mantiqiy guruhlash va ularni alohida sinfga joylashtirish

Yuqoridagi misollar juda oddiy va ularga qarab ko'pchilik "Buni aslida kim qiladi?" Deb so'rashi mumkinligiga qaramay, ko'plab ishlab chiquvchilar beparvolik, kodni qayta ishlashni istamaslik yoki oddiygina "Bu amalga oshiradi" shunga o'xshash tizimli xatolar.

Nima uchun refaktoring samarali

Yaxshi refaktoring natijasi - bu kodni o'qish oson bo'lgan dastur, dastur mantig'idagi o'zgartirishlar tahdidga aylanmaydi va yangi xususiyatlarning kiritilishi kodni tahlil qilish do'zaxiga aylanmaydi, balki bir necha kun davomida yoqimli mashg'ulotga aylanadi. . Agar dasturni noldan qayta yozish osonroq bo'lsa, refaktoring ishlatilmasligi kerak. Misol uchun, jamoa kodni tahlil qilish, tahlil qilish va qayta tiklash uchun mehnat xarajatlarini bir xil funktsiyani noldan amalga oshirishga qaraganda yuqoriroq deb hisoblaydi. Yoki qayta tahrir qilinishi kerak bo'lgan kodda disk raskadrovka qilish qiyin bo'lgan juda ko'p xatolar mavjud. Kod tuzilishini qanday yaxshilashni bilish dasturchi ishida majburiydir. Java dasturlashni JavaRush-da o'rgangan ma'qul - amaliyotga e'tibor qaratiladigan onlayn kurs. Tezkor tekshiruvga ega 1200 dan ortiq vazifalar, 20 ga yaqin mini-loyihalar, o'yin vazifalari - bularning barchasi kodlashda o'zingizni ishonchli his qilishingizga yordam beradi. Boshlash uchun eng yaxshi vaqt hozir :) Java-da refaktoring qanday ishlaydi - 4

Refaktoringga keyingi kirish uchun manbalar

Refaktoring haqidagi eng mashhur kitob bu “Refaktoring. Mavjud kod dizaynini takomillashtirish” muallifi Martin Fauler. Bundan tashqari, Joshua Kirevskining "Naqshlar bilan qayta ishlash" kitobi asosida yozilgan refaktoring bo'yicha qiziqarli nashr mavjud. Shablonlar haqida gapirganda. Refaktoring paytida asosiy dastur dizayn naqshlarini bilish har doim juda foydali. Ushbu ajoyib kitoblar bunga yordam beradi:
  1. "Dizayn naqshlari" - Erik Friman, Elizabet Friman, Keti Sierra, Bosh birinchi seriyasidan Bert Beyts;
  2. "O'qilishi mumkin bo'lgan kod yoki dasturlash san'at sifatida" - Dastin Bosvell, Trevor Faucher.
  3. Chiroyli va nafis kod tamoyillarini tavsiflovchi Stiv Makkonnel tomonidan "Mukammal kod".
Xo'sh, refaktoring haqida bir nechta maqolalar:
  1. Jahannam vazifa: keling, eski kodni qayta ishlashni boshlaylik ;
  2. Refaktoring ;
  3. Hamma uchun refaktoring .
    Izohlar
    TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
    GO TO FULL VERSION