JavaRush /Java Blog /Random-TK /Java-da synp dizaýnynyň bäş esasy ýörelgesi (SOLID)
Ve4niY
Dereje

Java-da synp dizaýnynyň bäş esasy ýörelgesi (SOLID)

Toparda çap edildi
Sapaklar programmanyň gurlan bloklarydyr. Binadaky kerpiç ýaly. Writtenaramaz ýazylan sapaklar bir gün problema döredip biler. Java-da synp dizaýnynyň bäş esasy ýörelgesi (SOLID) - 1Synpyň dogry ýazylandygyna düşünmek üçin “hil standartlaryny” barlap bilersiňiz. Java-da bular SOLID ýörelgeleri diýilýär. Geliň, olar hakda gürleşeliň.

Java-da SOLID ýörelgeleri

SOLID - OOP we dizaýnyň ilkinji bäş ýörelgesiniň baş harplaryndan emele gelen gysgaça söz. Principlesörelgeler Robert Martin tarapyndan 2000-nji ýyllaryň başynda oýlanyp tapyldy we gysgaldylyşy soňra Maýkl Feathers tarapyndan döredildi. SOLID ýörelgeleriniň şulary öz içine alýar:
  1. Leeke-täk jogapkärçilik ýörelgesi.
  2. Açyk ýapyk ýörelge.
  3. Liskowyň ornuny tutmak ýörelgesi.
  4. Interfeýs bölüniş ýörelgesi.
  5. Baglylyk öwrülişigi ýörelgesi.

Leeke-täk jogapkärçilik ýörelgesi (SRP)

Bu ýörelge , synpy üýtgetmegiň hiç haçan birden köp sebäbiniň bolmaly däldigini aýdýar . Her bir obýektiň synpda doly jemlenen bir jogapkärçiligi bar. Classhli synp hyzmatlary bu jogapkärçiligi üpjün etmäge gönükdirilendir. Şeýle sapaklary zerur bolsa üýtgetmek hemişe aňsat bolar, sebäbi synpyň nämä jogapkärdigi we nämäniň ýokdugy düşnüklidir. Changesagny, üýtgeşmeler girizip bolar we netijelerinden - beýleki zatlara täsirinden gorkmaň. Şeýle kody barlamak has aňsat, sebäbi bir funksiýany beýlekilerden üzňelikde synaglar bilen örtýärsiňiz. Sargytlary gaýtadan işleýän moduly göz öňüne getiriň. Sargyt dogry düzülen bolsa, maglumat bazasynda saklaýar we buýrugy tassyklamak üçin e-poçta iberýär:
public class OrderProcessor {

    public void process(Order order){
        if (order.isValid() && save(order)) {
            sendConfirmationEmail(order);
        }
    }

    private boolean save(Order order) {
        MySqlConnection connection = new MySqlConnection("database.url");
        // save the order to the database

        return true;
    }

    private void sendConfirmationEmail(Order order) {
        String name = order.getCustomerName();
        String email = order.getCustomerEmail();

        // Sending a letter to the client
    }
}
Şeýle modul üç sebäbe görä üýtgäp biler. Birinjiden, sargytlary gaýtadan işlemegiň logikasy başgaça bolup biler, ikinjiden, ony tygşytlamagyň usuly (maglumat bazasynyň görnüşi), üçünjiden, tassyklama hatyny ibermegiň usuly (mysal üçin, SMS ibermeli e-poçta ýerine). Leeke-täk jogapkärçilik ýörelgesi, bu meseläniň üç tarapynyň aslynda üç dürli jogapkärçilikdigini aňladýar. Bu olaryň dürli synplarda ýa-da modullarda bolmalydygyny aňladýar. Dürli wagtda we dürli sebäplere görä üýtgäp bilýän birnäçe guramany birleşdirmek, erbet dizaýn karary hasaplanýar. Moduly üç aýratyn bölege bölmek has gowudyr, olaryň hersi bir funksiýany ýerine ýetirer:
public class MySQLOrderRepository {
    public boolean save(Order order) {
        MySqlConnection connection = new MySqlConnection("database.url");
        // save the order to the database

        return true;
    }
}

public class ConfirmationEmailSender {
    public void sendConfirmationEmail(Order order) {
        String name = order.getCustomerName();
        String email = order.getCustomerEmail();

        // Sending a letter to the client
    }
}

public class OrderProcessor {
    public void process(Order order){

        MySQLOrderRepository repository = new MySQLOrderRepository();
        ConfirmationEmailSender mailSender = new ConfirmationEmailSender();

        if (order.isValid() && repository.save(order)) {
            mailSender.sendConfirmationEmail(order);
        }
    }

}

Açyk / ýapyk ýörelge (OCP)

