Isimiso Sokuzibophezela Okukodwa. Akulula njengoba kubonakala

Isimiso Sokuzibophezela Okukodwa. Akulula njengoba kubonakala Umgomo wesibopho esisodwa, owaziwa nangokuthi umgomo wokuzibophezela okukodwa,
aka umgomo wokuhlukahluka okufanayo - insizwa eshelelayo kakhulu okufanele iqonde kanye nombuzo othuthumelayo kunhlolokhono yomhleli.

Ukwazana kwami ​​kokuqala okujulile nalesi simiso kwenzeka ekuqaleni konyaka wami wokuqala, lapho abasha nabaluhlaza beyiswa ehlathini ukuze benze abafundi bangempela ngezibungu.

Ehlathini, sasihlukaniswe ngamaqembu abantu abangu-8-9 ngamunye futhi saba nomncintiswano - yiliphi iqembu elizophuza ibhodlela le-vodka ngokushesha kakhulu, inqobo nje uma umuntu wokuqala weqembu ethela i-vodka engilazini, owesibili ayiphuze, kanti eyesithathu inokudla okulula. Iyunithi eqede ukusebenza kwayo iya ekugcineni komugqa weqembu.

Icala lapho usayizi womugqa ubuphindaphindeka kokuthathu kwaba ukuqaliswa okuhle kwe-SRP.

Incazelo 1. Isibopho esisodwa.

Incazelo esemthethweni Yomgomo Wokuzibophezela Okukodwa (SRP) ithi ibhizinisi ngalinye linomthwalo walo kanye nesizathu sokuba khona, futhi linomthwalo wemfanelo owodwa kuphela.

Cabangela into ethi “Drinker” (I-Tippler).
Ukuze sisebenzise umgomo we-SRP, sizohlukanisa izibopho zibe ezintathu:

  • Omunye uyathela (I-PourOperation)
  • Isiphuzo esisodwa (I-DrinkUpOperation)
  • Omunye unesnack (I-TakeBiteOperation)

Ngamunye wabahlanganyeli kule nqubo unesibopho sengxenye eyodwa yenqubo, okungukuthi, unomthwalo wemfanelo owodwa we-athomu - ukuphuza, ukuthulula noma ukudla okulula.

Imbobo yokuphuza, yona, iyi-facade yale misebenzi:

сlass Tippler {
    //...
    void Act(){
        _pourOperation.Do() // налить
        _drinkUpOperation.Do() // выпить
        _takeBiteOperation.Do() // закусить
    }
}

Isimiso Sokuzibophezela Okukodwa. Akulula njengoba kubonakala

Kungani?

Umhleli womuntu ubhalela inkawu ikhodi, kanti inkawu ayinaki, iyisiphukuphuku futhi ihlale ijahile. Angakwazi ukubamba futhi aqonde mayelana namatemu angu-3 - 7 ngesikhathi esisodwa.
Endabeni yotshwala, mathathu la magama. Kodwa-ke, uma sibhala ikhodi ngeshidi elilodwa, khona-ke izoqukatha izandla, izibuko, ukulwa nezingxabano ezingapheli mayelana nezombusazwe. Futhi konke lokhu kuzoba emzimbeni wendlela eyodwa. Ngiyaqiniseka ukuthi uyibonile ikhodi enjalo ekusebenzeni kwakho. Akuyona isivivinyo esinobuntu kakhulu se-psyche.

Ngakolunye uhlangothi, indoda yenkawu iklanyelwe ukulingisa izinto zomhlaba wangempela ekhanda layo. Emcabangweni wakhe, angakwazi ukuzihlanganisa, ahlanganise izinto ezintsha kuzo, futhi aziqaqa ngendlela efanayo. Cabanga ngemoto endala eyimodeli. Ngomcabango wakho, ungavula umnyango, uvule isikulufu sesicabha futhi ubone lapho amafasitela okusebenza, okuzoba namagiya ngaphakathi. Kodwa awukwazi ukubona zonke izingxenye zomshini ngesikhathi esifanayo, "kuhlu" olulodwa. Okungenani "indoda yenkawu" ayikwazi.

