Prionsabal Freagrachta Aonair. Níl sé chomh simplí agus is cosúil

Prionsabal Freagrachta Aonair. Níl sé chomh simplí agus is cosúil Prionsabal na freagrachta aonair, ar a dtugtar freisin prionsabal na freagrachta aonair,
aka prionsabal na héagsúlachta aonfhoirmeach - fear an-sleamhain le tuiscint agus ceist chomh neirbhíseach sin ag agallamh le ríomhchláraitheoir.

Tharla mo chéad aithne tromchúiseach ar an bprionsabal seo ag tús mo chéad bhliain, nuair a tógadh na cinn óga agus glasa chuig an bhforaois chun mic léinn fíor a bhaint as larbhaí.

San fhoraois, roinneadh muid i ngrúpaí de 8-9 duine an ceann agus bhí comórtas againn - cén grúpa a d’ólfadh buidéal vodca is tapúla, ar choinníoll go doirteadh an chéad duine ón ngrúpa vodca isteach i gloine, go n-ólann an dara duine é, agus tá snack ag an tríú. Bogann an t-aonad a bhfuil a oibríocht críochnaithe aige go dtí deireadh scuaine an ghrúpa.

Ba é an cás ina raibh méid na scuaine iolraí de thrí cinn ina chur i bhfeidhm maith PTA.

Sainmhíniú 1. Freagracht aonair.

Sonraítear sa sainmhíniú oifigiúil ar an bPrionsabal um Fhreagracht Aonair (SRP) go bhfuil a fhreagracht agus a chúis féin ag gach aonán le bheith ann, agus nach bhfuil ach freagracht amháin air.

Smaoinigh ar an réad “Drinker” (Tippler).
Chun prionsabal an SRP a chur i bhfeidhm, roinnfimid na freagrachtaí i dtrí cinn:

  • Doirteann duine (Oibríocht Doirteadh)
  • Deoch amháin (Oibríocht Óil)
  • Bíonn smailc ag duine amháin (TakeBiteOperation)

Tá gach rannpháirtí sa phróiseas freagrach as comhpháirt amháin den phróiseas, is é sin, tá freagracht adamhach amháin aige - a ól, a dhoirteadh nó a snack.

Tá an poll óil, ina dhiaidh sin, ina éadan do na hoibríochtaí seo:

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

Prionsabal Freagrachta Aonair. Níl sé chomh simplí agus is cosúil

Cén fáth?

Scríobhann an ríomhchláraitheoir daonna cód don ghealbhán, agus bíonn an moncaí neamhaireach, dúr agus i gcónaí faoi dheifir. Is féidir leis thart ar 3 - 7 téarma a shealbhú agus a thuiscint ag aon am amháin.
I gcás meisceoir, tá trí cinn de na téarmaí seo. Mar sin féin, má scríobhann muid an cód le bileog amháin, ansin beidh lámha, spéaclaí, troideanna agus argóintí gan deireadh faoi pholaitíocht. Agus beidh sé seo go léir i gcorp modh amháin. Tá mé cinnte go bhfaca tú cód den sórt sin i do chleachtas. Ní hé an tástáil is daonnachtúla don psyche.

Ar an láimh eile, tá an fear moncaí deartha chun rudaí fíor-domhan a insamhail ina cheann. Ina shamhlaíocht, is féidir leis iad a bhrú le chéile, rudaí nua a bhailiú uathu, agus iad a dhíchóimeáil ar an mbealach céanna. Samhlaigh seancharr samhail. I do shamhlaíocht, is féidir leat a oscailt an doras, unscrew an doras Baile Átha Troim agus a fheiceáil ann na meicníochtaí ardaitheoir fuinneoige, taobh istigh de a mbeidh giaranna. Ach ní féidir leat comhpháirteanna uile an mheaisín a fheiceáil ag an am céanna, i "liosta" amháin. Ar a laghad ní féidir leis an “fear moncaí”.

Dá bhrí sin, déanann ríomhchláraitheoirí daonna meicníochtaí casta a dhianscaoileadh i sraith d'eilimintí oibre nach bhfuil chomh casta. Mar sin féin, is féidir é a dhianscaoileadh ar bhealaí éagsúla: i go leor gluaisteáin d'aois, téann an duct aeir isteach sa doras, agus i gcarranna nua-aimseartha, cuireann teip ar an leictreonaic glas cosc ​​ar an inneall tosú, rud a d'fhéadfadh a bheith ina fhadhb le linn deisiúcháin.

Anois, Is prionsabal é SRP a mhíníonn CONAS a dhianscaoileadh, is é sin, cén áit ar cheart an líne roinnte a tharraingt.

Deir sé gur gá dianscaoileadh de réir an phrionsabail a bhaineann le “freagracht” a roinnt, is é sin, de réir chúraimí rudaí áirithe.

Prionsabal Freagrachta Aonair. Níl sé chomh simplí agus is cosúil

Fillfimid ar an ól agus na buntáistí a fhaigheann an fear moncaí le linn lobhadh:

  • Tá an cód éirithe thar a bheith soiléir ag gach leibhéal
  • Is féidir le roinnt ríomhchláraitheoirí an cód a scríobh ag an am céanna (scríobhann gach ceann acu eilimint ar leith)
  • Déantar tástáil uathoibrithe a shimpliú - dá simplí an eilimint, is amhlaidh is éasca é a thástáil
  • Is cosúil comhdhéanamh an chóid - is féidir leat athsholáthar a dhéanamh Oibríocht Óil le hoibríocht ina ndéanann duine ar meisce leacht a dhoirteadh faoin mbord. Nó cuir oibríocht ina ionad an doirteadh le hoibríocht ina meascann tú fíon agus uisce nó vodca agus beoir. Ag brath ar riachtanais ghnó, is féidir leat gach rud a dhéanamh gan teagmháil a dhéanamh leis an gcód modh Tippler.Gníomh.
  • Ó na hoibríochtaí seo is féidir leat an glutton a fhilleadh (ag baint úsáide as amháin TakeBitOperation), Alcólach (ag baint úsáide as amháin Oibríocht Óil díreach ón mbuidéal) agus go leor riachtanais ghnó eile a chomhlíonadh.

(Ó, is cosúil gur prionsabal OCP é seo cheana féin, agus sháraigh mé freagracht an phoist seo)

Agus, ar ndóigh, na míbhuntáistí:

  • Beidh orainn níos mó cineálacha a chruthú.
  • Ólann duine ar meisce don chéad uair cúpla uair an chloig níos déanaí ná mar a bheadh ​​aige murach é.

Sainmhíniú 2. Athróg aontaithe.

Ceadaigh dom, a dhaoine uaisle! Tá freagracht amháin ar an rang óil freisin - ólann sé! Agus go ginearálta, is coincheap an-doiléir é an focal “freagracht”. Tá duine éigin freagrach as cinniúint na daonnachta, agus tá duine éigin freagrach as na penguins a cuireadh ar ceal ag an cuaille a ardú.

Déanaimis machnamh ar dhá fheidhmiú den óltóir. Tá trí rang sa chéad cheann, a luaitear thuas - Doirt, deoch agus sneaiceanna.

Scríobhtar an dara ceann tríd an modheolaíocht “Ar Aghaidh agus Amháin Ar Aghaidh” agus tá loighic iomlán an mhodha ann Acht:

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

Breathnaíonn an dá rang seo, ó thaobh breathnóra sheachtraigh, díreach mar a chéile agus tá an fhreagracht chéanna “ól” orthu.

Mearbhall!

Ansin téann muid ar líne agus faighimid amach sainmhíniú eile ar SRP - an Prionsabal Aonair Athraitheachta.

Deir SCP go bhfuil "Níl ach cúis amháin ag modúl le hathrú“. Is é sin, "Is cúis le hathrú í an fhreagracht."

(Dealraíonn sé go raibh na guys a tháinig suas leis an sainmhíniú bunaidh muiníneach as an cumas telepathic an fear moncaí)

Anois titeann gach rud i bhfeidhm. Ar leithligh, is féidir linn na nósanna imeachta doirteadh, óil agus sneaiceanna a athrú, ach sa óltóir féin ní féidir linn ach seicheamh agus comhdhéanamh na n-oibríochtaí a athrú, mar shampla, tríd an sneaiceanna a bhogadh roimh ól nó trí léamh tósta a chur leis.

Sa chur chuige “Ar Aghaidh agus Amháin Ar Aghaidh”, ní athraítear gach rud is féidir a athrú ach amháin sa mhodh Acht. Is féidir é seo a bheith inléite agus éifeachtach nuair nach bhfuil mórán loighic ann agus is annamh a athraíonn sé, ach is minic a chríochnaíonn sé ar mhodhanna uafásacha de 500 líne an ceann, le níos mó ráiteas más rud é ná mar a theastaíonn don Rúis dul isteach i NATO.

Míniú 3. Logánú athruithe.

Is minic nach dtuigeann óltóirí cén fáth ar dhúisigh siad in árasán duine eile, nó cá bhfuil a bhfón póca. Tá sé in am logáil mhionsonraithe a chur leis.

Tosaímid ag logáil leis an bpróiseas doirteadh:

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

Trí é a chuimsiú i Oibríocht Doirteadh, d'fheidhmíomar go ciallmhar ó thaobh freagrachta agus imchochlaithe de, ach anois táimid mearbhall le prionsabal na héagsúlachta. Chomh maith leis an oibríocht féin, is féidir a athrú, éiríonn an logáil féin a athrú freisin. Beidh ort logálaí speisialta a scaradh agus a chruthú don oibríocht dhoirteadh:

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

Tabharfaidh an léitheoir grinn faoi deara é sin LogAfter, Loga Roimh и OnEarráid Is féidir iad a athrú ina n-aonar freisin, agus, de réir analaí leis na céimeanna roimhe seo, cruthófar trí rang: DoirtLoggerRoimhe, DoirtLoggerAfter и PourErrorLogger.

Agus ag cuimhneamh go bhfuil trí oibríocht ann do óltóir, faigheann muid naoi rang logáil. Mar thoradh air sin, tá an ciorcal óil ar fad comhdhéanta de 14 (!!!) rang.

Hyperbola? Ar éigean! Roinnfidh fear moncaí le grenade dianscaoilte an “pourer” ina mhaisitheoir, gloine, oibreoirí doirteadh, seirbhís soláthair uisce, múnla fisiceach imbhualadh móilíní, agus don chéad ráithe eile déanfaidh sé iarracht na spleáchais a réiteach gan bhriseadh. athróga domhanda. Agus creidim dom, ní stopfaidh sé.

Is ag an bpointe seo a thagann go leor ar an tátal gur scéalta fairy ó ríochtaí bándearga iad SRP, agus go dtéann siad chun núdail a imirt ...

... gan foghlaim faoi thríú sainmhíniú ar Srp:

“Deirtear sa Phrionsabal um Fhreagracht Aonair go bhfuil ba chóir rudaí atá cosúil le hathrú a stóráil in aon áit amháin“. nó "Cad iad na hathruithe le chéile ba chóir a choinneáil in aon áit amháin"

Is é sin, má athraíonn muid logáil oibríochta, ansin ní mór dúinn é a athrú in aon áit amháin.

Is pointe an-tábhachtach é seo - ós rud é go ndúirt na míniúcháin go léir ar SRP a bhí thuas go raibh sé riachtanach na cineálacha a bhrú le chéile agus iad á mbrú, is é sin, chuir siad “uasteorainn” ar mhéid an ábhair, agus anois táimid ag caint cheana féin faoi “teorainn níos ísle”. I bhfocail eile, Ní hamháin go n-éilíonn SRP “brú le linn a bhrúite”, ach freisin gan ró-dhéanamh é - “ná brú ar rudaí comhghlasála”. Is é seo an cath mór idir rásúir Occam agus an fear moncaí!

Prionsabal Freagrachta Aonair. Níl sé chomh simplí agus is cosúil

Anois ba chóir go mbraitheann an t-óltóir níos fearr. Chomh maith leis an bhfíric nach gá an logálaí IPourLogger a roinnt i dtrí rang, is féidir linn na logálaithe go léir a chomhcheangal in aon chineál amháin:

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

Agus má chuirimid ceathrú cineál oibríochta leis, ansin tá an logáil dó réidh cheana féin. Agus tá cód na n-oibríochtaí féin glan agus saor ó thorann bonneagair.

Mar thoradh air sin, tá 5 rang againn chun fadhb an óil a réiteach:

  • Oibriú ag stealladh
  • Oibriú óil
  • Oibriú jamming
  • Logálaí
  • Aghaidh an óil

Tá gach ceann acu freagrach go docht as feidhmiúlacht amháin agus tá cúis amháin aige le hathrú. Tá na rialacha go léir atá cosúil le hathrú suite in aice láimhe.

Sampla den saol fíor

Scríobhamar seirbhís uair amháin chun cliant b2b a chlárú go huathoibríoch. Agus tháinig modh Dé le feiceáil le haghaidh 200 líne d’ábhar comhchosúil:

  • Téigh go dtí 1C agus cruthaigh cuntas
  • Leis an gcuntas seo, téigh go dtí an modúl íocaíochta agus cruthaigh ansin é
  • Seiceáil nach bhfuil cuntas a bhfuil a leithéid de chuntas cruthaithe aige ar an bpríomhfhreastalaí
  • Cruthaigh cuntas nua
  • Cuir na torthaí clárúcháin sa mhodúl íocaíochta agus an uimhir 1c leis an tseirbhís torthaí clárúcháin
  • Cuir faisnéis chuntais leis an tábla seo
  • Cruthaigh uimhir phointe don chliant seo sa tseirbhís pointí. Cuir d’uimhir chuntais 1c ar aghaidh chuig an tseirbhís seo.

Agus bhí thart ar 10 n-oibríochtaí gnó eile ar an liosta seo le nascacht uafásach. Bhí réad an chuntais de dhíth ar bheagnach gach duine. Bhí gá le haitheantas an phointe agus ainm an chliaint i leath de na glaonna.

Tar éis uair an chloig de athmhonarú, bhíomar in ann an cód bonneagair agus roinnt de na nuances a bhaineann le hoibriú le cuntas a scaradh i modhanna/ranganna ar leith. Rinne modh Dé níos éasca é, ach bhí 100 líne de chód fágtha nach raibh ag iarraidh a bheith untangled.

Ní raibh sé soiléir ach tar éis cúpla lá gurb é croílár an mhodha "éadroim" seo algartam gnó. Agus go raibh an cur síos bunaidh ar na sonraíochtaí teicniúla casta go leor. Agus is é an iarracht an modh seo a bhriseadh ina phíosaí a sháróidh an SRP, agus ní vice versa.

Foirmiúlacht.

Tá sé in am ár n-ólta a fhágáil ina n-aonar. Triomaigh do chuid deora - is cinnte go bhfillfimid air lá éigin. Anois déanaimis an t-eolas ón alt seo a fhoirmiú.

Foirmiúlacht 1. SRP a mhíniú

  1. Scar na heilimintí ionas go mbeidh gach ceann acu freagrach as rud amháin.
  2. Seasann freagracht do “chúis le hathrú”. Is é sin le rá nach bhfuil ach cúis amháin athraithe ag gach eilimint, i dtéarmaí loighic ghnó.
  3. Athruithe féideartha ar loighic gnó. Ní mór a bheith logánta. Caithfidh eilimintí a athraíonn go sioncronach a bheith in aice láimhe.

Foirmiúlacht 2. Critéir riachtanacha féintástála.

Ní fhaca mé critéir imleor chun an PTS a chomhlíonadh. Ach tá coinníollacha riachtanacha ann:

1) Fiafraigh díot féin cad a dhéanann an rang/modh/modúl/seirbhís seo. ní mór duit é a fhreagairt le sainmhíniú simplí. ( Go raibh maith agat Brightori )

mínithe

Mar sin féin, uaireanta bíonn sé an-deacair teacht ar shainmhíniú simplí

2) Má shocraítear fabht nó má chuirtear gné nua leis, bíonn tionchar aige ar íoslíon comhad/ranganna. Go hidéalach - ceann amháin.

mínithe

Ós rud é go bhfuil freagracht (as gné nó fabht) cuimsithe i gcomhad/rang amháin, tá a fhios agat go díreach cá bhfeicfidh tú agus cad is ceart duit a chur in eagar. Mar shampla: ní bheidh gá ach an logálaí a athrú chun aschur na n-oibríochtaí logála a athrú. Níl aon ghá a rith tríd an gcuid eile den chód.

Sampla eile is ea rialú Chomhéadain nua a chur leis, cosúil leis na cinn roimhe seo. Má chuireann sé seo iachall ort 10 n-eintiteas éagsúla agus 15 tiontairí éagsúla a chur leis, tá an chuma ar an scéal go bhfuil tú ag déanamh ró-dhéanamh air.

3) Má tá roinnt forbróirí ag obair ar ghnéithe éagsúla de do thionscadal, is beag an dóchúlacht go dtarlóidh coinbhleacht chumaisc, is é sin, an dóchúlacht go n-athróidh roinnt forbróirí an comhad/aicme chéanna ag an am céanna.

mínithe

Más rud é, nuair a chuireann tú oibríocht nua "Doirt vodca faoin mbord", ní mór duit dul i bhfeidhm ar an logálaí, ar oibriú an óil agus a dhoirteadh, ansin is cosúil go bhfuil na freagrachtaí roinnte go cam. Ar ndóigh, níl sé seo indéanta i gcónaí, ach ba cheart dúinn iarracht a dhéanamh an figiúr seo a laghdú.

4) Nuair a chuirtear ceist shoiléirithe ort faoi loighic ghnó (ó fhorbróir nó ó bhainisteoir), téann tú isteach go docht i rang/comhad amháin agus ní fhaigheann tú eolas ach as sin.

mínithe

Scríobhtar gnéithe, rialacha nó halgartaim go dlúth, gach ceann acu in aon áit amháin, agus ní scaiptear iad le bratacha ar fud an spáis chóid.

5) Tá an t-ainm soiléir.

mínithe

Tá ár rang nó ár modh freagrach as rud amháin, agus léirítear an fhreagracht ina ainm

AllManagersManagerService - rang Dé is dócha
LocalPayment - ní dócha

Foirmiúlacht 3. Modheolaíocht forbartha an chéad uair.

Ag tús an dearadh, níl a fhios ag an bhfear moncaí agus ní bhraitheann sé go léir subtleties na faidhbe atá á réiteach agus is féidir botún a dhéanamh. Is féidir leat botúin a dhéanamh ar bhealaí éagsúla:

  • Déan rudaí rómhór trí fhreagrachtaí éagsúla a chumasc
  • Athfhráma a dhéanamh trí fhreagracht aonair a roinnt ina go leor cineálacha éagsúla
  • Sainmhínigh go mícheart teorainneacha na freagrachta

Tá sé tábhachtach cuimhneamh ar an riail: “is fearr botún mór a dhéanamh,” nó “mura bhfuil tú cinnte, ná scoilt suas é.” Más rud é, mar shampla, go bhfuil dhá fhreagracht ar do rang, tá sé intuigthe go fóill agus is féidir é a roinnt ina dhá cheann gan ach mionathruithe a dhéanamh ar an gcód cliant. De ghnáth bíonn sé níos deacra gloine a chur le chéile ó shardaí gloine mar gheall ar an gcomhthéacs a bheith scaipthe thar roinnt comhad agus an easpa spleáchais riachtanacha sa chód cliant.

Tá sé in am é a ghlaoch in aghaidh an lae

Níl raon feidhme an SRP teoranta do OOP agus SOLID. Baineann sé le modhanna, feidhmeanna, ranganna, modúil, micreasheirbhísí agus seirbhísí. Baineann sé le forbairt “figax-figax-and-prod” agus “roicéad-eolaíocht” araon, rud a fhágann go bhfuil an domhan beagán níos fearr i ngach áit. Má cheapann tú faoi, is beagnach prionsabal bunúsach gach innealtóireachta é seo. Tógtar innealtóireacht mheicniúil, córais rialaithe, agus go deimhin gach córas casta as comhpháirteanna, agus ní dhéantar solúbthacht ó “foilroinnt” do dhearthóirí, ní bhaineann “ró-ilroinnt” de dhearthóirí éifeachtúlachta, agus baineann teorainneacha míchearta cúis agus suaimhneas intinne leo.

Prionsabal Freagrachta Aonair. Níl sé chomh simplí agus is cosúil

Ní nádúr é SRP agus ní cuid den eolaíocht chruinn é. Briseann sé amach as ár dteorainneacha bitheolaíochta agus síceolaíochta.Níl ann ach bealach le córais chasta a rialú agus a fhorbairt ag baint úsáide as inchinn an moncaí. Insíonn sé dúinn conas córas a dhianscaoileadh. Bhí méid cothrom telepathy ag teastáil ón bhfoirmliú bunaidh, ach tá súil agam go nglanann an t-alt seo cuid den scáileán deataigh.

Foinse: will.com

Add a comment