Bu ýörelge aşakdaky ýaly düşündirilýär: programma üpjünçiligi guramalary (synplar, modullar, funksiýalar we ş.m.) giňeltmek üçin açyk, ýöne üýtgetmek üçin ýapyk bolmaly . Bu, synpyň özüne fiziki üýtgeşmeler girizmezden, synpyň daşarky özüni alyp barşyny üýtgetmegiň mümkindigini aňladýar. Bu ýörelgä eýerip, synplary aýratyn amaly şertlere sazlamak üçin ony ösdürmek we käbir funksiýalary kesgitlemek üçin sapaklar döredilýär. Şonuň üçin ulgam çeýe bolmaly, deslapky kody üýtgetmän üýtgeýän şertlerde işlemäge ukyply bolmaly. Sargyt mysalymyzy dowam etdirip, buýruk işlenmänkä we tassyklama e-poçta iberilmänkä käbir hereketleri etmelidigimizi aýdalyň. Synpyň özüni üýtgetmegiň ýerine OrderProcessor, ony uzaldarys we OCP ýörelgesini bozmazdan bar bolan meseläniň çözgüdini taparys:
public class OrderProcessorWithPreAndPostProcessing extends OrderProcessor {

    @Override
    public void process(Order order) {
        beforeProcessing();
        super.process(order);
        afterProcessing();
    }

    private void beforeProcessing() {
        // Perform some actions before processing the order
    }

    private void afterProcessing() {
        // Perform some actions after order processing
    }
}

Barbara Liskowyň ornuny tutmak ýörelgesi (LSP)

Bu, ozal ara alnyp maslahatlaşylan açyk / ýapyk ýörelgäniň üýtgemegi. Aşakdaky ýaly suratlandyryp bolar: programmadaky obýektleri programmanyň häsiýetlerini üýtgetmän mirasçylary bilen çalşyp bolar. Diýmek, esasy synpy giňeltmek arkaly işlenip düzülen synp, usullaryny müşderiniň nukdaýnazaryndan bozmajak görnüşde ýok etmeli. .Agny, bir dörediji synpyňyzy giňeldip, ony programmada ulanýan bolsa, artykmaç usullaryň garaşylýan özüni alyp barşyny üýtgetmeli däldir. Kiçi synplar, müşderiniň nukdaýnazaryndan işlemegi bozmaýan görnüşde esasy synp usullaryny ýok etmeli. Muny aşakdaky mysal arkaly jikme-jik gözden geçirip bolar. Sargytlary barlamak üçin jogapkär we sargyt elementleriniň hemmesiniň bardygyny ýa-da ýokdugyny barlaýan synpymyz bar diýip pikir edeliň. Bu synpda dogry ýa-da ýalanisValid gaýtarýan usul bar :
public class OrderStockValidator {

    public boolean isValid(Order order) {
        for (Item item : order.getItems()) {
            if (! item.isInStock()) {
                return false;
            }
        }

        return true;
    }
}
Şeýle hem käbir sargytlaryň başgaça tassyklanmalydygyny kabul edeliň: tertipdäki ähli harytlaryň bardygyny ýa-da ähli harytlaryň gaplanandygyny barlaň. OrderStockValidatorMunuň üçin synpy synp bilen giňeltdik OrderStockAndPackValidator:
public class OrderStockAndPackValidator extends OrderStockValidator {

    @Override
    public boolean isValid(Order order) {
        for (Item item : order.getItems()) {
            if ( !item.isInStock() || !item.isPacked() ){
                throw new IllegalStateException(
                     String.format("Order %d is not valid!", order.getId())
                );
            }
        }

        return true;
    }
}
Şeýle-de bolsa, bu synpda LSP ýörelgesini bozduk, sebäbi buýruk tassyklamadan geçmese ýalan yzyna gaýtarmagyň ýerine usulymyz kadadan çykma edýär IllegalStateException. Bu koduň müşderileri muňa garaşmaýarlar: hakyky ýa-da ýalňyş yzyna gaýtarylmagyna garaşýarlar . Bu programmada ýalňyşlyklara sebäp bolup biler.

Interfeýsiň bölüniş ýörelgesi (ISP)

Aşakdaky jümle bilen häsiýetlendirilýär: Müşderiler ulanmajak usullaryny durmuşa geçirmäge mejbur edilmeli däldir . Interfeýsiň bölüniş prinsipi, gaty “galyň” interfeýsleri kiçi we has anyk görnüşlere bölmek zerurdygyny görkezýär, şonuň üçin kiçi interfeýsleriň müşderileri diňe öz işleri üçin zerur usullary bilýärler. Netijede, interfeýs usuly üýtgedilende, bu usuly ulanmaýan müşderiler üýtgemeli däldir. Bir mysala seredeliň. Öndüriji Alex "hasabat" interfeýsini döretdi we iki usuly goşdy: generateExcel()we generatedPdf(). Indi Müşderi A bu interfeýsi ulanmak isleýär, ýöne Excel däl-de, diňe PDF hasabatlaryny ulanmagy maksat edinýär. Bu funksiýadan kanagatlanarmy? No.ok. Iki usuly durmuşa geçirmeli bolar, olaryň biri köplenç zerur däl we diňe programma üpjünçiligi dizaýneri Alexiň kömegi bilen bar. Müşderi başga bir interfeýs ulanar ýa-da Excel meýdançasyny boş galdyrar. Onda çözgüt näme? Bar bolan interfeýsi iki kiçi bölege bölmekden ybarat. Biri PDF formatda hasabat, ikinjisi Excel formatda hasabat. Bu ulanyja diňe özi üçin zerur bolan funksiýany ulanmaga mümkinçilik berer.