Ngakho-ke, abahleli bezinhlelo abangabantu babola izindlela eziyinkimbinkimbi zibe isethi yezinto ezingaxakile nezisebenzayo. Kodwa-ke, ingabola ngezindlela ezahlukene: ezimotweni eziningi ezindala, i-air duct ingena emnyango, futhi ezimotweni zanamuhla, ukwehluleka kwe-elekthronikhi yokukhiya kuvimbela injini ukuthi iqale, okungaba yinkinga ngesikhathi sokulungiswa.

Manje, I-SRP iyisimiso esichaza INDLELA yokubola, okungukuthi, lapho ukudweba umugqa ohlukanisayo.

Uthi kuyadingeka ukubola ngokuvumelana nesimiso sokuhlukaniswa "kwemfanelo," okungukuthi, ngokusho kwemisebenzi yezinto ezithile.

Isimiso Sokuzibophezela Okukodwa. Akulula njengoba kubonakala

Ake sibuyele ekuphuzeni kanye nezinzuzo ezitholwa indoda yenkawu ngesikhathi sokubola:

  • Ikhodi isicace ngokwedlulele kuwo wonke amazinga
  • Ikhodi ingabhalwa abahleli abaningi ngesikhathi esisodwa (ngamunye ubhala into ehlukile)
  • Ukuhlola okuzenzakalelayo kwenziwa lula - into elula, kuba lula ukuyihlola
  • Ukwakheka kwekhodi kubonakala - ungashintsha I-DrinkUpOperation ekuhlinzweni lapho isidakwa sithela uketshezi ngaphansi kwetafula. Noma buyisela umsebenzi wokuthulula ngokuhlinzwa lapho uxuba khona iwayini namanzi noma i-vodka nobhiya. Ngokuya ngezidingo zebhizinisi, ungenza yonke into ngaphandle kokuthinta ikhodi yendlela I-Tippler.Act.
  • Kule misebenzi ungakwazi ukugoqa isiminzi (usebenzisa kuphela I-TakeBitOperation), Utshwala (usebenzisa kuphela I-DrinkUpOperation ngqo kusuka ebhodleleni) futhi uhlangabezane nezinye izidingo zebhizinisi eziningi.

(O, kubonakala sengathi lokhu sekuvele kuwumgomo we-OCP, futhi ngephule isibopho salokhu okuthunyelwe)

Futhi, yiqiniso, i-cons:

  • Kuzodingeka sakhe izinhlobo eziningi.
  • Isidakwa siphuza okokuqala ngemuva kwamahora ambalwa kunalokho ebesingakwenza.

Incazelo 2. Ukuhlukahluka okuhlanganisiwe.

Ngivumeleni madoda! Ikilasi lokuphuza nalo linomthwalo wemfanelo owodwa - liyaphuza! Futhi ngokuvamile, igama elithi "isibopho" liwumqondo ongacacile kakhulu. Kukhona obhekene nesiphetho sesintu, futhi othile unesibopho sokukhulisa amaphengwini agingqike esigxotsheni.

Ake sicabangele ukuqaliswa okubili kophuzi. Eyokuqala, okukhulunywe ngayo ngenhla, iqukethe amakilasi amathathu - uthele, uphuze kanye nokudla okulula.

Eyesibili ibhalwe ngendlela ethi “Phambili futhi Phambili Kuphela” futhi iqukethe wonke ama-logic endleleni Act:

//Не тратьте время  на изучение этого класса. Лучше съешьте печеньку
сlass BrutTippler {
   //...
   void Act(){
        // наливаем
    if(!_hand.TryDischarge(from:_bottle, to:_glass, size:_glass.Capacity))
        throw new OverdrunkException();

    // выпиваем
    if(!_hand.TryDrink(from: _glass,  size: _glass.Capacity))
        throw new OverdrunkException();

    //Закусываем
    for(int i = 0; i< 3; i++){
        var food = _foodStore.TakeOrDefault();
        if(food==null)
            throw new FoodIsOverException();

        _hand.TryEat(food);
    }
   }
}

Zombili lezi zigaba, ngokombono womuntu obukele ngaphandle, zibukeka zifana ncamashi futhi zihlanganyela umthwalo ofanayo "wokuphuza".

Ukudideka!

Bese singena ku-inthanethi futhi sithole enye incazelo ye-SRP - Isimiso Sokuguquguquka Okukodwa.

I-SCP ithi "Imojuli inesizathu esisodwa futhi esisodwa kuphela sokushintsha". Okusho ukuthi, "Isibopho siyisizathu soshintsho."

(Kubukeka sengathi abafana abaqhamuke nencazelo yasekuqaleni babezethemba ngamakhono e-telepathic owesilisa wenkawu)

Manje konke kuhamba kahle. Ngokwehlukana, singashintsha izinqubo zokuthulula, zokuphuza kanye nokudla, kodwa kumuntu ophuzayo ngokwawo singashintsha kuphela ukulandelana nokubunjwa kwemisebenzi, isibonelo, ngokuhambisa isiphuzo ngaphambi kokuphuza noma ukwengeza ukufundwa kwe-toast.

Endleleni ethi “Phambili futhi Phambili kuphela,” yonke into engashintshwa ishintshwa kuphela ngendlela Act. Lokhu kungafundeka futhi kuphumelele uma kunomqondo omncane futhi akuvamisile ukushintsha, kodwa ngokuvamile kuphelela ezindleleni ezimbi zemigqa engu-500 ngamunye, nezitatimende eziningi uma kunesidingo ukuze iRussia ijoyine i-NATO.

Incazelo 3. Ukwenziwa kwasendaweni kwezinguquko.

Abaphuza ngokuvamile abaqondi ukuthi kungani bevukele endlini yomunye umuntu, noma lapho umakhalekhukhwini wabo ukuphi. Isikhathi sokungeza ukugawulwa kwemithi enemininingwane.

Ake siqale ukugawula ngenqubo yokuthulula:

class PourOperation: IOperation{
    PourOperation(ILogger log /*....*/){/*...*/}
    //...
    void Do(){
        _log.Log($"Before pour with {_hand} and {_bottle}");
        //Pour business logic ...
        _log.Log($"After pour with {_hand} and {_bottle}");
    }
}

Ngokuyihlanganisa I-PourOperation, senza ngokuhlakanipha ngokombono wemfanelo kanye ne-encapsulation, kodwa manje sididekile nomgomo wokuhlukahluka. Ngaphezu kokusebenza ngokwayo, okungashintsha, ukugawulwa kwemithi ngokwako nakho kuyashintsha. Kuzodingeka uhlukanise futhi udale i-logger ekhethekile yokusebenza kokuthulula:

interface IPourLogger{
    void LogBefore(IHand, IBottle){}
    void LogAfter(IHand, IBottle){}
    void OnError(IHand, IBottle, Exception){}
}

