JavaRush /Блоги Java /Random-TG /Чӣ тавр рефакторинг дар Java кор мекунад

Чӣ тавр рефакторинг дар Java кор мекунад

Дар гурӯҳ нашр шудааст
Ҳангоми омӯзиши барномасозӣ барои навиштани code вақти зиёд сарф мешавад. Аксарияти таҳиягарони ибтидоӣ боварӣ доранд, ки ин фаъолияти ояндаи онҳост. Ин қисман дуруст аст, аммо вазифаҳои барномасоз инчунин нигоҳдорӣ ва рефакторинги codeро дар бар мегиранд. Имрӯз мо дар бораи рефакторинг сӯҳбат хоҳем кард. Чӣ тавр рефакторинг дар Java кор мекунад - 1

Рефакторинг дар курси JavaRush

Курси JavaRush мавзӯи рефакторингро ду маротиба фаро мегирад: Ба шарофати вазифаи бузург, имкони шиносоӣ бо рефакторинги воқеӣ дар амал вуҷуд дорад ва лексия дар бораи рефакторинг дар IDEA ба шумо дар фаҳмидани асбобҳои автоматие, ки ҳаётро бениҳоят осон мекунанд, кӯмак мекунад.

Рефакторинг чист?

Ин тағир додани сохтори code бидуни тағир додани функсияи он мебошад. Масалан, усуле мавҷуд аст, ки 2 ададро муқоиса мекунад ва агар рақами аввал калонтар бошад, ҳақиқӣ ва дар акси ҳол дурӯғро бармегардонад :
public boolean max(int a, int b) {
    if(a > b) {
        return true;
    } else if(a == b) {
        return false;
    } else {
        return false;
    }
}
Дар натиҷа рамзи хеле душвор буд. Ҳатто шурӯъкунандагон хеле кам чунин чизе менависанд, аммо чунин хатар вуҷуд дорад. Чунин ба назар мерасад, ки чаро дар ин ҷо блок вуҷуд дорад, if-elseагар шумо метавонед усули 6 сатрро кӯтоҳтар нависед:
public boolean max(int a, int b) {
     return a>b;
}
Ҳоло ин усул оддӣ ва шево ба назар мерасад, гарчанде ки он ҳамон як мисоли дар боло овардашударо иҷро мекунад. Рефакторинг ҳамин тавр кор мекунад: он сохтори codeро бидуни таъсир ба моҳияти он тағир медиҳад. Бисёр усулҳо ва усулҳои рефакторинг мавҷуданд, ки мо онҳоро муфассалтар баррасӣ хоҳем кард.

Чаро рефакторинг лозим аст?

Якчанд сабабҳо вуҷуд доранд. Масалан, кушиши содда ва мухтасар будани code. Тарафдорони ин назария бар ин назаранд, ки code бояд то ҳадди имкон мухтасар бошад, ҳатто агар барои фаҳмидани он даҳҳо сатри тафсирро талаб кунад. Дигар таҳиягарон боварӣ доранд, ки code бояд аз нав кор карда шавад, то он бо шумораи камтарини шарҳҳо фаҳмо бошад. Ҳар як даста мавқеи худро интихоб мекунад, аммо мо бояд дар хотир дорем, ки рефакторинг ин коҳиш нест . Максади асосии он такмил додани сохтори code мебошад. Якчанд ҳадафҳоро ба ин ҳадафи глобалӣ дохил кардан мумкин аст:
  1. Рефакторинг фаҳмиши codeи аз ҷониби таҳиягари дигар навишташударо беҳтар мекунад;
  2. Дар ҷустуҷӯ ва ислоҳи хатогиҳо кӯмак мекунад;
  3. Ба шумо имкон медиҳад, ки суръати таҳияи нармафзорро зиёд кунед;
  4. Дар маҷмӯъ таркиби нармафзорро беҳтар мекунад.
Агар рефакторинг муддати тӯлонӣ гузаронида нашавад, то қатъи пурраи кор метавонад мушкилоти рушд ба миён ояд.

"Бӯи code"

Вақте ки code рефакторингро талаб мекунад, онҳо мегӯянд, ки он "бӯй мекунад". Албатта, на айнан, аммо чунин code дар ҳақиқат чандон зебо нест. Дар зер мо усулҳои асосии рефакторингро барои марҳилаи аввал баррасӣ хоҳем кард.

Унсурҳои нолозим калон

Синфҳо ва усулҳои вазнин вуҷуд доранд, ки бо сабаби андозаи бузурги онҳо самаранок кор кардан ғайриимкон аст.

Синфи калон

Чунин синф дорои шумораи зиёди сатрҳои code ва усулҳои гуногун мебошад. Одатан барои таҳиягар илова кардани хусусият ба синфи мавҷуда осонтар аст, на сохтани синфи нав, аз ин рӯ он афзоиш меёбад. Чун қоида, функсияи ин синф аз ҳад зиёд бор карда мешавад. Дар ин ҳолат, ҷудо кардани як қисми функсия ба синфи алоҳида кӯмак мекунад. Мо дар ин бора муфассалтар дар бахши усулҳои рефакторинг сӯҳбат хоҳем кард.

Усули калон

Ин "бӯй" вақте рух медиҳад, ки таҳиякунанда ба усул функсияҳои нав илова мекунад. "Чаро ман бояд санҷиши параметрро дар усули алоҳида гузорам, агар ман онро дар ин ҷо навишта метавонам?", "Чаро усули дарёфти элементи максималиро дар массив ҷудо кардан лозим аст, биёед онро дар ин ҷо гузорем. Бо ин роҳ рамз равшантар мешавад» ва дигар тасаввуроти нодуруст. Ду қоида барои рефакторинги усули калон вуҷуд дорад:
  1. Агар ҳангоми навиштани усул, шумо хоҳед, ки ба code шарҳ илова кунед, шумо бояд ин функсияро ба усули алоҳида ҷудо кунед;
  2. Агар усул зиёда аз 10-15 сатри codeро гирад, шумо бояд вазифаҳо ва зервазифаҳоеро, ки он иҷро мекунад, муайян кунед ва кӯшиш кунед, ки зервазифаҳоро ба усули алоҳида ҷудо кунед.
Якчанд роҳҳо барои бартараф кардани усули калон:
  • Қисми функсияҳои методро ба усули алоҳида ҷудо кунед;
  • Агар тағирёбандаҳои маҳаллӣ ба шумо имкон надиҳанд, ки як қисми функсияро хориҷ кунед, шумо метавонед тамоми an objectро ба усули дигар гузаронед.

Истифодаи бисёр намудҳои маълумоти ибтидоӣ

Одатан, ин мушкилот вақте рух медиҳад, ки шумораи майдонҳо барои нигоҳ доштани маълумот дар синф бо мурури замон меафзояд. Масалан, агар шумо ба ҷои an objectҳои хурд барои нигоҳ доштани маълумот (асъор, сана, рақамҳои телефон ва ғ.) ё доимӣ барои рамзгузории ҳама гуна маълумот намудҳои ибтидоиро истифода баред. Таҷрибаи хуб дар ин ҳолат ин аст, ки мантиқан гурӯҳбандӣ кардани майдонҳо ва ҷойгир кардани онҳо дар як синфи алоҳида (интихоби синф). Шумо инчунин метавонед усулҳои коркарди ин маълумотро дар синф дохил кунед.

Рӯйхати дарози вариантҳо

Хатогии хеле маъмул, махсусан дар якҷоягӣ бо усули калон. Одатан он вақте рух медиҳад, ки функсияи усул аз ҳад зиёд бор карда шавад ё усул якчанд алгоритмҳоро муттаҳид кунад. Рӯйхати дарози параметрҳоро фаҳмидан хеле душвор аст ва истифодаи чунин усулҳо номувофиқанд. Аз ин рӯ, беҳтар аст, ки тамоми an objectро интиқол диҳед. Агар an object маълумоти кофӣ надошта бошад, истифодаи an objectи умумӣ ё тақсим кардани функсионалии усул аст, то он маълумотҳои мантиқии алоқамандро коркард кунад.