Baglylyk öwrülişigi ýörelgesi (DIP)

Java-daky bu SOLID ýörelgesi şeýle düşündirilýär: ulgamyň içindäki baglylyklar abstraktlar esasynda gurulýar . Iň ýokary derejeli modullar aşaky derejeli modullardan garaşsyz. Abstraktlar jikme-jikliklere bagly bolmaly däldir. Jikme-jiklikler abstraktlara bagly bolmaly. Programma üpjünçiligi dürli modullaryň özbaşdak bolmagy we abstraksiýa ulanyp biri-birine birikmegi üçin dizaýn edilmeli. Bu ýörelgäniň nusgawy ulanylyşy Bahar çarçuwasydyr. “Bahar” çarçuwasynyň çäginde ähli modullar bilelikde işläp bilýän aýratyn komponentler hökmünde durmuşa geçirilýär. Olar şeýle bir öz-özüne bagly welin, bahar çarçuwasyndan başga beýleki programma üpjünçilik modullarynda aňsatlyk bilen ulanylyp bilner. Bu ýapyk we açyk ýörelgelere baglylyk arkaly gazanylýar. Modhli modullar diňe başga bir modulda ulanyp boljak abstraksiýa girişi üpjün edýär. Muny mysal bilen görkezmäge synanyşalyň. Oleeke-täk jogapkärçilik ýörelgesi barada aýdanymyzda, käbirlerini göz öňünde tutduk OrderProcessor. Geliň, bu synpyň koduna başga bir göz aýlalyň:
public class OrderProcessor {
    public void process(Order order){

        MySQLOrderRepository repository = new MySQLOrderRepository();
        ConfirmationEmailSender mailSender = new ConfirmationEmailSender();

        if (order.isValid() && repository.save(order)) {
            mailSender.sendConfirmationEmail(order);
        }
    }

}
Bu mysalda, biziňki OrderProcessoriki sany aýratyn klasa bagly MySQLOrderRepositorywe ConfirmationEmailSender. Şeýle hem bu synplaryň koduny hödürleýäris:
public class MySQLOrderRepository {
    public boolean save(Order order) {
        MySqlConnection connection = new MySqlConnection("database.url");
        // save the order to the database

        return true;
    }
}

public class ConfirmationEmailSender {
    public void sendConfirmationEmail(Order order) {
        String name = order.getCustomerName();
        String email = order.getCustomerEmail();

        // Sending a letter to the client
    }
}
Bu synplar abstrakt diýmekden uzak. DIP ýörelgesiniň nukdaýnazaryndan, belli bir ýerine ýetirişler bilen däl-de, geljekde olar bilen işlemäge mümkinçilik berjek käbir abstraksiýalary döretmekden başlamak has dogry bolardy. Geliň, iki sany interfeýs döredeliň MailSenderwe OrderRepositoryabstraktlarymyza öwrüler:
public interface MailSender {
    void sendConfirmationEmail(Order order);
}

public interface OrderRepository {
    boolean save(Order order);
}
Indi bu interfeýsleri eýýäm taýyn synplarda durmuşa geçireliň:
public class ConfirmationEmailSender implements MailSender {

    @Override
    public void sendConfirmationEmail(Order order) {
        String name = order.getCustomerName();
        String email = order.getCustomerEmail();

        // Sending a letter to the client
    }

}

public class MySQLOrderRepository implements OrderRepository {

    @Override
    public boolean save(Order order) {
        MySqlConnection connection = new MySqlConnection("database.url");
        // save the order to the database

        return true;
    }
}
OrderProcessorSynpymyz anyk jikme-jikliklere däl-de, abstraktlara bagly bolar ýaly taýýarlyk işlerini etdik . Synp konstruktoryna garaşlylygymyzy girizip, oňa üýtgeşmeler girizeliň:
public class OrderProcessor {

    private MailSender mailSender;
    private OrderRepository repository;

    public OrderProcessor(MailSender mailSender, OrderRepository repository) {
        this.mailSender = mailSender;
        this.repository = repository;
    }

    public void process(Order order){
        if (order.isValid() && repository.save(order)) {
            mailSender.sendConfirmationEmail(order);
        }
    }
}
Biziň synpymyz indi anyk durmuşa geçirmäge däl-de, abstraktlara bagly. Mysal döredilen wagty islenýän garaşlylygy sanjyp, özüni alyp barşyny aňsatlyk bilen üýtgedip bilersiňiz OrderProcessor. Java-da SOLID - dizaýn ýörelgelerine göz aýladyk. Umuman OOP hakda has giňişleýin, bu programmirleme diliniň esaslary - içgysgynç däl we ýüzlerçe sagat tejribe bilen - JavaRush kursynda. Käbir meseleleri çözmegiň wagty :) Java-da synp dizaýnynyň bäş esasy ýörelgesi (SOLID) - 2
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION