JavaRush /Блоги Java /Random-TG /Панҷ Принсипҳои асосии тарҳрезии синф (SOLID) дар Java
Ve4niY
Сатҳи

Панҷ Принсипҳои асосии тарҳрезии синф (SOLID) дар Java

Дар гурӯҳ нашр шудааст
Синфҳо блокҳое мебошанд, ки аз онҳо барнома сохта мешавад. Мисли хиштхои бино. Дарсҳои бад навишташуда метавонанд рӯзе мушкилот эҷод кунанд. Панҷ Принсипҳои асосии тарҳрезии синф (SOLID) дар Java - 1Барои фаҳмидани он ки оё синф дуруст навишта шудааст, шумо метавонед "стандартҳои сифат" -ро тафтиш кунед. Дар Java, инҳо ба истилоҳ принсипҳои SOLID мебошанд. Биёед дар бораи онҳо сӯҳбат кунем.

Принсипҳои SOLID дар Java

SOLID ихтисоротест, ки аз ҳарфҳои калони панҷ принсипи OOP ва тарроҳӣ сохта шудааст. Принсипҳоро дар аввали солҳои 2000-ум Роберт Мартин ихтироъ карда буд ва ин ихтисорро баъдтар Майкл Фэрс таҳия кардааст. Принсипҳои SOLID инҳоянд:
  1. Принсипи масъулиятшиносии ягона.
  2. Принсипи пӯшидаи кушода.
  3. Принсипи ивазкунии Лисков.
  4. Принсипи сегрегатсияи интерфейс.
  5. Принсипи инversionи вобастагӣ.

Принсипи масъулияти ягона (SRP)

Ин принсип мегӯяд, ки ҳеҷ гоҳ набояд беш аз як сабаб барои тағир додани синф вуҷуд дошта бошад. Ҳар як an object як масъулият дорад, ки комилан дар синф фаро гирифта шудааст. Тамоми хидматҳои синфӣ ба таъмини ин масъулият нигаронида шудаанд. Чунин синфҳоро дар ҳолати зарурӣ тағир додан ҳамеша осон хоҳад буд, зеро маълум аст, ки синф барои чӣ масъул аст ва чӣ не. Яъне, имкон пайдо мешавад, ки тағирот ворид карда, аз оқибатҳои он - таъсир ба дигар an objectҳо натарсад. Ва санҷиши чунин code хеле осонтар аст, зеро шумо як функсияро бо санҷишҳо дар алоҳидагӣ аз ҳама дигар фаро мегиред. Модулеро, ки фармоишҳоро коркард мекунад, тасаввур кунед. Агар фармоиш дуруст тартиб дода шуда бошад, он онро дар базаи маълумот захира мекунад ва барои тасдиқи фармоиш почтаи электронӣ мефиристад:
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
    }
}
Чунин модул метавонад бо се сабаб тағйир ёбад. Якум, мантиқи коркарди фармоиш метавонад гуногун бошад, дуюм, усули нигоҳдории он (навъи махзани маълумот), сеюм, усули фиристодани мактуби тасдиқ (масалан, ба ҷои почтаи электронӣ шумо бояд SMS фиристед). Принсипи ягонаи масъулият маънои онро дорад, ки се ҷанбаи ин мушкилот воқеан се масъулияти гуногун мебошанд. Ин маънои онро дорад, ки онҳо бояд дар синфҳо ё модулҳои гуногун бошанд. Якҷоя кардани an objectҳои сершумор, ки метавонанд дар вақтҳои гуногун ва бо сабабҳои гуногун тағир ёбанд, як қарори тарроҳии бад ҳисобида мешавад. Модулро ба се модули алоҳида тақсим кардан беҳтар аст, ки ҳар яки онҳо як вазифаи ягонаро иҷро мекунанд:
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);
        }
    }

}

Принсипи кушода/пўшида (OCP)