class PourOperation: IOperation{
    PourOperation(IPourLogger log /*....*/){/*...*/}
    //...
    void Do(){
        _log.LogBefore(_hand, _bottle);
        try{
             //... business logic
             _log.LogAfter(_hand, _bottle");
        }
        catch(exception e){
            _log.OnError(_hand, _bottle, e)
        }
    }
}

Ofunda ngokucophelela uzokubona lokho LogAfter, Ngena Ngaphambi и I-OneError ingashintshwa futhi ngayinye, futhi, ngokufanisa nezinyathelo ezedlule, izodala amakilasi amathathu: I-PourLoggerNgaphambili, I-PourLoggerAfter и I-PourErrorLogger.

Futhi sikhumbula ukuthi kunemisebenzi emithathu yokuhlinzwa komuntu ophuzayo, sithola amakilasi ayisishiyagalolunye okugawula imithi. Ngenxa yalokho, wonke umbuthano wokuphuza uqukethe amakilasi angu-14 (!!!).

I-Hyperbola? Nakancane! Indoda yenkawu enebhomu lokubola izohlukanisa "i-pourer" ibe yi-decanter, ingilazi, i-opharetha yokuthulula, insizakalo yokuphakela amanzi, imodeli ebonakalayo yokushayisana kwama-molecule, futhi engxenyeni elandelayo izozama ukuqaqa ukuncika ngaphandle. eziguquguqukayo global. Futhi ungikholwe, ngeke ayeke.

Kungalesi sikhathi lapho abaningi befika esiphethweni sokuthi i-SRP iyizinganekwane ezivela emibusweni ephinki, bese behamba bayodlala ama-noodle...

... ngaphandle kokufunda mayelana nokuba khona kwencazelo yesithathu ye-Srp:

“ISingle Responsibility Principle ithi izinto ezifana noshintsho kufanele zigcinwe endaweni eyodwa". noma "Iziphi izinguquko ndawonye kufanele zigcinwe endaweni eyodwa"

Okusho ukuthi, uma sishintsha ukugawulwa kokusebenza, kufanele sikushintshe endaweni eyodwa.

Leli phuzu elibaluleke kakhulu - njengoba zonke izincazelo ze-SRP ezazingenhla zathi kwakudingeka ukuchoboza izinhlobo ngenkathi zichotshozwa, okungukuthi, babeka "umkhawulo ongaphezulu" ngobukhulu bento, futhi manje. sesivele sikhuluma "ngomkhawulo ophansi" . Ngamanye amazwi, I-SRP ayidingi nje kuphela "ukuchotshozwa ngenkathi uchoboza", kodwa futhi ungayidlulisi - "ungachobozi izinto ezihlanganisiwe". Lena impi enkulu phakathi kwensingo ka-Occam nemfene!

Isimiso Sokuzibophezela Okukodwa. Akulula njengoba kubonakala

Manje ophuzayo kufanele azizwe engcono. Ngaphezu kweqiniso lokuthi asikho isidingo sokuhlukanisa i-IPourLogger logger ibe amakilasi amathathu, singakwazi futhi ukuhlanganisa bonke abagawuli zibe uhlobo olulodwa:

class OperationLogger{
    public OperationLogger(string operationName){/*..*/}
    public void LogBefore(object[] args){/*...*/}       
    public void LogAfter(object[] args){/*..*/}
    public void LogError(object[] args, exception e){/*..*/}
}

Futhi uma sengeza uhlobo lwesine lokusebenza, khona-ke ukugawulwa kwayo sekuvele kulungile. Futhi ikhodi yemisebenzi ngokwayo ihlanzekile futhi ayinawo umsindo wengqalasizinda.

Ngenxa yalokho, sinezigaba ezi-5 zokuxazulula inkinga yokuphuza:

  • Ukuthulula ukusebenza
  • Ukusebenza kokuphuza
  • Ukusebenza kwe-Jamming
  • Umgawuli
  • I-facade yesiphuzo

Ngamunye wabo unesibopho esiqinile somsebenzi owodwa futhi unesizathu esisodwa soshintsho. Yonke imithetho efana noshintsho itholakala eduze.

Isibonelo sempilo yangempela

Sake sabhala isevisi yokubhalisa ngokuzenzakalelayo iklayenti le-b2b. Futhi kwavela indlela kaNKULUNKULU yemigqa engama-200 yokuqukethwe okufanayo:

  • Iya ku-1C bese udala i-akhawunti
  • Ngale akhawunti, hamba kumojula yokukhokha bese uyidala lapho
  • Hlola ukuthi i-akhawunti ene-akhawunti enjalo ayizange idaliwe yini kuseva enkulu
  • Dala i-akhawunti entsha
  • Engeza imiphumela yokubhalisa kumojuli yokukhokha kanye nenombolo engu-1c kusevisi yemiphumela yokubhalisa
  • Engeza ulwazi lwe-akhawunti kuleli thebula
  • Dala inombolo yephoyinti yaleli klayenti kusevisi yephoyinti. Dlulisa inombolo ye-akhawunti yakho ye-1c kule sevisi.

Futhi bekukhona imisebenzi yebhizinisi engaphezulu kwe-10 kulolu hlu enoxhumano olubi. Cishe wonke umuntu wayedinga into ye-akhawunti. I-ID yephoyinti negama leklayenti bekudingeka engxenyeni yezingcingo.

Ngemuva kwehora lokuphinda kwenziwe kabusha, sikwazile ukuhlukanisa ikhodi yengqalasizinda kanye namanye ama-nuances okusebenza ne-akhawunti ngezindlela/amakilasi ahlukene. Indlela kaNkulunkulu yenza kwaba lula, kodwa kwakusele imigqa yekhodi eyi-100 eyayingafuni nje ukuqaqelwa.

Kuphela ngemva kwezinsuku ezimbalwa kwacaca ukuthi ingqikithi yale ndlela "elula" i-algorithm yebhizinisi. Futhi ukuthi incazelo yasekuqaleni yemininingwane yobuchwepheshe yayiyinkimbinkimbi impela. Futhi kungumzamo wokuphula le ndlela ibe yizicucu ezizophula i-SRP, hhayi ngokuphambene nalokho.

Ukuhleleka.

Sekuyisikhathi sokuthi sihambe sidakiwe. Sula izinyembezi zakho - nakanjani sizobuyela kukho ngolunye usuku. Manje ake senze ngokusemthethweni ulwazi oluvela kulesi sihloko.

Ukuhleleka 1. Incazelo ye-SRP

  1. Hlukanisa izakhi ukuze ngamunye wabo abe nesibopho sento eyodwa.
  2. Isibopho simele "isizathu sokushintsha." Okusho ukuthi, isici ngasinye sinesizathu esisodwa kuphela soshintsho, ngokuya ngengqondo yebhizinisi.
  3. Izinguquko ezingaba khona kumqondo webhizinisi. kumele kube okwasendaweni. Ama-elementi ashintsha ngokuhambisanayo kufanele abe seduze.

Ukuhleleka 2. Imibandela edingekayo yokuzihlola.

Angikayiboni indlela eyanele yokugcwalisa i-SRP. Kodwa kunezimo ezidingekayo:

1) Zibuze ukuthi le klasi/indlela/module/isevisi yenzani. kufanele uyiphendule ngencazelo elula. ( Ngiyabonga Brightori )

izincazelo

Nokho, ngezinye izikhathi kunzima kakhulu ukuthola incazelo elula

2) Ukulungisa iphutha noma ukwengeza isici esisha kuthinta inani elincane lamafayela/amakilasi. Okungcono - eyodwa.

izincazelo

Njengoba umthwalo wemfanelo (wesici noma iphutha) uhlanganiswe efayeleni/ekilasini elilodwa, wazi kahle ukuthi kufanele ubheke kuphi nokuthi yini okufanele uyihlele. Isibonelo: isici sokushintsha okukhiphayo kwemisebenzi yokugawulwa kwemithi sizodinga ukushintsha isigawuli kuphela. Asikho isidingo sokugijima kuyo yonke enye ikhodi.

Esinye isibonelo ukungeza isilawuli se-UI esisha, esifana nangaphambili. Uma lokhu kukuphoqa ukuthi ungeze amabhizinisi ahlukene angu-10 kanye neziguquli ezihlukene ezingu-15, kubukeka sengathi uyenza ngokweqile.

3) Uma abathuthukisi abaningana besebenzela izici ezihlukene zephrojekthi yakho, khona-ke amathuba okuhlanganisa ingxabano, okungukuthi, amathuba okuthi ifayela/ikilasi elifanayo lizoshintshwa onjiniyela abambalwa ngesikhathi esisodwa, mancane.

izincazelo

Uma, lapho ungeza umsebenzi omusha "Thela i-vodka ngaphansi kwetafula", udinga ukuthinta i-logger, ukusebenza kokuphuza nokuthulula, khona-ke kubonakala sengathi imithwalo yemfanelo ihlukaniswe ngokuphambene. Yiqiniso, lokhu akunakwenzeka ngaso sonke isikhathi, kodwa kufanele sizame ukunciphisa lesi sibalo.

4) Lapho ubuzwa umbuzo ocacisayo mayelana nengqondo yebhizinisi (kusuka kunjiniyela noma umphathi), ungena ngokuqinile ekilasini/efayela futhi uthole ulwazi olusuka lapho kuphela.

izincazelo

Izici, imithetho noma ama-algorithms abhalwa ngokubumbana, ngakunye endaweni eyodwa, futhi awasakazwa ngamafulegi endaweni yonke yekhodi.

5) Ukuqamba kucacile.

izincazelo

Ikilasi lethu noma indlela yethu inesibopho sento eyodwa, futhi umthwalo wemfanelo ubonakala egameni layo

AllManagersManagerService - cishe isigaba sikaNkulunkulu
I-LocalPayment - mhlawumbe akunjalo

Ukuhleleka 3. Indlela yokuthuthukisa ye-Occam-first.

Ekuqaleni kokuklama, indoda yenkawu ayazi futhi akuzwa konke ubuqili inkinga ixazululwa futhi angenza iphutha. Ungenza amaphutha ngezindlela ezahlukene:

  • Yenza izinto zibe zinkulu kakhulu ngokuhlanganisa izibopho ezihlukene
  • Ukwenza kabusha uhlaka ngokuhlukanisa umthwalo owodwa ube yizinhlobo eziningi ezahlukene
  • Chaza ngokungalungile imingcele yesibopho

Kubalulekile ukukhumbula umthetho: "kungcono ukwenza iphutha elikhulu," noma "uma ungaqiniseki, ungalihlukanisi." Uma, isibonelo, ikilasi lakho liqukethe izibopho ezimbili, lisaqondakala futhi lingahlukaniswa libe kabili ngezinguquko ezincane kukhodi yeklayenti. Ukuhlanganisa ingilazi kusuka ku-shards of glass glass ngokuvamile kunzima kakhulu ngenxa yomongo osakazwa kuwo wonke amafayela amaningana kanye nokuntuleka kokuncika okudingekayo kukhodi yeklayenti.

Isikhathi sokubiza usuku

Ububanzi be-SRP abakhawulelwe ku-OOP kanye ne-SOLID. Kusebenza ezindleleni, emisebenzini, kumakilasi, kumamojula, kuma-microservices namasevisi. Kusebenza kukho kokubili ukuthuthukiswa kwe-"figax-figax-and-prod" kanye "nesayensi yerokhethi", okwenza umhlaba ube ngcono kancane yonke indawo. Uma ucabanga ngakho, lesi cishe isimiso esiyisisekelo sabo bonke ubunjiniyela. Ubunjiniyela bemishini, amasistimu okulawula, kanye nawo wonke amasistimu ayinkimbinkimbi akhiwa ezingxenyeni ezithile, futhi “ukuhlukaniswa okuncane” kuncisha abaklami ukuguquguquka, “ukuhlukana ngokweqile” kuncisha abaklami ukusebenza kahle, futhi imingcele engalungile ibaphuca ingqondo nokuthula kwengqondo.

Isimiso Sokuzibophezela Okukodwa. Akulula njengoba kubonakala

I-SRP ayisungulwa ngokwemvelo futhi ayiyona ingxenye yesayensi eqondile. Iphuma emikhawulweni yethu yebhayoloji neyengqondo.Iyindlela nje yokulawula kanye nokuthuthukisa izinhlelo eziyinkimbinkimbi kusetshenziswa ubuchopho bomuntu wenkawu. Usitshela indlela yokubola uhlelo. Ukwakhiwa kwangempela kudinga inani elifanelekile le-telepathy, kodwa ngithemba ukuthi lesi sihloko sisusa esinye isikrini somusi.

Source: www.habr.com

Engeza amazwana