UMgaqo woXanduva olunye. Akulula njengoko kubonakala

UMgaqo woXanduva olunye. Akulula njengoko kubonakala Umgaqo woxanduva olunye, owaziwa ngokuba ngumgaqo woxanduva olunye,
aka umgaqo wokuguquguquka okufanayo-umfana omtyibiliki kakhulu ukuba awuqonde kunye nombuzo onje ngovalo kudliwano-ndlebe lomdwelisi.

Ukuqala kwam ukuqhelana ngokunzulu nalo mgaqo kwenzeka ekuqaleni konyaka wokuqala, xa abancinci nabaluhlaza bathatyathwa basiwa ehlathini ukuze benze abafundi be-larvae - abafundi bokwenene.

Ehlathini, sahlulahlulwe sangamaqela abantu abayi-8-9 kwaye saba nokhuphiswano - leliphi iqela eliza kusela ibhotile yevodka ngokukhawuleza, ngaphandle kokuba umntu wokuqala weqela ugalela i-vodka kwiglasi, okwesibini uyayisela, owesithathu ke unesneck. Iyunithi egqibe umsebenzi wayo ihambela ekupheleni komgca weqela.

Imeko apho ubungakanani bomgca buphindwaphindwa kathathu yayikukuphunyezwa kakuhle kwe-SRP.

Inkcazo 1. Uxanduva olunye.

Inkcazo esemthethweni yoMgaqo-siseko woXanduva oluNye (Single Responsibility Principle) (SRP) ichaza ukuba iziko ngalinye linoxanduva lwalo nesizathu sobukho balo, kwaye linoxanduva olunye kuphela.

Cinga ngento ethi "Drinker" (Tippler).
Ukuphumeza umgaqo we-SRP, siya kwahlula uxanduva zibe zithathu:

  • Omnye uyagalela (I-PourOperation)
  • Isiselo esinye (DrinkUpOperation)
  • Omnye unesnack (ThathaBiteOperation)

Ngamnye wabathathi-nxaxheba kwinkqubo unoxanduva lwecandelo elinye lenkqubo, oko kukuthi, unomthwalo omnye we-athomu - ukusela, ukugalela okanye i-snack.

Umngxunya wokusela, nawo, uyindawo yokwenziwa kwale misebenzi:

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

UMgaqo woXanduva olunye. Akulula njengoko kubonakala

Kutheni?

Umcwangcisi womntu ubhala ikhowudi yenkawu-indoda, kwaye i-ape-man ayihoyi, isisidenge kwaye ihlala ingxamile. Unokubamba kwaye aqonde malunga namagama ama-3 - 7 ngexesha elinye.
Kwimeko yenxila, mathathu la magama. Nangona kunjalo, ukuba sibhala ikhowudi ngephepha elinye, ngoko kuya kuba nezandla, iiglasi, ukulwa kunye neengxabano ezingapheliyo malunga nezopolitiko. Kwaye konke oku kuya kuba kumzimba wendlela enye. Ndiqinisekile ukuba uyibonile ikhowudi enjalo ekusebenzeni kwakho. Hayi olona vavanyo lunobuntu lwengqondo.

Kwelinye icala, indoda yemfene yenzelwe ukulinganisa izinto zehlabathi zokwenene entloko yayo. Kwingcinga yakhe, unokuzityhala kunye, adibanise izinto ezintsha kuzo, aze aziqhawule ngendlela efanayo. Yiba nomfanekiso wemoto endala. Kwingcinga yakho, unokuvula ucango, ukhulule isikrufu socango kwaye ubone iindlela zokuphakamisa iifestile, ngaphakathi apho kuya kubakho iigiya. Kodwa awukwazi ukubona onke amacandelo omatshini ngexesha elinye, "kuluhlu" olunye. Ubuncinane "indoda yenkawu" ayikwazi.

Ke ngoko, abadwelisi benkqubo abangabantu babola iindlela ezintsonkothileyo zibe yiseti yezinto ezingantsonkothanga kakhulu nezisebenzayo. Nangona kunjalo, inokubola ngeendlela ezahlukeneyo: kwiimoto ezininzi ezindala, i-air duct ingena emnyango, kwaye kwiimoto zanamhlanje, ukungaphumeleli kwi-electronic lock kuthintela injini ukuba iqalise, enokuba yingxaki ngexesha lokulungiswa.

Ke, I-SRP ngumgaqo ochaza INDLELA yokubola, oko kukuthi, apho uzobe umgca wokuhlula.

Uthi kuyimfuneko ukubola ngokomgaqo wokwahlula "uxanduva," oko kukuthi, ngokwemisebenzi yezinto ezithile.

UMgaqo woXanduva olunye. Akulula njengoko kubonakala

Masibuyele ekuseleni kunye neenzuzo ezifunyanwa yindoda yenkawu ngexesha lokubola:

  • Ikhowudi iye yacaca ngokugqithisileyo kuwo onke amanqanaba
  • Ikhowudi ingabhalwa ngabadwelisi benkqubo abaninzi ngexesha elinye (ngamnye ubhala into eyahlukileyo)
  • Uvavanyo oluzenzekelayo lwenziwe lula - into elula, kulula ukuyivavanya
  • Ukuqulunqwa kwekhowudi kubonakala - ungabuyisela DrinkUpOperation kuqhaqho apho inxila ligalela ulwelo phantsi kwetafile. Okanye buyisela umsebenzi wokugalela ngoqhaqho apho uxuba iwayini kunye namanzi okanye ivodka kunye nebhiya. Ngokuxhomekeke kwiimfuno zoshishino, unokwenza yonke into ngaphandle kokuchukumisa ikhowudi yendlela Tippler.Act.
  • Ukusuka kule misebenzi ungasonga idlakudla (usebenzisa kuphela ThathaBitOperation), Utywala (usebenzisa kuphela DrinkUpOperation ngqo kwibhotile) kwaye uhlangabezane nezinye iimfuno ezininzi zeshishini.

(Owu, kubonakala ngathi lo sele umgaqo we-OCP, kwaye ndaphula uxanduva lwesi sithuba)

Kwaye, ngokuqinisekileyo, iingxaki:

  • Kuya kufuneka senze iindidi ezininzi.
  • Umntu onxilileyo usela okokuqala emva kweeyure ezimbalwa kunokuba ebeya kuba nakho.

Inkcazo 2. Ukuguquguquka okumanyeneyo.

Ndivumeleni, madoda! Iklasi yokusela nayo inoxanduva olunye - iyasela! Kwaye ngokubanzi, igama elithi "uxanduva" ngumbono ongacacanga kakhulu. Kukho umntu onoxanduva lwekamva loluntu, kwaye kukho umntu onoxanduva lokuphakamisa iiphengwini eziye zabhukuqwa epalini.

Makhe siqwalasele ukuphunyezwa kwezinto ezimbini zomntu oselayo. Eyokuqala, ekhankanywe ngasentla, iqulethe iiklasi ezintathu - ukuthulula, ukusela kunye ne-snack.

Eyesibini ibhalwe ngendlela ethi "Phambili kwaye kuphela Phambili" kwaye iqulethe yonke ingqiqo kwindlela isenzo:

//Не тратьте время  на изучение этого класса. Лучше съешьте печеньку
с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);
    }
   }
}

Zombini ezi klasi, ukusuka kwindawo yokujonga umkhangeli wangaphandle, zikhangeleka ngokufanayo kwaye zabelana ngoxanduva olufanayo "lokusela".

Ukubhideka!

Emva koko siye kwi-intanethi kwaye sifumane enye inkcazo ye-SRP-uMgaqo wokuTshintsha omnye.

I-SCP ithi "Imodyuli inesizathu esinye kwaye esinye kuphela sokutshintsha". Oko kukuthi, "Uxanduva sisizathu sokutshintsha."

(Kubonakala ngathi abafana abeza nenkcazo yokuqala babezithembile kwizakhono ze-telepathic zendoda yenkawu)

Ngoku yonke into iyahamba. Ngokwahlukileyo, sinokutshintsha ukuthulula, ukusela kunye neenkqubo zokusela, kodwa kwisiselo ngokwawo sinokutshintsha kuphela ukulandelelana kunye nokubunjwa kwemisebenzi, umzekelo, ngokuhambisa i-snack ngaphambi kokusela okanye ukongeza ukufundwa kwe-toast.

Kwindlela ethi "Phambili kunye nePhambili kuphela", yonke into enokuthi iguqulwe iguqulwa kuphela kwindlela isenzo. Oku kunokufundeka kwaye kusebenze xa kukho ingqiqo encinci kwaye ayifane itshintshe, kodwa ihlala iphelela kwiindlela ezimbi zemigca ye-500 nganye, kunye neengxelo ezininzi ze-if kunokuba zifunekayo ukuze iRashiya ijoyine i-NATO.