Гурӯҳҳои маълумот

Гурӯҳҳои аз ҷиҳати мантиқӣ алоқаманд аксар вақт дар code пайдо мешаванд. Масалан, параметрҳои пайвастшавӣ ба пойгоҳи додаҳо (URL, номи корбар, парол, номи схема ва ғайра). Агар ягон майдонро аз рӯйхати элементҳо хориҷ кардан мумкин набошад, пас рӯйхат як гурӯҳи додаҳост, ки бояд дар синфи алоҳида ҷойгир карда шаванд (интихоби синф).

Қарорҳое, ки консепсияи OOP-ро вайрон мекунанд

Ин навъи "бӯй" вақте рух медиҳад, ки таҳиякунанда тарҳи OOP-ро вайрон мекунад. Чунин ходиса руй медихад, ки агар вай имкониятхои ин парадигмаро пурра нафахмад, онхоро нопурра ё нодуруст истифода барад.

Рад кардани мерос

Агар зерсинф як қисми ҳадди ақали функсияҳои синфи волидайнро истифода барад, он бӯи иерархияи нодуруст дорад. Одатан, дар ин ҳолат, усулҳои нолозим танҳо бекор карда намешаванд ё истисноҳо партофта мешаванд. Агар синф аз синфи дигар мерос гирифта бошад, ин маънои истифодаи қариб пурраи функсияҳои онро дорад. Намунаи иерархияи дуруст: Чӣ тавр рефакторинг дар Java кор мекунад - 2 Намунаи иерархияи нодуруст: Чӣ тавр рефакторинг дар Java кор мекунад - 3

изҳороти гузариш

Бо оператор чӣ хато шуда метавонад switch? Вақте ки тарҳи он хеле мураккаб аст, бад аст. Ин инчунин бисёр блокҳои лонаро дар бар мегирад if.

Синфҳои алтернативӣ бо интерфейсҳои гуногун

Якчанд синфҳо воқеан як корро мекунанд, аммо усулҳои онҳо ба таври гуногун номгузорӣ шудаанд.

Майдони муваққатӣ

Агар синф майдони муваққатӣ дошта бошад, ки an object танҳо гоҳ-гоҳ ба он ниёз дорад, вақте ки он бо арзишҳо пур мешавад ва дар вақти боқимонда холӣ аст ё Худо накунад, nullпас рамз "бӯй мекунад" ва чунин тарҳ шубҳанок аст. карор.

Бӯйҳое, ки тағиротро мушкил мекунанд

Ин «бӯйҳо» ҷиддитаранд. Боқимондаҳо асосан фаҳмиши codeро халалдор мекунанд, дар ҳоле ки онҳо тағир додани онро имкон намедиҳанд. Ҳангоми ҷорӣ кардани ягон хусусият, нисфи таҳиягарон тарк мекунанд ва нисфи онҳо девона мешаванд.

Иерархияи мероси параллелӣ

Вақте ки шумо зеркласси синфро эҷод мекунед, шумо бояд барои синфи дигар зеркласси дигар эҷод кунед.

Тақсимоти ягонаи вобастагӣ

Ҳангоми иҷрои ҳама гуна тағирот, шумо бояд ҳамаи вобастагиҳои (истифодаи) ин синфро ҷустуҷӯ кунед ва бисёр тағйироти хурд ворид кунед. Як тағирот - таҳрирҳо дар бисёр синфҳо.

Дарахти тағирдиҳии мураккаб

Ин бӯй баръакси бӯи қаблӣ аст: тағирот ба миқдори зиёди усулҳои ҳамон синф таъсир мерасонад. Одатан, вобастагӣ дар чунин code каскад аст: пас аз тағир додани як усул, шумо бояд чизеро дар дигараш ислоҳ кунед, пас дар сеюм ва ғайра. Як синф - бисёр тағйирот.

"Бӯи партовҳо"

Категорияи хеле ногувори бӯйҳое, ки боиси дарди сар мешаванд. Рамзи бефоида, нодаркор, кӯҳна. Хушбахтона, IDE ва линтерҳои муосир огоҳ кардани чунин бӯйҳоро омӯхтанд.

Шумораи зиёди шарҳҳо дар усул

Усули қариб дар ҳар сатр шарҳҳои зиёди шарҳдиҳанда дорад. Ин одатан бо алгоритми мураккаб алоқаманд аст, бинобар ин беҳтар аст, ки codeро ба якчанд усулҳои хурдтар тақсим кунед ва ба онҳо номҳои пурмаъно диҳед.

Дурнамои code

Синфҳо ё усулҳои гуногун ҳамон блокҳои codeро истифода мебаранд.

Синфи танбал

Синф функсияҳои хеле камро ба ӯҳда мегирад, гарчанде ки бисёре аз он ба нақша гирифта шуда буд.

Рамзи истифоданашуда

Синф, усул ё тағирёбанда дар code истифода намешавад ва "вазни мурда" аст.

Пайвастшавӣ аз ҳад зиёд

Ин категорияи бӯйҳо бо шумораи зиёди пайвастҳои нолозим дар code тавсиф карда мешаванд.

Усулҳои тарафи сеюм

Усул маълумоти an objectи дигарро нисбат ба маълумоти худаш бештар истифода мебарад.

Муносибати номуносиб

Синф майдонҳои хидматрасонӣ ва усулҳои синфи дигарро истифода мебарад.

Зангҳои синфи дароз

Як синф ба синфи дигар занг мезанад, ки маълумотро аз сеюм, аз чорум ва ғайра талаб мекунад. Чунин занҷири тӯлонии зангҳо маънои сатҳи баланди вобастагӣ аз сохтори синфии кунуниро дорад.

Синф-вазифа-дилер

Синф танҳо барои додани супориш ба синфи дигар лозим аст. Шояд он бояд хориҷ карда шавад?

Усулҳои рефакторинг

Дар зер мо дар бораи усулҳои ибтидоии рефакторинг сӯҳбат хоҳем кард, ки ба бартараф кардани бӯи codeи тавсифшуда кӯмак мекунанд.

Интихоби синф

Синф бисёр вазифаҳоро иҷро мекунад; баъзеи онҳо бояд ба синфи дигар кӯчонида шаванд. Масалан, синфе мавҷуд аст Human, ки инчунин суроғаи истиқоматӣ ва усулеро дар бар мегирад, ки суроғаи пурраро пешниҳод мекунад:
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();
   }
}
Хуб мебуд, ки иттилооти суроға ва усули (рафтори коркарди маълумот) дар синфи алоҳида ҷойгир карда шавад:
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();
   }
}

Интихоби усул

Агар ягон функсия дар усул гурӯҳбандӣ карда шавад, он бояд дар усули алоҳида ҷойгир карда шавад. Масалан, усуле, ки решаҳои муодилаи квадратиро ҳисоб мекунад:
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");
    }
}
Биёед ҳисобкунии ҳар се варианти имконпазирро ба усулҳои алоҳида гузаронем:
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");
}
Рамзи ҳар як усул хеле кӯтоҳтар ва равшантар шудааст.

Интиқоли тамоми an object

Ҳангоми даъват кардани усул бо параметрҳо, шумо баъзан codeро чунин мебинед:
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;
}
Дар усул, employeeMethodто 2 сатр барои ба даст овардани арзишҳо ва нигоҳ доштани онҳо дар тағирёбандаҳои ибтидоӣ ҷудо карда шудааст. Баъзан чунин тарҳҳо то 10 сатрро мегиранд. Гузаронидани худи an object ба усул хеле осонтар аст, ки аз он ҷо шумо метавонед маълумоти заруриро истихроҷ кунед:
public void employeeMethod(Employee employee) {
    // Некоторые действия
    double monthlySalary = getMonthlySalary(employee);
    // Продолжение обработки
}

public double getMonthlySalary(Employee employee) {
    return (employee.getYearlySalary() + employee.getAwards())/12;
}
Содда, кӯтоҳ ва мухтасар.

Гурӯҳбандии мантиқии майдонҳо ва ҷойгир кардани онҳо дар синфи алоҳида

Сарфи назар аз он, ки мисолҳои дар боло овардашуда хеле соддаанд ва ҳангоми дидани онҳо бисёриҳо метавонанд саволи "Ин корро кӣ мекунад?", бисёре аз таҳиягарон бо сабаби беэҳтиётӣ, майл надоштан ба рефактсияи code ё танҳо "Ин кор мекунад" хатогиҳои сохтории монанд.

Чаро рефакторинг самаранок аст?

Натиҷаи рефакторинги хуб барномаест, ки codeи онро хондан осон аст, тағирот ба мантиқи барнома таҳдид намекунад ва ҷорӣ намудани хусусиятҳои нав ба codeи таҳлor ҷаҳаннам табдил намеёбад, балки як фаъолияти гуворо барои ду рӯз. . Рефакторинг набояд истифода шавад, агар аз нав навиштани барнома аз сифр осонтар бошад. Масалан, гурӯҳ хароҷоти меҳнатро барои таҳлил, таҳлил ва рефакторинги code ҳисоб мекунад, ки нисбат ба татбиқи ҳамон як функсия аз сифр баландтар аст. Ё codeе, ки бояд аз нав ислоҳ карда шавад, хатогиҳои зиёде дорад, ки ислоҳ кардан душвор аст. Донистани тарзи такмил додани сохтори code дар кори барномасоз ҳатмист. Хуб, беҳтар аст, ки барномаи Java-ро дар JavaRush омӯзед - як курси онлайн бо таваҷҷӯҳ ба амал. 1200+ вазифаҳо бо санҷиши фаврӣ, тақрибан 20 лоиҳаи хурд, вазифаҳои бозӣ - ҳамаи ин ба шумо кӯмак мекунад, ки худро дар рамзгузорӣ боварӣ ҳис кунед. Беҳтарин вақт барои оғоз ҳоло аст :) Чӣ тавр рефакторинг дар Java кор мекунад - 4

Захираҳо барои ғарқ кардани минбаъда ба рефакторинг

Машҳуртарин китоб дар бораи рефакторинг “Рефакторинг. Такмor тарҳи Кодекси мавҷуда» аз ҷониби Мартин Фаулер. Инчунин як нашрияи ҷолиб дар бораи рефакторинг мавҷуд аст, ки дар асоси китоби қаблӣ навишта шудааст - "Рефакторинг бо намунаҳо" аз ҷониби Ҷошуа Киревски. Сухан дар бораи шаблонхо. Ҳангоми рефакторинг, донистани намунаҳои асосии тарроҳии барнома ҳамеша хеле муфид аст. Ин китобҳои бузург дар ин кор кӯмак хоҳанд кард:
  1. "Намудҳои тарроҳӣ" - аз ҷониби Эрик Фриман, Элизабет Фриман, Кэти Сиерра, Берт Бейтс аз силсилаи Сарвари аввал;
  2. "Кодекси хондашаванда ё барномасозӣ ҳамчун санъат" - Дастин Босвелл, Тревор Фаучер.
  3. "Кодекси комил" аз ҷониби Стив МакКоннелл, ки принсипҳои рамзи зебо ва шеворо нишон медиҳад.
Хуб, чанд мақола дар бораи рефакторинг:
  1. Ҷаҳаннам вазифа: биёед рефакторизатсияи рамзи меросиро оғоз кунем ;
  2. Рефакторинг ;
  3. Рефакторинг барои ҳама .
    Шарҳҳо
    TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
    GO TO FULL VERSION