Ин принсип ба таври мухтасар ба таври зайл тавсиф карда мешавад: an objectҳои нармафзор (синфҳо, модулҳо, функсияҳо ва ғ.) бояд барои васеъшавӣ кушода бошанд, аммо барои тағирот баста бошанд . Ин маънои онро дорад, ки бояд рафтори берунии синфро бидуни ворид кардани тағйироти ҷисмонӣ ба худи синф тағир додан мумкин бошад. Бо риояи ин принсип синфҳо тавре таҳия карда мешаванд, ки барои мутобиқ кардани синф ба шароити мушаххаси татбиқ, васеъ кардани он ва аз нав муайян кардани баъзе вазифаҳо кифоя аст. Аз ин рӯ, система бояд чандир бошад, қодир аст дар шароити тағйирёбанда бидуни тағир додани рамзи сарчашма кор кунад. Идомаи намунаи фармоиши мо, биёед бигӯем, ки мо бояд пеш аз коркарди фармоиш ва пас аз фиристодани паёми тасдиқи почтаи электронӣ баъзе амалҳоро иҷро кунем. Ба ҷои тағир додани худи синф OrderProcessor, мо онро васеъ мекунем ва бидуни вайрон кардани принсипи OCP ба ҳалли мушкилоти мавҷуда ноил мешавем:
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
    }
}

Принсипи ивазкунии Барбара Лисков (LSP)

Ин як варианти принсипи кушода/пўшида аст, ки дар боло баррасӣ шуд. Онро ба таври зайл тавсиф кардан мумкин аст: an objectњои барномаро бе таѓйир додани хосиятњои программа бо ворисони онњо иваз кардан мумкин аст. Ин маънои онро дорад, ки синфе, ки тавассути васеъ кардани синфи базавӣ таҳия шудааст, бояд усулҳои худро тавре аз назар гузаронад, ки функсияро аз нуқтаи назари муштарӣ вайрон накунад. Яъне, агар таҳиякунанда синфи шуморо васеъ кунад ва онро дар барнома истифода барад, ӯ набояд рафтори интизории усулҳои бекоршударо тағир диҳад. Зерсинфҳо бояд усулҳои синфи асосиро тавре аз назар гузаронанд, ки функсияҳоро аз нуқтаи назари муштарӣ вайрон накунанд. Инро метавон бо истифода аз мисоли зерин муфассал баррасӣ кард. Фарз мекунем, ки мо синфе дорем, ки барои тасдиқи фармоиш масъул аст ва тафтиш мекунад, ки оё ҳама ашёи фармоиш дар захира ҳастанд. Ин синф усуле дорад , ки true ё false -роisValid бармегардонад :
public class OrderStockValidator {

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

        return true;
    }
}
Биёед инчунин фарз кунем, ки баъзе фармоишҳо бояд ба таври дигар тасдиқ карда шаванд: тафтиш кунед, ки оё ҳама молҳои фармоиш дар анбор ҳастанд ва оё ҳама молҳо баста шудаанд. Барои ин, мо синфро OrderStockValidatorбо синф васеъ кардем 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;
    }
}
Аммо, дар ин синф мо принсипи LSP-ро вайрон кардем, зеро ба ҷои баргардонидани бардурӯғ , агар фармоиш аз санҷиш нагузашта бошад, усули мо истисноро мегузорад IllegalStateException. Мизоҷони ин code инро интизор нестанд: онҳо интизоранд, ки ҳақиқат ё бардурӯғ баргардонида шаванд . Ин метавонад ба хатогиҳо дар барнома оварда расонад.

Принсипи тақсимоти интерфейс (ISP)

Бо изҳороти зерин тавсиф мешавад: Мизоҷон набояд маҷбур карда шаванд, ки усулҳоеро истифода баранд, ки онҳо истифода нахоҳанд кард . Принсипи ҷудокунии интерфейс нишон медиҳад, ки интерфейсҳои аз ҳад зиёд "ғафс" бояд ба интерфейсҳои хурдтар ва мушаххастар тақсим карда шаванд, то муштариёни интерфейсҳои хурд танҳо дар бораи усулҳои барои кори онҳо зарурӣ огоҳ бошанд. Дар натиҷа, ҳангоми тағир додани усули интерфейс, муштариёне, ки ин усулро истифода намебаранд, набояд тағир ёбад. Биёед як мисолро дида бароем. Таҳиягар Алекс интерфейси "ҳисобот" -ро эҷод кард ва ду усулро илова кард: generateExcel()ва generatedPdf(). Ҳоло Мизоҷи А мехоҳад ин интерфейсро истифода барад, аммо ӯ ният дорад танҳо гузоришҳои PDF-ро истифода барад, на Excel. Оё ӯ аз ин функсия қаноатманд хоҳад буд? Не. Вай бояд ду усулро татбиқ кунад, ки яке аз онҳо асосан нолозим аст ва танҳо ба шарофати Алекс, тарроҳи нармафзор вуҷуд дорад. Мизоҷ ё интерфейси дигарро истифода мебарад ё майдони Excel-ро холӣ мегузорад. Пас, роҳи ҳал чист? Он аз тақсим кардани интерфейси мавҷуда ба ду интерфейси хурдтар иборат аст. Яке гузориш дар формати PDF, дуюм гузориш дар формати Excel. Ин ба корбар имкон медиҳад, ки танҳо функсияҳои барои ӯ заруриро истифода баранд.

Принсипи инversionи вобастагӣ (DIP)

Ин принсипи SOLID дар Java чунин тавсиф шудааст: вобастагӣ дар система дар асоси абстраксияҳо сохта мешаванд . Модулҳои сатҳи боло аз модулҳои сатҳи поёнӣ новобастаанд. Абстраксияҳо набояд аз тафсилот вобаста бошанд. Тафсилот бояд аз абстраксияҳо вобаста бошад. Нармафзор бояд тавре тарҳрезӣ шавад, ки модулҳои гуногун мустақил бошанд ва бо истифода аз абстраксия ба ҳамдигар пайваст шаванд. Истифодаи классикии ин принсип чаҳорчӯбаи баҳор мебошад. Дар доираи баҳор, ҳама модулҳо ҳамчун ҷузъҳои алоҳида, ки метавонанд якҷоя кор кунанд, амалӣ карда мешаванд. Онҳо чунон мустақиланд, ки онҳоро ба осонӣ дар дигар модулҳои нармафзор ба ғайр аз чаҳорчӯбаи Spring истифода бурдан мумкин аст. Ин тавассути вобастагии принсипҳои пӯшида ва кушода ба даст оварда мешавад. Ҳама модулҳо дастрасиро танҳо ба абстраксия, ки дар модули дигар истифода бурдан мумкин аст, таъмин мекунанд. Биёед кӯшиш кунем, ки инро бо як мисол нишон диҳем. Дар бораи принципи ягонаи масъулият сухан ронда, мо баъзе OrderProcessor. Биёед бори дигар ба рамзи ин синф назар андозем:
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);
        }
    }

}
Дар ин мисол, мо OrderProcessorаз ду синфи мушаххас вобаста аст MySQLOrderRepositoryва ConfirmationEmailSender. Мо инчунин рамзи ин синфҳоро пешниҳод мекунем:
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
    }
}
Ин синфҳоро аз абстраксия номидан дур нестанд. Ва аз нуқтаи назари принсипи DIP, дурусттар мебуд, ки аз эҷоди баъзе абстраксияҳо оғоз кунем, ки ба мо имкон медиҳанд, ки дар оянда бо онҳо кор кунем, на бо татбиқи мушаххас. Биёед ду интерфейсро созем MailSenderва OrderRepository, ки абстраксияҳои мо хоҳанд шуд:
public interface MailSender {
    void sendConfirmationEmail(Order order);
}

public interface OrderRepository {
    boolean save(Order order);
}
Акнун биёед ин интерфейсҳоро дар синфҳое татбиқ кунем, ки аллакай барои ин омодаанд:
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;
    }
}
Мо кори тайёриро тавре анчом додем, ки синфи мо OrderProcessorна ба детальхои конкретй, балки ба абстракцияхо вобаста бошад. Биёед бо ворид кардани вобастагии худ дар созандаи синф ба он тағирот ворид кунем:
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);
        }
    }
}
Синфи мо ҳоло ба абстраксияҳо вобаста аст, на татбиқи мушаххас. Шумо метавонед ба осонӣ рафтори онро тавассути ворид кардани вобастагии дилхоҳ дар вақти сохтани инстансия тағир диҳед OrderProcessor. Мо SOLID - принсипҳои тарроҳиро дар Java дида баромадем. Бештар дар бораи OOP дар маҷмӯъ, асосҳои ин забони барномасозӣ - дилгиркунанда нест ва бо садҳо соат таҷриба - дар курси JavaRush. Вақти ҳалли баъзе мушкилот :) Панҷ Принсипҳои асосии тарҳрезии синф (SOLID) дар Java - 2
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION