JavaRush /Blog Jawa /Random-JV /Carane refactoring dianggo ing Jawa

Carane refactoring dianggo ing Jawa

Diterbitake ing grup
Nalika sinau kanggo program, akeh wektu digunakake kanggo nulis kode. Umume pangembang wiwitan percaya yen iki minangka kegiatan ing mangsa ngarep. Iki sebagian bener, nanging tugas programer uga kalebu njaga lan kode refactoring. Dina iki kita bakal ngomong babagan refactoring. Cara refactoring ing Jawa - 1

Refactoring ing kursus JavaRush

Kursus JavaRush nyakup topik refactoring kaping pindho: Thanks kanggo tugas gedhe, ana kesempatan kanggo kenal karo refactoring nyata ing praktik, lan kuliah babagan refactoring ing IDEA bakal mbantu sampeyan ngerti alat otomatis sing nggawe urip luwih gampang.

Apa refactoring?

Iki minangka owah-owahan ing struktur kode tanpa ngganti fungsine. Contone, ana cara sing mbandhingake 2 nomer lan ngasilake bener yen sing pisanan luwih gedhe, lan palsu yen ora:
public boolean max(int a, int b) {
    if(a > b) {
        return true;
    } else if(a == b) {
        return false;
    } else {
        return false;
    }
}
Asil punika kode banget cumbersome. Malah pamula arang nulis kaya iki, nanging ana risiko kasebut. Kayane, kenapa ana blok ing kene if-elseyen sampeyan bisa nulis metode 6 baris sing luwih cendhek:
public boolean max(int a, int b) {
     return a>b;
}
Saiki cara iki katon prasaja lan elegan, sanajan nindakake perkara sing padha karo conto ing ndhuwur. Iki cara kerjane refactoring: ngganti struktur kode tanpa mengaruhi inti. Ana akeh cara lan teknik refactoring, sing bakal ditimbang kanthi luwih rinci.

Napa refactoring dibutuhake?

Ana sawetara alasan. Contone, nguber gamblang lan conciseness saka kode. Panyengkuyung teori iki percaya yen kode kasebut kudu ringkes sabisa, sanajan mbutuhake pirang-pirang baris komentar kanggo mangerteni. Pangembang liyane percaya yen kode kudu diowahi maneh supaya bisa dingerteni kanthi jumlah komentar minimal. Saben tim milih posisi, nanging kita kudu ngelingi yen refactoring dudu pengurangan . Tujuan utama yaiku nambah struktur kode. Sawetara tujuan bisa kalebu ing tujuan global iki:
  1. Refactoring nambah pangerten kode sing ditulis dening pangembang liyane;
  2. Mbantu nemokake lan ndandani kesalahan;
  3. Ngidini sampeyan nambah kacepetan pangembangan piranti lunak;
  4. Sakabèhé nambah komposisi piranti lunak.
Yen refactoring ora ditindakake kanggo wektu sing suwe, bisa uga ana alangan pangembangan, nganti mandheg kerja.

"Code wangi"

Nalika kode mbutuhake refactoring, dheweke ujar "mambu". Mesthi, ora secara harfiah, nanging kode kasebut pancen ora katon apik banget. Ing ngisor iki kita bakal nimbang teknik refactoring utama kanggo tahap awal.

Unsur sing ora perlu gedhe

Ana kelas lan cara sing rumit sing ora bisa ditindakake kanthi efektif amarga ukurane gedhe.

kelas gedhe

Kelas kasebut nduweni akeh baris kode lan macem-macem cara. Biasane luwih gampang kanggo pangembang nambahake fitur menyang kelas sing wis ana tinimbang nggawe sing anyar, mula dheweke tuwuh. Minangka aturan, fungsi kelas iki overloaded. Ing kasus iki, misahake bagean saka fungsi menyang kelas kapisah mbantu. Kita bakal ngomong babagan iki kanthi luwih rinci ing bagean teknik refactoring.

Metode Agung

"Ambu" iki kedadeyan nalika pangembang nambahake fungsi anyar menyang metode. "Apa aku kudu sijine mriksa parameter ing cara kapisah yen aku bisa nulis kene?", "Apa iku perlu kanggo misahake cara kanggo nemokake unsur maksimum ing Uploaded, ayo ninggalake kene. Kanthi cara iki kode luwih jelas, "lan salah paham liyane. Ana rong aturan kanggo refactoring cara gedhe:
  1. Yen, nalika nulis cara, sampeyan pengin nambah komentar menyang kode, sampeyan kudu misahake fungsi iki menyang cara kapisah;
  2. Yen cara njupuk luwih saka 10-15 baris kode, sampeyan kudu ngenali tugas lan subtugas sing nindakake lan nyoba kanggo misahake subtugas menyang cara kapisah.
Sawetara cara kanggo ngilangi cara gedhe:
  • Pisah bagean saka fungsi saka cara menyang cara kapisah;
  • Yen variabel lokal ora ngidini sampeyan ngekstrak bagean saka fungsi kasebut, sampeyan bisa ngirim kabeh obyek menyang cara liya.

Nggunakake akeh jinis data primitif

Biasane, masalah iki kedadeyan nalika jumlah kolom kanggo nyimpen data ing kelas saya tambah akeh. Contone, yen sampeyan nggunakake jinis primitif tinimbang obyek cilik kanggo nyimpen data (mata uang, tanggal, nomer telpon, etc.) utawa konstanta kanggo encode informasi sembarang. Praktek sing apik ing kasus iki yaiku ngelompokake lapangan kanthi logis lan nyelehake ing kelas sing kapisah (milih kelas). Sampeyan uga bisa nyakup cara kanggo ngolah data iki ing kelas.

Dhaptar opsi dawa

Kesalahan sing cukup umum, utamane ing kombinasi karo metode gedhe. Biasane kedadeyan yen fungsi metode kasebut kakehan, utawa metode kasebut nggabungake sawetara algoritma. Dhaptar paramèter sing dawa banget angel dimangerteni, lan cara kasebut ora trep kanggo digunakake. Mulane, luwih becik nransfer kabeh obyek. Yen obyek ora cukup data, iku worth nggunakake obyek sing luwih umum utawa pamisah fungsi saka cara supaya ngolah data logis related.

Kelompok data

Kelompok data sing gegandhengan kanthi logis asring katon ing kode. Contone, paramèter sambungan menyang database (URL, jeneng pangguna, sandhi, jeneng skema, lsp). Yen ora ana kolom siji sing bisa dibusak saka dhaptar unsur, banjur dhaptar kasebut minangka klompok data sing kudu diselehake ing kelas sing kapisah (pilihan kelas).

Solusi sing ngrusak konsep OOP

Jinis "mambu" iki kedadeyan nalika pangembang nglanggar desain OOP. Iki kedadeyan yen dheweke ora ngerti kanthi lengkap kemampuan paradigma iki, nggunakake kanthi ora lengkap utawa ora bener.

Penolakan warisan

Yen subclass nggunakake bagean minimal saka fungsi kelas induk, ambune kaya hirarki sing ora bener. Biasane, ing kasus iki, cara sing ora perlu mung ora ditimpa utawa pengecualian dibuwang. Yen kelas diwarisake saka liyane, iki nuduhake panggunaan fungsionalitas sing meh lengkap. Tuladha hierarki sing bener: Cara kerjane refactoring ing Jawa - 2 Tuladha hierarki sing salah: Cara kerjane refactoring ing Jawa - 3

ngalih statement

Apa sing salah karo operator switch? Iku ala nalika desain banget Komplek. Iki uga kalebu akeh blok nested if.

Kelas alternatif kanthi antarmuka sing beda

Sawetara kelas pancen nindakake perkara sing padha, nanging cara kasebut dijenengi kanthi beda.

Lapangan sementara

Yen kelas ngemot lapangan sauntara sing obyek perlu mung sok-sok, nalika kapenuhan nilai, lan liyane wektu kosong utawa, Gusti Allah ngalang-alangi, , nullbanjur kode "mambu", lan desain kuwi dubious. kaputusan.

Bau sing nggawe modifikasi angel

Iki "mambu" luwih serius. Liyane utamané ngrusak pangerten kode, nalika iki ora nggawe iku bisa kanggo ngowahi iku. Nalika ngenalake fitur apa wae, setengah saka pangembang bakal mandheg, lan setengah bakal dadi edan.

Hierarki warisan paralel

Nalika nggawe subclass saka kelas, sampeyan kudu nggawe subclass liyane saka kelas liyane.

Distribusi ketergantungan seragam

Nalika nindakake modifikasi, sampeyan kudu nggoleki kabeh dependensi (nggunakake) kelas iki lan nggawe akeh owah-owahan cilik. Siji owah-owahan - suntingan ing akeh kelas.

Wit modifikasi kompleks

Mambu iki minangka kebalikan saka sing sadurunge: owah-owahan mengaruhi akeh metode saka kelas sing padha. Minangka aturan, ketergantungan ing kode kasebut minangka cascading: ngganti siji cara, sampeyan kudu ndandani soko liyane, banjur ing katelu, lan sateruse. 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 bab ambu ora enak kuwi.

A nomer akeh komentar ing cara

Cara kasebut nduweni akeh komentar panjelasan ing meh saben baris. Iki biasane digandhengake karo algoritma sing rumit, mula luwih becik dibagi kode kasebut dadi sawetara cara sing luwih cilik lan menehi jeneng sing migunani.

Duplikasi kode

Kelas utawa metode sing beda nggunakake blok kode sing padha.

Kelas malas

Kelas kasebut nduweni fungsi sing sithik, sanajan akeh sing direncanakake.

Kode sing ora digunakake

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

Kopling sing berlebihan

Kategori mambu iki ditondoi kanthi akeh sambungan sing ora perlu ing kode kasebut.

Cara pihak katelu

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

Karukunan sing ora cocog

Kelas nggunakake kolom layanan lan metode kelas liyane.

Telpon kelas dawa

Siji kelas nelpon liyane, sing njaluk data saka katelu, sing saka papat, lan ing. Panggilan sing dawa kuwi tegese tingkat katergantungan sing dhuwur ing struktur kelas saiki.

Kelas-tugas-dealer

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

Teknik Refactoring

Ing ngisor iki kita bakal ngomong babagan teknik refactoring awal sing bakal mbantu ngilangi bau kode sing diterangake.

Pilihan kelas

Kelas nindakake akeh banget fungsi; sawetara kudu dipindhah menyang kelas liyane. Contone, ana kelas Humansing uga ngemot alamat omah lan cara sing nyedhiyakake 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();
   }
}
Iku apik kanggo nyelehake informasi alamat lan cara (prilaku pangolahan data) ing 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();
   }
}

Pemilihan metode

Yen fungsi ing cara bisa diklompokaké, iku kudu diselehake ing cara 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");
    }
}
Ayo pindhah pitungan kabeh telung opsi sing bisa dadi 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 kanggo saben cara wis dadi luwih cendhek lan luwih cetha.

Nransfer kabeh obyek

Nalika nelpon metode kanthi paramèter, sampeyan bisa ndeleng kode kaya iki:
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;
}
Ing metode kasebut, employeeMethodnganti 2 baris diparengake kanggo entuk nilai lan nyimpen ing variabel primitif. Kadhangkala desain kasebut njupuk nganti 10 garis. Luwih gampang ngirim obyek kasebut menyang metode kasebut, saka ngendi sampeyan bisa ngekstrak data sing dibutuhake:
public void employeeMethod(Employee employee) {
    // Некоторые действия
    double monthlySalary = getMonthlySalary(employee);
    // Продолжение обработки
}

public double getMonthlySalary(Employee employee) {
    return (employee.getYearlySalary() + employee.getAwards())/12;
}
Prasaja, cekak lan ringkes.

Panglompokan logis lapangan lan dilebokake ing kelas sing kapisah

Senadyan kasunyatan sing conto ing ndhuwur iku banget prasaja lan nalika ndeleng wong akeh bisa takon pitakonan "Sapa sing bener nindakake iki?", Akeh pangembang, amarga inattention, unwillingness kanggo refactor kode, utawa mung "Iku bakal nindakake," nggawe. kesalahan struktural padha.

Napa refactoring efektif

Asil refactoring apik yaiku program sing kode gampang diwaca, modifikasi logika program ora dadi ancaman, lan introduksi fitur-fitur anyar ora dadi kode parsing neraka, nanging kegiatan sing nyenengake sajrone sawetara dina. . Refactoring ngirim ora digunakake yen bakal luwih gampang kanggo nulis ulang program saka ngeruk. Contone, tim ngira biaya tenaga kerja kanggo parsing, nganalisa lan kode refactoring luwih dhuwur tinimbang ngleksanakake fungsi sing padha wiwit awal. Utawa kode sing kudu refactored wis akèh kasalahan sing angel kanggo debug. Ngerti carane nambah struktur kode iku prentah ing karya programmer. Ya, luwih becik sinau pemrograman Java ing JavaRush - kursus online kanthi penekanan ing praktik. 1200+ tugas kanthi verifikasi cepet, udakara 20 mini-proyek, tugas game - kabeh iki bakal mbantu sampeyan yakin ing coding. Wektu paling apik kanggo miwiti yaiku saiki :) Cara kerjane refactoring ing Jawa - 4

Resources kanggo nyilem luwih menyang refactoring

Buku sing paling misuwur babagan refactoring yaiku "Refactoring. Ngapikake Desain Kode sing Ana" dening Martin Fowler. Ana uga publikasi sing menarik babagan refactoring, ditulis adhedhasar buku sadurunge - "Refactoring with Patterns" dening Joshua Kiriewski. Ngomong cithakan. Nalika refactoring, iku tansah banget migunani kanggo ngerti pola desain aplikasi dhasar. Buku-buku sing apik iki bakal mbantu:
  1. "Pola Desain" - dening Eric Freeman, Elizabeth Freeman, Kathy Sierra, Bert Bates saka seri Head First;
  2. "Kode sing bisa diwaca, utawa Pemrograman minangka Seni" - Dustin Boswell, Trevor Faucher.
  3. "Kode Sampurna" dening Steve McConnell, sing nerangake prinsip kode sing apik lan elegan.
Inggih, sawetara artikel babagan refactoring:
  1. Neraka tugas: ayo miwiti refactoring kode warisan ;
  2. Refactoring ;
  3. Refactoring kanggo kabeh wong .
    Komentar
    TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
    GO TO FULL VERSION