Usa ka Prinsipyo sa Responsibilidad. Dili ingon ka yano sama sa daw

Usa ka Prinsipyo sa Responsibilidad. Dili ingon ka yano sama sa daw Usa ka prinsipyo sa responsibilidad, nailhan usab nga prinsipyo sa usa ka responsibilidad,
aka ang prinsipyo sa uniporme nga pagkalainlain - usa ka labi ka madanihon nga tawo nga masabtan ug ingon usa ka gikulbaan nga pangutana sa usa ka interbyu sa programmer.

Ang akong unang seryoso nga kaila niini nga prinsipyo nahitabo sa sinugdanan sa unang tuig, sa dihang ang mga batan-on ug berde nga mga gidala ngadto sa kalasangan aron sa paghimo sa mga estudyante gikan sa mga ulod - tinuod nga mga estudyante.

Sa kalasangan, gibahin kami sa mga grupo nga 8-9 ka tawo matag usa ug adunay kompetisyon - kung unsang grupo ang labing paspas nga moinom sa usa ka botelya nga vodka, basta ang una nga tawo gikan sa grupo magbubo og vodka sa usa ka baso, ang ikaduha moinom niini, ug ang ikatulo adunay meryenda. Ang yunit nga nakatapos sa operasyon niini mobalhin sa katapusan sa pila sa grupo.

Ang kaso diin ang gidak-on sa pila kay multiple sa tulo maoy maayong pagpatuman sa SRP.

Kahubitan 1. Usa ka responsibilidad.

Ang opisyal nga depinisyon sa Single Responsibility Principle (SRP) nag-ingon nga ang matag entidad adunay kaugalingong responsibilidad ug rason sa paglungtad, ug kini adunay usa lamang ka responsibilidad.

Tagda ang butang nga β€œTig-inom” (Tippler).
Aron mapatuman ang prinsipyo sa SRP, atong bahinon ang mga responsibilidad sa tulo:

  • Usa ka gibubo (PourOperation)
  • Usa ka ilimnon (DrinkUpOperation)
  • Ang usa adunay snack (TakeBiteOperation)

Ang matag usa sa mga partisipante sa proseso mao ang responsable alang sa usa ka bahin sa proseso, nga mao, adunay usa ka atomic responsibilidad - sa pag-inom, pagbubo o snack.

Ang lungag sa pag-inom, sa baylo, usa ka facade alang niini nga mga operasyon:

сlass Tippler {
    //...
    void Act(){
        _pourOperation.Do() // Π½Π°Π»ΠΈΡ‚ΡŒ
        _drinkUpOperation.Do() // Π²Ρ‹ΠΏΠΈΡ‚ΡŒ
        _takeBiteOperation.Do() // Π·Π°ΠΊΡƒΡΠΈΡ‚ΡŒ
    }
}

Usa ka Prinsipyo sa Responsibilidad. Dili ingon ka yano sama sa daw

Ngano?

Ang tawo nga programmer nagsulat ug code para sa unggoy, ug ang unggoy walay pagtagad, hungog ug kanunay nagdali. Makakupot ug makasabot siya ug mga 3 - 7 ka termino sa usa ka higayon.
Sa kaso sa usa ka palahubog, adunay tulo niini nga mga termino. Bisan pa, kung atong isulat ang code sa usa ka panid, nan kini adunay mga kamot, baso, away ug walay katapusan nga mga argumento bahin sa politika. Ug kining tanan naa sa lawas sa usa ka pamaagi. Sigurado ko nga nakita nimo ang ingon nga code sa imong praktis. Dili ang labing tawhanon nga pagsulay alang sa psyche.

Sa laing bahin, ang tawo nga unggoy gidesinyo sa pagsundog sa tinuod nga mga butang sa kalibotan diha sa iyang ulo. Sa iyang imahinasyon, mahimo niyang iduso kini, mag-assemble og bag-ong mga butang gikan kanila, ug i-disassemble kini sa samang paagi. Hunahunaa ang usa ka karaan nga modelo nga awto. Sa imong imahinasyon, mahimo nimong ablihan ang pultahan, i-unscrew ang trim sa pultahan ug tan-awa didto ang mga mekanismo sa pag-alsa sa bintana, nga sa sulod adunay mga gears. Apan dili nimo makita ang tanan nga mga sangkap sa makina sa parehas nga oras, sa usa ka "listahan". Labing menos ang "tawo nga unggoy" dili mahimo.

Busa, ang mga programmer sa tawo nagbungkag sa mga komplikadong mekanismo ngadto sa usa ka hugpong sa dili kaayo komplikado ug nagtrabaho nga mga elemento. Apan, kini mahimong decomposed sa lain-laing mga paagi: sa daghang mga daan nga mga sakyanan, ang air duct moadto sa pultahan, ug sa modernong mga sakyanan, ang usa ka kapakyasan sa lock electronics makapugong sa makina gikan sa pagsugod, nga mahimong usa ka problema sa panahon sa pag-ayo.

Karon, Ang SRP usa ka prinsipyo nga nagpatin-aw kung UNSAON ang pagkadunot, nga mao, kung asa ibutang ang linya sa pagbahin.

Siya nag-ingon nga kini kinahanglan nga decompose sumala sa prinsipyo sa pagbahin sa "responsibilidad," nga mao, sumala sa mga buluhaton sa pipila ka mga butang.

Usa ka Prinsipyo sa Responsibilidad. Dili ingon ka yano sama sa daw

Balikan nato ang pag-inom ug ang mga bentaha nga madawat sa tawo nga unggoy sa panahon sa pagkadunot:

  • Ang code nahimong klaro kaayo sa matag lebel
  • Ang code mahimong isulat sa daghang mga programmer sa usa ka higayon (ang matag usa nagsulat sa usa ka lahi nga elemento)
  • Ang automated nga pagsulay gipasimple - ang mas simple nga elemento, mas sayon ​​ang pagsulay
  • Ang komposisyon sa code makita - mahimo nimong ilisan DrinkUpOperation sa usa ka operasyon diin ang usa ka palahubog nagbubo ug likido ilalom sa lamesa. O pulihan ang operasyon sa pagbubo sa usa ka operasyon diin imong gisagol ang bino ug tubig o vodka ug beer. Depende sa mga kinahanglanon sa negosyo, mahimo nimo ang tanan nga dili mahikap ang code sa pamaagi Tippler.Act.
  • Gikan niini nga mga operasyon mahimo nimong pilohon ang ulitan (gamit lamang TakeBitOperation), Alkohol (gamit lang DrinkUpOperation diretso gikan sa botelya) ug makatagbo sa daghang uban pang mga kinahanglanon sa negosyo.

(Oh, morag usa na kini ka prinsipyo sa OCP, ug gilapas nako ang responsibilidad niini nga post)

Ug, siyempre, ang mga kontra:

  • Kinahanglan namon nga maghimo daghang mga tipo.
  • Ang usa ka palahubog moinom sa unang higayon paglabay sa pipila ka oras kay sa iyang mahimo.

Kahubitan 2. Nagkahiusa nga pagkalainlain.

Tugoti ako, mga ginoo! Ang klase sa pag-inom adunay usa usab ka responsibilidad - kini nag-inom! Ug sa kinatibuk-an, ang pulong nga "responsibilidad" usa ka dili klaro nga konsepto. Adunay responsable sa kapalaran sa katawhan, ug adunay responsable sa pagpataas sa mga penguin nga nabalit-ad sa poste.

Atong tagdon ang duha ka implementasyon sa nag-inom. Ang una, nga gihisgotan sa ibabaw, naglangkob sa tulo ka mga klase - ibubo, ilimnon ug snack.

Ang ikaduha gisulat pinaagi sa "Forward and Only Forward" methodology ug naglangkob sa tanang logic sa pamaagi 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);
    }
   }
}

Ang duha niini nga mga klase, gikan sa punto sa panglantaw sa usa ka gawas nga tigpaniid, parehas nga tan-awon ug adunay parehas nga responsibilidad sa "pag-inom".

Kalibog!

Dayon mag-online kami ug mangita og laing kahulugan sa SRP - ang Single Changeability Principle.

Ang SCP nag-ingon nga "Ang usa ka module adunay usa ug usa ra nga hinungdan sa pagbag-o". Sa ato pa, "Ang responsibilidad usa ka hinungdan sa pagbag-o."

(Morag ang mga lalaki nga naghimo sa orihinal nga kahulugan masaligon sa mga abilidad sa telepatiko sa tawo nga unggoy)

Karon ang tanan nahulog sa lugar. Sa tagsa-tagsa, mahimo natong usbon ang mga pamaagi sa pagbubo, pag-inom ug pag-snack, apan sa tig-inom mismo mahimo ra natong usbon ang han-ay ug komposisyon sa mga operasyon, pananglitan, pinaagi sa pagbalhin sa snack sa dili pa moinom o pagdugang sa pagbasa sa usa ka toast.

Sa "Forward and Only Forward" nga pamaagi, ang tanan nga mahimong usbon mausab lamang sa pamaagi Act. Mahimo kini nga mabasa ug epektibo kung adunay gamay nga lohika ug panagsa ra nga magbag-o, apan kasagaran kini matapos sa makalilisang nga mga pamaagi sa 500 ka linya matag usa, nga adunay daghang kung-pahayag kaysa gikinahanglan alang sa Russia nga moapil sa NATO.

Kahubitan 3. Lokalisasyon sa mga kausaban.

Ang mga palainom kasagaran dili makasabut nganong nakamata sila sa apartment sa laing tawo, o kung asa ang ilang cellphone. Panahon na aron idugang ang detalyado nga pag-log.

Magsugod kita sa pag-log sa proseso sa pagbubo:

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

Pinaagi sa pag-encapsulate niini sa PourOperation, milihok kami nga maalamon gikan sa punto sa panglantaw sa responsibilidad ug encapsulation, apan karon naglibog kami sa prinsipyo sa pagkausab. Gawas pa sa operasyon mismo, nga mahimong mabag-o, ang pag-log mismo mahimo usab nga mabag-o. Kinahanglan nimo nga magbulag ug maghimo usa ka espesyal nga logger alang sa operasyon sa pagbubo:

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

Ang makuti nga magbabasa makamatikod niana LogPagkahuman, Log Sa wala pa ΠΈ OnError mahimo usab nga usbon sa tagsa-tagsa, ug, pinaagi sa analohiya sa miaging mga lakang, makahimo og tulo ka mga klase: PourLoggerBefore, PourLoggerPagkahuman ΠΈ PourErrorLogger.

Ug sa paghinumdom nga adunay tulo ka mga operasyon alang sa usa ka palainom, nakakuha kami siyam ka klase sa logging. Ingon usa ka sangputanan, ang tibuuk nga bilog sa pag-inom naglangkob sa 14 (!!!) nga mga klase.

Hyperbola? Halos dili! Ang usa ka unggoy nga tawo nga adunay usa ka decomposition granada magbahin sa "pourer" ngadto sa usa ka decanter, usa ka baso, mga operator sa pagbubo, usa ka serbisyo sa suplay sa tubig, usa ka pisikal nga modelo sa pagbangga sa mga molekula, ug alang sa sunod nga quarter siya mosulay sa pagtangtang sa mga dependency nga wala. global nga mga variable. Ug tuohi ko, dili siya mohunong.

Niining puntoha daghan ang nakahuna-huna nga ang SRP mga fairy tale gikan sa pink nga gingharian, ug nanglakaw aron magduwa og noodles...

... nga wala sukad nakakat-on mahitungod sa pagkaanaa sa ikatulo nga kahulugan sa Srp:

β€œAng Single Responsibility Principle nag-ingon niana ang mga butang nga susama sa kausaban kinahanglang tipigan sa usa ka dapit". o "Unsa nga mga kausaban sa tingub kinahanglan nga tipigan sa usa ka dapit"

Sa ato pa, kung usbon naton ang pag-log sa usa ka operasyon, kinahanglan naton usbon kini sa usa ka lugar.

Kini usa ka hinungdanon kaayo nga punto - tungod kay ang tanan nga mga pagpatin-aw sa SRP nga naa sa taas nag-ingon nga kinahanglan nga dugmokon ang mga tipo samtang sila gidugmok, nga mao, gipahamtang nila ang usa ka "ibabaw nga limitasyon" sa gidak-on sa butang, ug karon naghisgut na kita mahitungod sa usa ka "ubos nga limitasyon" . Sa laing pagkasulti, Ang SRP wala lamang nagkinahanglan sa "pagdugmok samtang nagdugmok", apan dili usab pagpalabi niini - "ayaw pagdugmok sa mga butang nga nagkadugtong". Kini ang dakong gubat tali sa labaha ni Occam ug sa tawo nga unggoy!

Usa ka Prinsipyo sa Responsibilidad. Dili ingon ka yano sama sa daw

Karon ang moinom kinahanglan nga mobati nga mas maayo. Dugang pa sa kamatuoran nga dili kinahanglan nga bahinon ang IPourLogger logger ngadto sa tulo ka klase, mahimo usab natong i-combine ang tanang loggers ngadto sa usa ka matang:

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

Ug kung magdugang kami usa ka ikaupat nga matang sa operasyon, nan ang pag-log alang niini andam na. Ug ang code sa mga operasyon mismo limpyo ug wala’y kasaba sa imprastraktura.

Ingon usa ka sangputanan, kami adunay 5 nga mga klase alang sa pagsulbad sa problema sa pag-inom:

  • Pagbubo nga operasyon
  • Operasyon sa pag-inom
  • Jamming nga operasyon
  • Troso
  • Facade sa palainom

Ang matag usa kanila estrikto nga responsable sa usa ka gamit ug adunay usa ka hinungdan sa pagbag-o. Ang tanan nga mga lagda nga susama sa pagbag-o nahimutang sa duol.

Pananglitan sa tinuod nga kinabuhi

Nagsulat kami usa ka serbisyo alang sa awtomatik nga pagparehistro sa usa ka kliyente sa b2b. Ug usa ka pamaagi sa DIOS nagpakita alang sa 200 ka linya nga parehas nga sulud:

  • Adto sa 1C ug paghimo og account
  • Uban niini nga account, adto sa module sa pagbayad ug paghimo niini didto
  • Susiha nga ang usa ka account nga adunay ingon nga account wala pa nahimo sa main server
  • Paghimo og bag-ong account
  • Idugang ang mga resulta sa pagparehistro sa module sa pagbayad ug ang 1c nga numero sa serbisyo sa mga resulta sa pagrehistro
  • Idugang ang impormasyon sa account niini nga lamesa
  • Paghimo og punto nga numero alang niini nga kliyente sa punto nga serbisyo. Ipasa ang imong 1c account number niini nga serbisyo.

Ug adunay mga 10 pa nga mga operasyon sa negosyo sa kini nga lista nga adunay makalilisang nga koneksyon. Hapit tanan nanginahanglan sa butang sa account. Ang point ID ug ngalan sa kliyente gikinahanglan sa katunga sa mga tawag.

Human sa usa ka oras nga refactoring, nakahimo kami sa pagbulag sa kodigo sa imprastraktura ug pipila sa mga nuances sa pagtrabaho uban sa usa ka account ngadto sa lain nga mga pamaagi/klase. Ang pamaagi sa Dios nagpasayon ​​niini, apan adunay nahabilin nga 100 ka linya sa code nga dili gusto nga mabungkag.

Pagkahuman lamang sa pipila ka mga adlaw nahimo nga tin-aw nga ang diwa sa kini nga "gaan" nga pamaagi usa ka algorithm sa negosyo. Ug nga ang orihinal nga paghulagway sa teknikal nga mga detalye medyo komplikado. Ug ang pagsulay sa pagbungkag sa kini nga pamaagi sa mga piraso ang makalapas sa SRP, ug dili vice versa.

Pormalismo.

Panahon na nga biyaan ang atong kahubog. Pauga ang imong mga luha - siguradong mobalik kami niini sa umaabot. Karon atong himoong pormal ang kahibalo gikan niini nga artikulo.

Pormalismo 1. Kahulugan sa SRP

  1. Ibulag ang mga elemento aron ang matag usa kanila responsable sa usa ka butang.
  2. Ang responsibilidad nagpasabut nga "rason sa pagbag-o." Kana mao, ang matag elemento adunay usa ra ka hinungdan sa pagbag-o, sa termino sa lohika sa negosyo.
  3. Potensyal nga mga pagbag-o sa lohika sa negosyo. kinahanglan nga localized. Ang mga elemento nga dungan nga nagbag-o kinahanglan nga naa sa duol.

Pormalismo 2. Kinahanglanon nga pamatasan sa pagsulay sa kaugalingon.

Wa koy nakitang igong sukdanan sa pagtuman sa SRP. Apan adunay kinahanglan nga mga kondisyon:

1) Pangutan-a ang imong kaugalingon kung unsa kini nga klase / pamaagi / module / serbisyo. kinahanglan nimo kini tubagon sa usa ka yano nga kahulugan. ( Salamat Brightori )

mga pagpasabot

Bisan pa, usahay lisud kaayo ang pagpangita sa usa ka yano nga kahulugan

2) Ang pag-ayo sa usa ka bug o pagdugang usa ka bag-ong bahin makaapekto sa usa ka minimum nga gidaghanon sa mga file / klase. Labing maayo - usa.

mga pagpasabot

Tungod kay ang responsibilidad (alang sa usa ka bahin o bug) gilakip sa usa ka file/klase, nahibal-an nimo kung asa tan-awon ug kung unsa ang i-edit. Pananglitan: ang bahin sa pagbag-o sa output sa mga operasyon sa logging kinahanglan nga usbon lamang ang logger. Dili kinahanglan nga modagan sa nahabilin nga code.

Ang laing pananglitan mao ang pagdugang og bag-ong kontrol sa UI, susama sa mga nauna. Kung pugson ka niini nga magdugang og 10 ka lain-laing entidad ug 15 ka lain-laing mga converter, morag nasobrahan na nimo kini.

3) Kung daghang mga developer ang nagtrabaho sa lainlaing mga bahin sa imong proyekto, nan ang posibilidad sa usa ka panagsama nga panagbangi, nga mao, ang posibilidad nga ang parehas nga file / klase mabag-o sa daghang mga developer sa parehas nga oras, gamay ra.

mga pagpasabot

Kung, kung nagdugang usa ka bag-ong operasyon nga "Ibubo ang vodka sa ilawom sa lamesa", kinahanglan nimo nga maapektuhan ang logger, ang operasyon sa pag-inom ug pagbubo, nan ingon og ang mga responsibilidad gibahin sa hiwi. Siyempre, dili kini kanunay nga posible, apan kinahanglan natong sulayan nga makunhuran kini nga numero.

4) Kung gipangutana ang usa ka nagpatin-aw nga pangutana bahin sa lohika sa negosyo (gikan sa usa ka developer o manager), estrikto ka nga moadto sa usa ka klase / file ug makadawat ra og impormasyon gikan didto.

mga pagpasabot

Ang mga feature, lagda o algorithm gisulat nga compact, matag usa sa usa ka dapit, ug wala magkatag sa mga flag sa tibuok code space.

5) Ang pagngalan klaro.

mga pagpasabot

Ang atong klase o pamaagi maoy responsable sa usa ka butang, ug ang responsibilidad makita sa ngalan niini

AllManagersManagerService - lagmit usa ka klase sa Diyos
LocalPayment - tingali dili

Pormalismo 3. Occam-first development methodology.

Sa sinugdanan sa disenyo, ang tawo nga unggoy wala mahibalo ug wala mobati sa tanan nga mga subtleties sa problema nga masulbad ug makahimo sa usa ka sayop. Mahimo nimong masayop sa lainlaing mga paagi:

  • Himua nga dako kaayo ang mga butang pinaagi sa paghiusa sa lainlaing mga responsibilidad
  • Pag-refram pinaagi sa pagbahin sa usa ka responsibilidad sa daghang lain-laing mga tipo
  • Sayop nga paghubit sa mga utlanan sa responsibilidad

Importante nga hinumdoman ang lagda: "mas maayo nga makahimo og dakong sayop," o "kon dili ka sigurado, ayaw kini pagbulag." Kung, pananglitan, ang imong klase adunay duha ka mga responsibilidad, nan masabtan gihapon kini ug mahimong bahinon sa duha nga adunay gamay nga pagbag-o sa code sa kliyente. Ang pag-assemble sa usa ka baso gikan sa mga shards sa bildo kasagaran mas lisud tungod sa konteksto nga mikaylap sa daghang mga file ug ang kakulang sa gikinahanglan nga dependencies sa code sa kliyente.

Panahon na aron tawgon kini nga usa ka adlaw

Ang sakup sa SRP dili limitado sa OOP ug SOLID. Kini magamit sa mga pamaagi, gimbuhaton, klase, module, microservice ug serbisyo. Kini magamit sa "figax-figax-and-prod" ug "rocket-science" nga pag-uswag, nga naghimo sa kalibutan nga mas maayo bisan asa. Kung hunahunaon nimo kini, hapit kini ang sukaranan nga prinsipyo sa tanan nga engineering. Ang mekanikal nga engineering, mga sistema sa pagkontrol, ug sa pagkatinuod ang tanan nga komplikado nga mga sistema gitukod gikan sa mga sangkap, ug ang "underfragmentation" naghikaw sa mga tigdesinyo sa pagka-flexible, ang "overfragmentation" naghikaw sa mga tigdesinyo sa kahusayan, ug ang dili husto nga mga utlanan naghikaw kanila sa katarungan ug kalinaw sa hunahuna.

Usa ka Prinsipyo sa Responsibilidad. Dili ingon ka yano sama sa daw

Ang SRP dili imbento sa kinaiyahan ug dili bahin sa eksaktong siyensiya. Nakagawas kini sa atong biyolohikal ug sikolohikal nga mga limitasyon. Usa lang kini ka paagi aron makontrol ug maugmad ang mga komplikadong sistema gamit ang utok sa unggoy. Gisultihan niya kita kung giunsa ang pag-decompose sa usa ka sistema. Ang orihinal nga pormulasyon nanginahanglan usa ka patas nga kantidad sa telepathy, apan nanghinaut ko nga kini nga artikulo nagtangtang sa pipila nga mga smokescreen.

Source: www.habr.com

Idugang sa usa ka comment