KodeGym/Blog Jawa/Acak/Carane refactoring dianggo ing Jawa
John Squirrels
tingkat
San Francisco

Carane refactoring dianggo ing Jawa

Diterbitake ing grup
Nalika sampeyan sinau babagan program, sampeyan nggunakake akeh wektu kanggo nulis kode. Umume pangembang wiwitan percaya yen iki bakal ditindakake ing mangsa ngarep. Iki sebagéyan bener, nanging proyek programmer uga kalebu njaga lan kode refactoring. Dina iki kita bakal ngomong babagan refactoring. Cara refactoring ing Jawa - 1

Refactoring ing CodeGym

Refactoring dijamin kaping pindho ing kursus CodeGym: Tugas gedhe menehi kesempatan kanggo kenal karo refactoring nyata liwat latihan, lan pawulangan babagan refactoring ing IDEA mbantu sampeyan nyilem menyang alat otomatis sing bakal nggawe urip sampeyan luwih gampang.

Apa refactoring?

Iku ngganti struktur kode tanpa ngganti fungsi. Contone, umpamane kita duwe metode sing mbandhingake 2 nomer lan ngasilake bener yen sing pisanan luwih gedhe lan palsu :
public boolean max(int a, int b) {
    if(a > b) {
        return true;
    } else if (a == b) {
        return false;
    } else {
        return false;
    }
}
Iki kode rada unwieldy. Malah pamula bakal arang nulis kaya iki, nanging ana kesempatan. Napa nggunakake if-elseblok yen sampeyan bisa nulis metode 6 baris kanthi luwih ringkes?
public boolean max(int a, int b) {
     return a > b;
}
Saiki kita duwe cara sing prasaja lan elegan sing nindakake operasi sing padha karo conto ing ndhuwur. Iki minangka cara refactoring: sampeyan ngganti struktur kode tanpa mengaruhi inti. Ana akeh cara lan teknik refactoring sing bakal kita deleng kanthi luwih rinci.

Napa sampeyan kudu refactoring?

Ana sawetara alasan. Contone, kanggo entuk gamblang lan brevity ing kode. Panyengkuyung teori iki percaya yen kode kudu ringkes sabisa, sanajan sawetara lusin baris komentar dibutuhake kanggo mangerteni. Pangembang liyane yakin yen kode kudu diowahi maneh supaya bisa dingerteni kanthi jumlah komentar minimal. Saben tim nganggo posisi dhewe, nanging elinga yen refactoring ora ateges nyuda . Tujuan utama yaiku nambah struktur kode. Sawetara tugas bisa kalebu ing tujuan umum iki:
  1. Refactoring nambah pemahaman kode sing ditulis dening pangembang liyane.
  2. Iku mbantu nemokake lan ndandani kewan omo.
  3. Bisa nyepetake kacepetan pangembangan piranti lunak.
  4. Sakabèhé, iku mbenakake desain piranti lunak.
Yen refactoring ora dileksanakake kanggo dangu, pembangunan bisa nemu kangelan, kalebu mandeg lengkap kanggo karya.

"Code wangi"

Nalika kode mbutuhake refactoring, ngandika duwe "mambu". Mesthi, ora secara harfiah, nanging kode kasebut pancen ora katon banget. Ing ngisor iki kita bakal njelajah teknik refactoring dhasar kanggo tahap wiwitan.

Kelas lan metode sing ora cukup gedhe

Kelas lan cara bisa dadi rumit, ora bisa digarap kanthi efektif amarga ukurane gedhe.

kelas gedhe

Kelas kasebut nduweni akeh baris kode lan macem-macem cara. Iku biasane luwih gampang kanggo pangembang nambah fitur kanggo kelas ana tinimbang nggawe anyar, kang kelas mundak akeh. Minangka aturan, kakehan fungsi crammed menyang kelas kuwi. Ing kasus iki, mbantu mindhah bagean saka fungsi menyang kelas kapisah. Kita bakal ngomong babagan iki kanthi luwih rinci ing bagean babagan teknik refactoring.

Metode dawa

"Ambu" iki muncul nalika pangembang nambahake fungsi anyar menyang metode: "Napa aku kudu mriksa parameter menyang cara sing kapisah yen aku bisa nulis kode ing kene?", "Napa aku butuh metode telusuran sing kapisah kanggo nemokake maksimal. unsur ing array? Ayo dadi tetep kene. Kode bakal luwih cetha ing cara iki ", lan misconceptions liyane kuwi.

Ana rong aturan kanggo refactoring cara dawa:

  1. Yen sampeyan pengin nambah komentar nalika nulis metode, sampeyan kudu nyelehake fungsi kasebut ing cara sing kapisah.
  2. Yen cara njupuk luwih saka 10-15 baris kode, sampeyan kudu ngenali tugas lan subtugas sing dileksanakake lan nyoba kanggo sijine subtugas menyang cara kapisah.

Ana sawetara cara kanggo ngilangi cara sing dawa:

  • Pindhah bagean saka fungsi cara menyang cara kapisah
  • Yen variabel lokal nyegah sampeyan mindhah bagean saka fungsi kasebut, sampeyan bisa mindhah kabeh obyek menyang cara liyane.

Nggunakake akeh jinis data primitif

Masalah iki biasane kedadeyan nalika jumlah kolom ing kelas saya tambah akeh. Contone, yen sampeyan nyimpen kabeh (mata uang, tanggal, nomer telpon, etc.) ing jinis primitif utawa konstan tinimbang obyek cilik. Ing kasus iki, praktik sing apik yaiku mindhah klompok logis lapangan menyang kelas sing kapisah (kelas ekstrak). Sampeyan uga bisa nambah cara ing kelas kanggo ngolah data.

Kakehan paramèter

Iki minangka kesalahan sing umum, utamane ing kombinasi karo metode sing dawa. Biasane, iki kedadeyan yen metode duwe fungsi akeh banget, utawa yen metode ngetrapake pirang-pirang algoritma. Dhaptar paramèter sing dawa banget angel dingerteni, lan nggunakake metode kanthi dhaptar kasebut ora trep. Akibaté, iku luwih apik kanggo pass kabeh obyek. Yen obyek ora duwe data sing cukup, sampeyan kudu nggunakake obyek sing luwih umum utawa dibagi fungsi cara supaya saben cara ngolah data sing ana hubungane kanthi logis.

Klompok data

Klompok data sing ana hubungane logis asring katon ing kode. Contone, paramèter sambungan database (URL, jeneng pangguna, sandhi, jeneng skema, lsp). Yen ora ana kolom siji sing bisa dibusak saka dhaptar kolom, kolom kasebut kudu dipindhah menyang kelas sing kapisah (kelas ekstrak).

Solusi sing nglanggar prinsip OOP

"Ambu" iki kedadeyan nalika pangembang nglanggar desain OOP sing tepat. Iki kedadeyan nalika dheweke ora ngerti kemampuan OOP lan gagal nggunakake kanthi lengkap utawa bener.

Gagal nggunakake pusaka

Yen subclass nggunakake mung subset cilik saka fungsi kelas induk, banjur mambu saka hirarki salah. Yen kedadeyan kasebut, biasane cara sing berlebihan ora mung ditimpa utawa mbuwang pengecualian. Siji kelas sing marisi liyane nuduhake yen kelas anak nggunakake meh kabeh fungsi kelas induk. Tuladha hierarki sing bener: Cara kerjane refactoring ing Jawa - 2Tuladha hierarki sing salah: Cara kerjane refactoring ing Jawa - 3

Ngalih statement

Apa bisa salah karo switchstatement? Iku ala nalika dadi rumit banget. Masalah sing gegandhengan yaiku akeh ifpernyataan nested.

Kelas alternatif kanthi antarmuka sing beda

