Prensip Responsablite sèl. Pa tankou senp jan li sanble

Prensip Responsablite sèl. Pa tankou senp jan li sanble Prensip responsablite sèl, konnen tou kòm prensip responsablite sèl,
aka prensip la nan varyasyon inifòm - yon nèg trè glise yo konprann ak tankou yon kesyon nève nan yon entèvyou pwogramè.

Premye konesans serye mwen ak prensip sa a te fèt nan kòmansman premye ane a, lè jèn yo ak vèt yo te mennen nan forè a pou fè elèv yo soti nan lav - elèv reyèl.

Nan forè a, nou te divize an gwoup 8-9 moun chak epi yo te gen yon konpetisyon - ki gwoup ta bwè yon boutèy vodka pi rapid, depi premye moun nan gwoup la vide vodka nan yon vè, dezyèm lan bwè li, ak twazyèm lan gen yon ti goute. Inite a ki te konplete operasyon li deplase nan fen keu gwoup la.

Ka a kote gwosè keu la te yon miltip nan twa se te yon bon aplikasyon nan SRP.

Definisyon 1. Responsablite sèl.

Definisyon ofisyèl Prensip Sèl Responsablite (SRP) di ke chak antite gen pwòp responsablite ak rezon pou egzistans li, epi li gen yon sèl responsablite.

Konsidere objè a "Drinker" (Tippler).
Pou aplike prensip SRP a, nou pral divize responsablite yo an twa:

  • Youn vide (PourOperation)
  • Youn bwè (DrinkUpOperation)
  • Youn gen yon ti goute (TakeBiteOperation)

Chak nan patisipan yo nan pwosesis la responsab pou yon sèl eleman nan pwosesis la, se sa ki, gen yon sèl responsablite atomik - bwè, vide oswa goute.

Twou pou bwè a, nan vire, se yon fasad pou operasyon sa yo:

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

Prensip Responsablite sèl. Pa tankou senp jan li sanble

Poukisa?

Pwogramè imen an ekri kòd pou moun-sik la, ak nonm-sinj la inatantif, estipid epi toujou prese. Li ka kenbe epi konprann apeprè 3 - 7 tèm nan yon sèl fwa.
Nan ka yon tafyatè, gen twa nan tèm sa yo. Sepandan, si nou ekri kòd la ak yon sèl fèy, Lè sa a, li pral genyen men, linèt, batay ak diskisyon kontinuèl sou politik. Ak tout bagay sa yo pral nan kò a nan yon sèl metòd. Mwen sèten ou te wè kòd sa a nan pratik ou. Pa tès ki pi imen pou psyche la.

Nan lòt men an, nonm nan senj fèt yo simulation objè mond reyèl nan tèt li. Nan imajinasyon li, li ka pouse yo ansanm, rasanble nouvo objè nan men yo, epi demonte yo menm jan an. Imajine yon ansyen modèl machin. Nan imajinasyon ou, ou ka louvri pòt la, devise taye pòt la ak wè gen mekanis yo leve fenèt, andedan ki pral gen angrenaj. Men, ou pa ka wè tout konpozan machin lan an menm tan, nan yon sèl "liste". Omwen "nonm makak la" pa kapab.

Se poutèt sa, pwogramasyon imen dekonpoze mekanis konplèks nan yon seri eleman mwens konplèks ak travay. Sepandan, li ka dekonpoze nan diferan fason: nan anpil machin fin vye granmoun, kanal lè a antre nan pòt la, ak nan machin modèn, yon echèk nan elektwonik yo fèmen anpeche motè a kòmanse, ki ka yon pwoblèm pandan reparasyon.

Koulye a, SRP se yon prensip ki eksplike KOUMAN pou dekonpoze, se sa ki, ki kote yo trase liy divizyon an.

Li di ke li nesesè dekonpoze dapre prensip divizyon "responsabilite", se sa ki, dapre travay yo nan sèten objè.

Prensip Responsablite sèl. Pa tankou senp jan li sanble

Ann retounen nan bwè ak avantaj nonm makak la resevwa pandan dekonpozisyon:

  • Kòd la vin trè klè nan chak nivo
  • Plizyè pwogramè ka ekri kòd la alafwa (yo chak ekri yon eleman separe)
  • Tès otomatik yo senplifye - pi senp eleman an, se pi fasil pou teste
  • Konpozisyon kòd la parèt - ou ka ranplase DrinkUpOperation nan yon operasyon kote yon tafyatè vide likid anba tab la. Oswa ranplase operasyon vide a ak yon operasyon kote ou melanje diven ak dlo oswa vodka ak byè. Tou depan de kondisyon biznis, ou ka fè tout bagay san yo pa manyen kòd metòd la Tippler.Act.
  • Soti nan operasyon sa yo ou ka pliye gouman an (itilize sèlman TakeBitOperation), Alkòl (itilize sèlman DrinkUpOperation dwat soti nan boutèy la) ak satisfè anpil lòt kondisyon biznis.

(O, sanble sa a deja yon prensip OCP, e mwen vyole responsablite pòs sa a)

Epi, nan kou, dezavantaj yo:

  • Nou pral oblije kreye plis kalite.
  • Yon tafyatè bwè pou premye fwa yon koup la èdtan pita pase sa li ta genyen.

Definisyon 2. Varyab inifye.

Pèmèt mwen, mesye! Klas la bwè tou gen yon sèl responsablite - li bwè! Ak an jeneral, mo "responsabilite" a se yon konsèp trè vag. Yon moun ki responsab sò limanite, ak yon moun ki responsab pou ogmante pengwen yo ki te ranvèse nan poto a.

Ann konsidere de aplikasyon pou bwè a. Premye a, mansyone pi wo a, gen twa klas - vide, bwè ak goute.

Dezyèm lan ekri nan metodoloji "Forward and Only Forward" e li gen tout lojik nan metòd la Aji:

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

Tou de nan klas sa yo, nan pwen de vi nan yon obsèvatè deyò, gade egzakteman menm ak pataje menm responsablite a nan "bwè".

Konfizyon!

Lè sa a, nou ale sou entènèt epi chèche konnen yon lòt definisyon SRP - Prensip la Chanjabilite sèl.

SCP deklare ke "Yon modil gen yon sèl ak yon sèl rezon pou chanje". Sa vle di, "Responsablite se yon rezon pou chanjman."

(Li sanble ke mesye yo ki te vini ak definisyon orijinal la te gen konfyans nan kapasite telepatik nonm nan senj)

Koulye a, tout bagay tonbe an plas. Separeman, nou ka chanje pwosedi yo vide, bwè ak ti goute, men nan tafyatè a li menm nou ka sèlman chanje sekans ak konpozisyon operasyon yo, pou egzanp, pa deplase ti goute la anvan ou bwè oswa ajoute lekti nan yon pen griye.

Nan apwòch "Forward and Only Forward", tout bagay ki ka chanje chanje sèlman nan metòd la Aji. Sa a ka lizib ak efikas lè gen ti lojik epi li raman chanje, men souvan li fini nan metòd terib nan 500 liy chak, ak plis si-deklarasyon pase sa nesesè pou Larisi rantre nan Òganizasyon Trete Nò Atlantik.

Definisyon 3. Lokalizasyon chanjman.

Moun kap bwè souvan pa konprann poukisa yo leve nan apatman yon lòt moun, oswa kote telefòn mobil yo ye. Li lè pou ajoute detaye enregistrement.

Ann kòmanse antre ak pwosesis la vide:

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

Pa encapsulation li nan PourOperation, nou te aji avèk sajès nan pwen de vi responsablite ak enkapsulasyon, men kounye a nou konfonn ak prensip la nan varyasyon. Anplis de sa nan operasyon an tèt li, ki ka chanje, antre nan tèt li tou vin chanjan. Ou pral oblije separe epi kreye yon enregistreur espesyal pou operasyon an vide:

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

Lektè metikuleu a pral remake sa LogAfter, LogBefore и OnError kapab tou chanje endividyèlman, epi, pa analoji ak etap anvan yo, pral kreye twa klas: PourLoggerBefore, PourLoggerAfter и PourErrorLogger.

Epi sonje ke gen twa operasyon pou yon tafyatè, nou jwenn nèf klas antre. Kòm yon rezilta, tout sèk bwè a konsiste de 14 (!!!) klas.

Ipèbòl? Diman! Yon nonm makak ak yon grenad dekonpozisyon pral fann "pourer la" nan yon dekantè, yon vè, vide operatè, yon sèvis rezèv dlo, yon modèl fizik nan kolizyon an nan molekil, ak pou pwochen trimès la li pral eseye debouche depandans yo san yo pa. varyab mondyal yo. Epi kwè m, li p ap sispann.

Se nan pwen sa a ke anpil rive nan konklizyon ke SRP yo se istwa fe ki soti nan wayòm woz, epi yo ale nan jwe nouy ...

... san yo pa janm aprann sou egzistans lan nan yon twazyèm definisyon nan Srp:

"Prensip Responsablite Selibatè a di sa bagay ki sanble ak chanjman yo ta dwe estoke nan yon sèl kote". oswa "Sa ki chanje ansanm ta dwe kenbe nan yon sèl kote"

Sa vle di, si nou chanje antre nan yon operasyon, Lè sa a, nou dwe chanje li nan yon sèl kote.

Sa a se yon pwen trè enpòtan - depi tout eksplikasyon SRP ki te pi wo a te di ke li te nesesè yo kraze kalite yo pandan y ap kraze yo, se sa ki, yo enpoze yon "limit anwo" sou gwosè objè a, e kounye a. nou deja pale de yon "limit pi ba" . Nan yon lòt sans, SRP pa sèlman mande pou "kraze pandan y ap kraze", men tou, pa fè twòp li - "pa kraze bagay ki konekte yo". Sa a se gwo batay ant razwa Occam a ak nonm nan simi!

Prensip Responsablite sèl. Pa tankou senp jan li sanble

Koulye a, moun kap bwè a ta dwe santi l pi byen. Anplis lefèt ke pa gen okenn nesesite pou divize logger IPourLogger la nan twa klas, nou kapab tou konbine tout loggers nan yon sèl kalite:

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

Men, si nou ajoute yon katriyèm kalite operasyon, Lè sa a, antre a pou li deja pare. Ak kòd la nan operasyon yo tèt yo se pwòp epi gratis nan bri enfrastrikti.

Kòm yon rezilta, nou gen 5 klas pou rezoud pwoblèm nan bwè:

  • Operasyon vide
  • Bwè operasyon
  • Bloke operasyon
  • Logger
  • Fasad tafyatè

Chak nan yo responsab estrikteman pou yon sèl fonksyonalite epi yo gen yon rezon pou chanjman. Tout règ ki sanble ak chanjman yo sitiye tou pre.

Egzanp lavi reyèl

Nou yon fwa te ekri yon sèvis pou otomatikman anrejistre yon kliyan b2b. Epi yon metòd BONDYE te parèt pou 200 liy kontni menm jan an:

  • Ale nan 1C epi kreye yon kont
  • Avèk kont sa a, ale nan modil peman an epi kreye li la
  • Tcheke ke yon kont ak yon kont konsa pa te kreye sou sèvè prensipal la
  • Kreye yon nouvo kont
  • Ajoute rezilta enskripsyon yo nan modil peman an ak nimewo 1c nan sèvis rezilta anrejistreman an
  • Ajoute enfòmasyon sou kont nan tablo sa a
  • Kreye yon nimewo pwen pou kliyan sa a nan sèvis pwen an. Pase nimewo kont 1c ou nan sèvis sa a.

Epi te gen anviwon 10 plis operasyon biznis sou lis sa a ak koneksyon terib. Prèske tout moun te bezwen objè a kont. Didantite pwen ak non kliyan yo te bezwen nan mwatye nan apèl yo.

Apre yon èdtan nan refactoring, nou te kapab separe kòd enfrastrikti a ak kèk nan nuans yo nan travay ak yon kont nan metòd / klas separe. Metòd Bondye te fè li pi fasil, men te gen 100 liy kòd ki te rete ki jis pa t 'vle demele.

Se sèlman apre kèk jou li te vin klè ke sans nan metòd sa a "lejè" se yon algorithm biznis. E ke deskripsyon orijinal la nan espesifikasyon teknik yo te byen konplèks. Epi li se tantativ pou kraze metòd sa a an moso ki pral vyole SRP a, epi yo pa vis vèrsa.

Fòmalism.

Li lè pou nou kite sou nou pou kont li. Sèch dlo nan je ou - nou pral definitivman retounen nan li yon jou. Koulye a, kite a ofisyèlman konesans ki soti nan atik sa a.

Fòmalism 1. Definisyon SRP

  1. Separe eleman yo pou chak nan yo responsab pou yon sèl bagay.
  2. Responsablite vle di "rezon pou chanje." Sa vle di, chak eleman gen yon sèl rezon pou chanjman, an tèm de lojik biznis.
  3. Chanjman potansyèl nan lojik biznis. dwe lokalize. Eleman ki chanje synchrone dwe tou pre.

Fòmalism 2. Kritè oto-tès ki nesesè.

Mwen pa wè ase kritè pou ranpli SRP a. Men, gen kondisyon ki nesesè yo:

1) Mande tèt ou kisa klas/metòd/modil/sèvis sa a fè. ou dwe reponn li ak yon definisyon senp. ( Mèsi Brightori )

eksplikasyon

Sepandan, pafwa li trè difisil pou jwenn yon definisyon senp

2) Ranje yon ensèk oswa ajoute yon nouvo karakteristik afekte yon kantite minimòm fichye/klas. Idealman - yon sèl.

eksplikasyon

Depi responsablite (pou yon karakteristik oswa yon ensèk) ankapsule nan yon sèl fichye/klas, ou konnen egzakteman ki kote yo gade ak ki sa yo edite. Pou egzanp: karakteristik nan chanje pwodiksyon an nan operasyon antre yo pral mande pou chanje sèlman logger la. Pa gen okenn bezwen kouri atravè rès la nan kòd la.

Yon lòt egzanp se ajoute yon nouvo kontwòl UI, menm jan ak sa yo anvan yo. Si sa a fòse ou ajoute 10 antite diferan ak 15 konvètisè diferan, li sanble ke w ap twòp li.

3) Si plizyè devlopè ap travay sou diferan karakteristik nan pwojè ou a, lè sa a chans pou yon konfli fizyone, se sa ki, chans pou ke menm dosye / klas la pral chanje pa plizyè devlopè an menm tan an, se minim.

eksplikasyon

Si, lè w ajoute yon nouvo operasyon "Vide vodka anba tab la", ou bezwen afekte logger la, operasyon an nan bwè ak vide, Lè sa a, li sanble ke responsablite yo divize kwochi. Natirèlman, sa a se pa toujou posib, men nou ta dwe eseye diminye figi sa a.

4) Lè yo mande yon kesyon klarifye sou lojik biznis (ki soti nan yon pwomotè oswa manadjè), ou antre nan yon sèl klas/fichye epi resevwa enfòmasyon sèlman nan men la.

eksplikasyon

Karakteristik, règ oswa algoritm yo ekri konpak, yo chak nan yon sèl kote, epi yo pa gaye ak drapo nan tout espas kòd la.

5) non an klè.

eksplikasyon

Klas nou oswa metòd nou an responsab pou yon sèl bagay, epi responsablite a reflete nan non li

AllManagersManagerService - gen plis chans yon klas Bondye
LocalPayment - pwobableman pa

Fòmalism 3. Occam-premye metodoloji devlopman.

Nan kòmansman an nan konsepsyon, nonm makak la pa konnen epi yo pa santi tout sibtilite yo nan pwoblèm nan ke yo te rezoud epi li ka fè yon erè. Ou ka fè erè nan diferan fason:

  • Fè objè yo twò gwo pa fizyone responsablite diferan
  • Reframing pa divize yon sèl responsablite an plizyè kalite diferan
  • Mal defini limit responsablite yo

Li enpòtan pou w sonje règ la: "li pi bon pou w fè yon gwo erè," oswa "si w pa sèten, pa separe l." Si, pou egzanp, klas ou a gen de responsablite, Lè sa a, li toujou konprann epi yo ka divize an de ak chanjman minimòm nan kòd kliyan an. Rasanble yon vè ki soti nan shards an vè anjeneral pi difisil akòz kontèks la gaye nan plizyè dosye ak mank de depandans ki nesesè nan kòd kliyan an.

Li lè yo rele li yon jou

Dimansyon SRP pa limite a OOP ak SOLID. Li aplike a metòd, fonksyon, klas, modil, mikwosèvis ak sèvis. Li aplike a tou de "figax-figax-and-prod" ak "rocket-syans" devlopman, fè mond lan yon ti kras pi bon toupatou. Si ou panse sou li, sa a se prèske prensip fondamantal nan tout jeni. Jeni mekanik, sistèm kontwòl, ak tout bon sistèm konplèks yo bati nan eleman, ak "underfragmentation" prive konsèpteur yo nan fleksibilite, "overfragmentation" prive konsèpteur yo nan efikasite, ak limit kòrèk anpeche yo nan rezon ak lapè nan tèt ou.

Prensip Responsablite sèl. Pa tankou senp jan li sanble

SRP pa envante pa lanati epi li pa fè pati syans egzak. Li kase soti nan limit byolojik ak sikolojik nou yo.Se jis yon fason yo kontwole ak devlope sistèm konplèks lè l sèvi avèk sèvo moun sinj la. Li di nou kijan pou dekonpoze yon sistèm. Fòmasyon orijinal la te mande yon bon kantite telepati, men mwen espere atik sa a efase kèk nan lafimen.

Sous: www.habr.com

Add nouvo kòmantè