Inkcazo 3. Ukutshintshwa kweenguqu.

Abaselayo bahlala bengasiqondi isizathu sokuba bavukele kwigumbi lomnye umntu, okanye iphi ifowuni yabo ephathwayo. Lixesha lokuba wongeze iinkcukacha zokugawulwa kwemithi.

Masiqale ukugawula ngenkqubo yokugalela:

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}");
    }
}

Ngokuyigquma ngaphakathi I-PourOperation, senze ngobulumko kwimbono yoxanduva kunye ne-encapsulation, kodwa ngoku sididekile nomgaqo wokuguquguquka. Ukongeza kwintsebenzo ngokwayo, enokuthi itshintshe, ukugawulwa kwemithi ngokwayo kuya kutshintsha. Kuya kufuneka wahlule kwaye wenze i-logger ekhethekileyo yomsebenzi wokuthulula:

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)
        }
    }
}

Umfundi ochubekileyo uyakuqaphela oko LogAfter, LogBefore и OneError inokutshintshwa ngokwahlukeneyo, kwaye, ngokufanisa namanyathelo angaphambili, iya kudala iiklasi ezintathu: PourLoggerNgaphambi, I-PourLoggerAfter и PourErrorLogger.

Kwaye sikhumbula ukuba kukho utyando oluthathu lomntu oselayo, sifumana iiklasi ezilithoba zokugawula imithi. Ngenxa yoko, yonke isangqa sokusela iqukethe iiklasi ze-14 (!!!).

Hyperbola? Akunjalo! Indoda yenkawu ene-grenade yokubola iya kwahlula "i-pourer" ibe yi-decanter, iglasi, i-opharetha yokuthulula, inkonzo yokubonelela ngamanzi, imodeli ebonakalayo yokungqubana kweemolekyuli, kwaye kwikota elandelayo uya kuzama ukuphazamisa ukuxhomekeka ngaphandle kokuxhomekeka. ezahlukeneyo zehlabathi. Kwaye ndikholelwe, akayi kuyeka.

Kungelo xesha apho abaninzi beza kwisigqibo sokuba i-SRP ziintsomi ezivela kwizikumkani ezipinki, kwaye zihambe ziye kudlala ii-noodles...

... ngaphandle kokufunda malunga nobukho benkcazo yesithathu ye-Srp:

“UMgaqo woXanduva oluNye uthi izinto ezifana notshintsho kufuneka zigcinwe kwindawo enye". okanye "Loluphi utshintsho oludibeneyo kufuneka lugcinwe kwindawo enye"

Oko kukuthi, ukuba sitshintsha ukugawulwa kwemithi, kufuneka siyitshintshe kwindawo enye.

Le ngongoma ebaluleke kakhulu - ekubeni zonke iinkcazo ze-SRP ezazingasentla zathi kwakuyimfuneko ukutyumza iintlobo ngelixa zityunyuzwa, oko kukuthi, babeka "umda ophezulu" kubukhulu bento, kwaye ngoku. sele sithetha "ngomda ophantsi" . Ngamanye amazwi, I-SRP ayifuni kuphela "ukutyumza ngelixa utyumza", kodwa kwaye ungayigqithisi- "musa ukutyumza izinto ezidibeneyo". Eli lidabi elikhulu phakathi kwencakuba kaOccam kunye nendoda yemfene!

UMgaqo woXanduva olunye. Akulula njengoko kubonakala

Ngoku lowo uselayo kufuneka azive engcono. Ukongeza kwinto yokuba akukho mfuneko yokwahlula i-IPourLogger kwi-logger kwiiklasi ezintathu, sinokudibanisa zonke iilogi zibe luhlobo olunye:

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

Kwaye ukuba songeza uhlobo lwesine lokusebenza, ke ukugawulwa kwayo sele ilungile. Kwaye ikhowudi yemisebenzi ngokwayo icocekile kwaye ayinangxolo yeziseko zophuhliso.

Ngenxa yoko, sineeklasi ezi-5 zokusombulula ingxaki yokusela:

  • Umsebenzi wokugalela
  • Ukusela ukusebenza
  • Ukusebenza kweJamming
  • Logger
  • I-facade yesiselo

Ngamnye wabo unoxanduva ngokungqongqo lomsebenzi omnye kwaye unesizathu esinye sokutshintsha. Yonke imithetho efana notshintsho ikufuphi.

Umzekelo wobomi bokwenyani

Sakhe sabhala inkonzo yokubhalisa ngokuzenzekelayo umxhasi we-b2b. Kwaye kwavela indlela kaTHIXO yemigca engama-200 yomxholo ofanayo:

  • Yiya ku-1C kwaye wenze i-akhawunti
  • Ngale akhawunti, yiya kwimodyuli yentlawulo kwaye uyenze apho
  • Khangela ukuba iakhawunti eneakhawunti enjalo ayenziwanga kumncedisi oyintloko
  • Yenza iakhawunti entsha
  • Yongeza iziphumo zobhaliso kwimodyuli yentlawulo kunye nenombolo ye-1c kwinkonzo yeziphumo zobhaliso
  • Yongeza ulwazi lwe-akhawunti kule theyibhile
  • Yenza inombolo yenqaku kulo mxhasi kwinkonzo yenqaku. Dlulisa inombolo ye-akhawunti yakho ye-1c kule nkonzo.

Kwaye kukho malunga ne-10 imisebenzi yeshishini ngaphezulu kolu luhlu ngonxibelelwano olubi. Phantse wonke umntu wayefuna into yeakhawunti. I-ID yenqaku kunye negama lomxhasi lalifuneka kwisiqingatha seminxeba.

Emva kweyure yokuhlaziya, sakwazi ukwahlula ikhowudi yeziseko zophuhliso kunye nezinye zeempawu zokusebenza kunye ne-akhawunti kwiindlela ezahlukeneyo / iiklasi. Indlela kaThixo yenza kwaba lula, kodwa kwakukho imigca yekhowudi eyi-100 eshiyekileyo engafuni nje ukuqhathwa.

Kuphela emva kweentsuku ezimbalwa kwacaca ukuba ingundoqo yale ndlela "elula" yi-algorithm yezoshishino. Kwaye inkcazo yokuqala yeenkcukacha zobugcisa yayinzima kakhulu. Kwaye ngumzamo wokuphula le ndlela ibe ngamaqhekeza aya kuphula i-SRP, kwaye kungekhona ngokuphambene.

Ukwenza ngokusesikweni.

Lixesha lokuba sihambe sinxila sodwa. Zoma iinyembezi zakho - ngokuqinisekileyo siya kubuyela kuyo ngenye imini. Ngoku makhe senze ngokusesikweni ulwazi oluphuma kweli nqaku.

Ukwenziwa ngokusesikweni 1. Inkcazo ye-SRP

  1. Yahlula izakhi ukuze ngamnye kubo abe noxanduva lwento enye.
  2. Uxanduva lumele "isizathu sokutshintsha." Oko kukuthi, into nganye inesizathu esinye kuphela sotshintsho, ngokwemigaqo yoshishino.
  3. Utshintsho olunokwenzeka kwingqiqo yeshishini. kufuneka ibe yeyasekuhlaleni. Izinto ezitshintsha ngokuhambelanayo kufuneka zibe kufutshane.

I-Formalism 2. Iikhrayitheriya eziyimfuneko zokuzivavanya.

Andiyibonanga indlela eyaneleyo yokuzalisekisa i-SRP. Kodwa kukho iimeko eziyimfuneko:

1) Zibuze ukuba yintoni le klasi / indlela / imodyuli / inkonzo. kufuneka uyiphendule ngengcaciso elula. ( Enkosi Brightori )

iingcaciso

Nangona kunjalo, ngamanye amaxesha kunzima kakhulu ukufumana inkcazo elula

2) Ukulungisa isiphene okanye ukongeza into entsha kuchaphazela inani elincinci leefayile/iiklasi. Ngokufanelekileyo - enye.

iingcaciso

Kuba uxanduva (lophawu okanye ibug) lufakwe kwifayile/iklasi enye, uyazi kakuhle ukuba ujonge phi kwaye uhlele ntoni. Umzekelo: inqaku lokutshintsha imveliso yemisebenzi yokugawulwa kwemithi kuya kufuna ukutshintshwa kwelogi kuphela. Akukho mfuneko yokubaleka kuyo yonke ikhowudi.

Omnye umzekelo wongeza ulawulo olutsha lwe-UI, olufana noludlulileyo. Ukuba oku kukunyanzela ukuba wongeze amaziko ahlukeneyo ali-10 kunye nabaguquli abahlukeneyo abali-15, kubonakala ngathi uyayenza ngokugqithisileyo.

3) Ukuba abaphuhlisi abaninzi basebenza kwiimpawu ezahlukeneyo zeprojekthi yakho, ngoko ke ukuba nokwenzeka kwengxabano yokudibanisa, oko kukuthi, amathuba okuba ifayile efanayo / iklasi iya kutshintshwa ngabaphuhlisi abaninzi ngexesha elinye, incinci.

iingcaciso

Ukuba, xa ufaka umsebenzi omtsha "Thela i-vodka phantsi kwetafile", kufuneka uthinte i-logger, ukusebenza kokusela kunye nokuthulula, ngoko kubonakala ngathi uxanduva lwahlulwe ngokugwenxa. Ewe, oku akusoloko kunokwenzeka, kodwa kufuneka sizame ukunciphisa eli nani.

4) Xa ubuzwa umbuzo ocacisayo malunga nengqiqo yezoshishino (ukusuka kumphuhlisi okanye umphathi), ungena ngokungqongqo kwiklasi enye / ifayile kwaye ufumane ulwazi ukusuka apho kuphela.

iingcaciso

Iimpawu, imithetho okanye i-algorithms ibhalwe ngokudibeneyo, nganye kwindawo enye, kwaye ayisasazwanga ngeeflegi kwindawo yonke yekhowudi.

5) Igama licacile.

iingcaciso

Iklasi yethu okanye indlela yethu inoxanduva lwento enye, kwaye uxanduva lubonakaliswa egameni layo

Bonke aManejalaInkonzo yoMphathi- elona nqanaba lodidi lukaThixo
Intlawulo yasekhaya - mhlawumbi akunjalo

I-Formalism 3. Indlela yokuphuhlisa i-Occam yokuqala.

Ekuqaleni koyilo, indoda yenkawu ayiyazi kwaye ayiva yonke into efihlakeleyo yengxaki isonjululwe kwaye inokwenza impazamo. Unokwenza iimpazamo ngeendlela ezahlukeneyo:

  • Yenza izinto zibe nkulu kakhulu ngokudibanisa uxanduva olwahlukileyo
  • Ukulungisa ngokutsha ngokwahlula uxanduva olunye kwiindidi ezininzi ezahlukeneyo
  • Ukuchaza ngokungafanelekanga imida yoxanduva

Kubalulekile ukukhumbula umgaqo: "kungcono ukwenza impazamo enkulu," okanye "ukuba awuqinisekanga, musa ukwahlula." Ukuba, umzekelo, iklasi yakho iqulethe iimbopheleleko ezimbini, ngoko isaqondakala kwaye inokwahlulwa ibe zimbini kunye neenguqu ezincinci kwikhowudi yomxhasi. Ukudibanisa iglasi kwi-shards yeglasi ngokuqhelekileyo kunzima ngenxa yomxholo osasazwa kwiifayile ezininzi kunye nokungabikho kokuxhomekeka okufunekayo kwikhowudi yomxhasi.

Lixesha lokuyibiza imini

Umda we-SRP awuphelelanga kwi-OOP kunye ne-SOLID. Isebenza kwiindlela, imisebenzi, iiklasi, iimodyuli, ii-microservices kunye neenkonzo. Isebenza kuzo zombini “ifigax-figax-and-prod” kunye nophuhliso lwe “rocket-science”, nto leyo eyenza ihlabathi libengcono kancinci kuyo yonke indawo. Ukuba ucinga ngayo, lo ngumgaqo osisiseko wabo bonke ubunjineli. Ubunjineli boomatshini, iisistim zolawulo, kwaye ngokwenene zonke iinkqubo ezintsonkothileyo zakhiwe kumacandelo, kwaye “ukwahlulwa-hlulwa” kwenza abaqulunqi bangakwazi ukuguquguquka, “ukuqhekeka okugqithisileyo” kuhlutha abaqulunqi bobuchule, kwaye imida engafanelekanga ibahlutha ingqiqo noxolo lwengqondo.

UMgaqo woXanduva olunye. Akulula njengoko kubonakala

I-SRP ayiqanjwanga ngokwendalo kwaye ayiyonxalenye yesayensi ngqo. Iyaphuma kwizithintelo zethu zebhayoloji nezengqondo.Yindlela nje yokulawula nokuphuhlisa iinkqubo ezintsonkothileyo kusetyenziswa ingqondo yomntu wenkawu. Usixelela indlela yokubola inkqubo. Ukuqulunqwa kwasekuqaleni kufuna inani elifanelekileyo le-telepathy, kodwa ndiyathemba ukuba eli nqaku licima ezinye ze-smokescreen.

umthombo: www.habr.com

Yongeza izimvo