Akeh kelas nindakake perkara sing padha, nanging cara kasebut duwe jeneng sing beda.

Lapangan sementara

Yen kelas wis lapangan sauntara sing obyek perlu mung sok-sok nalika Nilai disetel, lan iku kosong utawa, Gusti Allah ngalang-alangi, nullliyane wektu, banjur kode mambu. Iki minangka keputusan desain sing bisa dipertanyakan.

Mambu sing nggawe modifikasi angel

Ambune iki luwih serius. Mambu liyane utamane nggawe angel ngerti kode, nanging iki nyegah sampeyan ngowahi. Nalika sampeyan nyoba ngenalake fitur-fitur anyar, setengah saka pangembang mandheg, lan setengah dadi edan.

Hierarki warisan paralel

Masalah iki diwujudake nalika subclassing kelas mbutuhake sampeyan nggawe subclass liyane kanggo kelas sing beda.

Ketergantungan sing disebarake kanthi seragam

Sembarang modifikasi mbutuhake sampeyan nggoleki kabeh panggunaan kelas (dependensi) lan nggawe akeh owah-owahan cilik. Siji owah-owahan - suntingan ing akeh kelas.

Komplek wit modifikasi

Mambu iki minangka kebalikan saka sing sadurunge: owah-owahan mengaruhi akeh metode ing siji kelas. Minangka aturan, kode kasebut nduweni katergantungan cascading: ngganti siji cara mbutuhake sampeyan ndandani soko ing liyane, banjur ing katelu lan ing. Siji kelas - akeh owah-owahan.

"Ambune sampah"

Kategori mambu sing rada ora nyenengake sing nyebabake ngelu. Ora ana gunane, ora perlu, kode lawas. Begjanipun, IDE modern lan linter wis sinau kanggo ngelekake ambu ora enak kuwi.

A nomer akeh komentar ing cara

A cara wis akeh komentar panjelasan ing meh saben baris. Iki biasane amarga algoritma sing rumit, mula luwih becik mbagi kode kasebut dadi sawetara cara sing luwih cilik lan menehi jeneng panjelasan.

Kode duplikat

Kelas utawa metode sing beda nggunakake blok kode sing padha.

Kelas malas

Kelas njupuk fungsi sing sithik, sanajan direncanakake dadi gedhe.

Kode sing ora digunakake

Kelas, metode utawa variabel ora digunakake ing kode lan bobote mati.

Konektivitas sing gedhe banget

Kategori ambu ora enak iki ditondoi kanthi akeh hubungan sing ora adil ing kode kasebut.

Cara njaba

Cara nggunakake data saka obyek liyane luwih kerep tinimbang data dhewe.

Karukunan sing ora cocog

A kelas gumantung ing rincian implementasine saka kelas liyane.

Telpon kelas dawa

Siji kelas nelpon liyane, sing njaluk data saka katelu, sing entuk data saka papat, lan sateruse. Rantai telpon sing dawa kuwi tegese gumantung banget marang struktur kelas saiki.

Kelas task-dealer

Kelas dibutuhake mung kanggo ngirim tugas menyang kelas liyane. Mungkin iku kudu dibusak?

Teknik refactoring

Ing ngisor iki kita bakal ngrembug teknik refactoring dhasar sing bisa mbantu ngilangi bau kode sing diterangake.

Ekstrak kelas

Kelas nindakake akeh banget fungsi. Sawetara kudu dipindhah menyang kelas liyane. Contone, umpamane kita duwe Humankelas sing uga nyimpen alamat omah lan duwe metode sing ngasilake alamat lengkap:
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();
    }
 }
Praktek sing apik kanggo nyelehake informasi alamat lan metode sing gegandhengan (prilaku pangolahan data) menyang kelas sing kapisah:
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();
   }
}

Ekstrak metode

Yen cara duwe sawetara fungsi sing bisa diisolasi, sampeyan kudu nyelehake ing cara sing kapisah. Contone, metode sing ngitung oyod saka persamaan kuadrat:
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");
    }
}
Kita ngetung saben telung opsi kanthi cara sing kapisah:
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");
}
Kode saben metode dadi luwih cendhek lan luwih gampang dingerteni.

Nglewati obyek kabeh

Nalika metode diarani kanthi paramèter, sampeyan bisa uga ndeleng kode kaya iki:
public void employeeMethod(Employee employee) {
    // Some actions
    double yearlySalary = employee.getYearlySalary();
    double awards = employee.getAwards();
    double monthlySalary = getMonthlySalary(yearlySalary, awards);
    // Continue processing
}

public double getMonthlySalary(double yearlySalary, double awards) {
     return (yearlySalary + awards)/12;
}
Wis employeeMethod2 garis kabeh sing dikhususake kanggo nampa nilai lan nyimpen ing variabel primitif. Kadhangkala konstruksi kasebut bisa nganti 10 baris. Luwih gampang kanggo ngliwati obyek kasebut lan digunakake kanggo ngekstrak data sing dibutuhake:
public void employeeMethod(Employee employee) {
    // Some actions
    double monthlySalary = getMonthlySalary(employee);
    // Continue processing
}

public double getMonthlySalary(Employee employee) {
    return (employee.getYearlySalary() + employee.getAwards())/12;
}

Prasaja, ringkes, lan ringkes.

Logis klompok kolom lan mindhah menyang kapisah classDespitekasunyatan sing conto ing ndhuwur iku banget prasaja, lan yen sampeyan ndeleng wong, akeh sing bisa takon, "Sapa sing nindakake iki?", akeh pangembang nindakake kesalahan struktural amarga carelessness, unwillingness kanggo refactor kode, utawa mung sikap "sing cukup apik".

Napa refactoring efektif

Minangka asil refactoring apik, program nduweni kode sing gampang diwaca, prospek ngowahi logika ora medeni, lan ngenalake fitur-fitur anyar ora dadi neraka analisis kode, nanging dadi pengalaman sing nyenengake sajrone sawetara dina. . Sampeyan ora kudu refactor yen bakal luwih gampang kanggo nulis program saka ngeruk. Contone, umpamane tim sampeyan ngira yen tenaga kerja sing dibutuhake kanggo mangerteni, nganalisa, lan kode refactor bakal luwih gedhe tinimbang ngetrapake fungsi sing padha wiwit awal. Utawa yen kode refactored akeh masalah sing angel debug. Ngerti carane nambah struktur kode iku penting ing karya programmer. Lan sinau program ing Jawa ditindakake paling apik ing CodeGym, kursus online sing nandheske latihan. 1200+ tugas kanthi verifikasi cepet, udakara 20 proyek mini, tugas game - kabeh iki bakal mbantu sampeyan yakin ing coding. Wektu paling apik kanggo miwiti yaiku saiki :)

Resources kanggo luwih nyemplungaken dhewe ing refactoring

Buku sing paling misuwur babagan refactoring yaiku "Refactoring. Ngapikake Desain Kode sing Ana" dening Martin Fowler. Ana uga publikasi sing menarik babagan refactoring, adhedhasar buku sadurunge: "Refactoring Using Patterns" dening Joshua Kerievsky. Ngomong babagan pola ... Nalika refactoring, mesthi migunani banget kanggo ngerti pola desain dhasar. Buku-buku sing apik iki bakal mbantu: Ngomong babagan pola ... Nalika refactoring, mesthi migunani banget kanggo ngerti pola desain dhasar. Buku-buku sing apik iki bakal mbantu:
  1. "Pola Desain" dening Eric Freeman, Elizabeth Robson, Kathy Sierra, lan Bert Bates, saka seri Head First
  2. "The Art of Readable Code" dening Dustin Boswell lan Trevor Foucher
  3. "Code Complete" dening Steve McConnell, sing nemtokake prinsip kode sing apik lan elegan.
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar