Prionnsabal Uallach Singilte. Chan eil e cho sìmplidh sa tha e coltach

Prionnsabal Uallach Singilte. Chan eil e cho sìmplidh sa tha e coltach Prionnsabal uallach singilte, ris an canar cuideachd prionnsapal aon uallach,
aka prionnsapal caochlaidheachd èideadh - fear air leth sleamhainn ri thuigsinn agus ceist cho iomagaineach aig agallamh le prògramadair.

Thachair a 'chiad eòlas mòr agam air a' phrionnsapal seo aig toiseach a 'chiad bhliadhna, nuair a chaidh an fheadhainn òga is uaine a thoirt don choille gus oileanaich a dhèanamh a-mach à larbha - oileanaich fìor.

Anns a’ choille, bha sinn air ar roinn ann am buidhnean de 8-9 neach gach fear agus bha farpais againn - dè am buidheann a bhiodh ag òl botal bhodka as luaithe, fhad ‘s a bhiodh a’ chiad duine bhon bhuidheann a’ dòrtadh bhodka a-steach do ghlainne, an dàrna fear ag òl, agus tha greim aig an treas fear. Bidh an aonad a chuir crìoch air an obair aige a’ gluasad gu deireadh ciudha na buidhne.

Bha a’ chùis far an robh meud a’ chiudha iomadaidh de thrì na dheagh bhuileachadh air SRP.

Mìneachadh 1. Singilte uallach.

Tha am mìneachadh oifigeil air a’ Phrionnsapal Uallach Singilte (SRP) ag ràdh gu bheil uallach agus adhbhar fhèin aig gach eintiteas airson a bhith ann, agus chan eil aige ach aon uallach.

Beachdaich air an nì “Drinker” (Tippler).
Gus prionnsapal SRP a bhuileachadh, roinnidh sinn na dleastanasan ann an trì:

  • Tha aon a' dòrtadh (PourOperation)
  • Aon deoch (Obrachadh Òil)
  • Tha greim-bìdh aig fear dhiubh (TakeBiteOperation)

Tha uallach air gach com-pàirtiche sa phròiseas airson aon phàirt den phròiseas, is e sin, tha aon uallach atamach aige - òl, dòrtadh no greim-bìdh.

Tha an toll òil, an uair sin, na aghaidh airson na h-obraichean sin:

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

Prionnsabal Uallach Singilte. Chan eil e cho sìmplidh sa tha e coltach

Carson?

Bidh am prògramadair daonna a’ sgrìobhadh còd airson an ape-man, agus tha an t-appe-man gun aire, gòrach agus an-còmhnaidh ann an cabhaig. Is urrainn dha mu 3 - 7 teirmean a chumail agus a thuigsinn aig aon àm.
A thaobh neach air mhisg, tha trì de na teirmean sin ann. Ach, ma sgrìobhas sinn an còd le aon duilleag, bidh làmhan, glainneachan, sabaidean agus argamaidean gun chrìoch mu phoilitigs ann. Agus bidh seo uile ann an corp aon dòigh. Tha mi cinnteach gum faca tu a leithid de chòd nad chleachdadh. Chan e an deuchainn as daonnaiche airson an psyche.

Air an làimh eile, tha an duine ape air a dhealbhadh gus atharrais air nithean fìor san t-saoghal na cheann. Na mhac-meanmna, is urrainn dha am putadh còmhla, rudan ùra a chruinneachadh bhuapa, agus an toirt às an aon dòigh. Smaoinich air seann chàr modail. Anns a 'mhac-meanmna agad, faodaidh tu an doras fhosgladh, cuir a-mach an doras a-mach agus faic an sin na h-innealan togail uinneig, agus am broinn sin bidh gèaraichean. Ach chan fhaic thu a h-uile pàirt den inneal aig an aon àm, ann an aon "liosta". Co-dhiù chan urrainn don “duine muncaidh”.

Mar sin, bidh luchd-prògramaidh daonna a 'briseadh uidheamachdan iom-fhillte gu seata de eileamaidean nach eil cho iom-fhillte agus ag obair. Ach, faodar a lobhadh ann an diofar dhòighean: ann an iomadh seann chàr, bidh an duct èadhair a ’dol a-steach don doras, agus ann an càraichean an latha an-diugh, bidh fàilligeadh ann an electronics glasaidh a’ cur casg air an einnsean bho bhith a ’tòiseachadh, a dh’ fhaodadh a bhith na dhuilgheadas aig àm càraidh.

Mar sin, Tha SRP na phrionnsapal a tha a’ mìneachadh MAR a nì thu lobhadh, is e sin, far an tarraing thu an loidhne roinneadh.

Tha e ag ràdh gu bheil e riatanach a bhith a 'lobhadh a rèir prionnsapal roinneadh "uallach," is e sin, a rèir gnìomhan cuid de nithean.

Prionnsabal Uallach Singilte. Chan eil e cho sìmplidh sa tha e coltach

Tillidh sinn gu bhith ag òl agus na buannachdan a gheibh am moncaidh aig àm lobhadh:

  • Tha an còd air fàs gu math soilleir aig gach ìre
  • Faodar an còd a sgrìobhadh le grunn phrògraman aig an aon àm (bidh gach fear a’ sgrìobhadh eileamaid air leth)
  • Tha deuchainn fèin-ghluasadach air a dhèanamh nas sìmplidhe - mar as sìmplidh an eileamaid, is ann as fhasa a bhios e deuchainn
  • Tha compositionality a 'chòd a' nochdadh - faodaidh tu a chur na àite Obrachadh Òil gu obair anns am bi neach air mhisg a’ dòrtadh leaghan fon bhòrd. No cuir an àite an obair dòrtadh le gnìomhachd anns am bi thu a’ measgachadh fìon is uisge no bhodka is lionn. A rèir riatanasan gnìomhachais, faodaidh tu a h-uile càil a dhèanamh gun a bhith a ’beantainn ris a’ chòd modh Tippler.Gniomh.
  • Bho na h-obraichean sin faodaidh tu an glutton a phasgadh (a’ cleachdadh a-mhàin TakeBitOperation), Deoch-làidir (a’ cleachdadh a-mhàin Obrachadh Òil dìreach bhon bhotal) agus coinneachadh ri mòran riatanasan gnìomhachais eile.

(O, tha e coltach gur e prionnsapal OCP a tha seo mar-thà, agus bhris mi uallach na dreuchd seo)

Agus, gu dearbh, na h-eas-bhuannachdan:

  • Feumaidh sinn barrachd sheòrsan a chruthachadh.
  • Bidh neach air mhisg ag òl airson a’ chiad uair uair no dhà às deidh sin na bhiodh e air dhòigh eile.

Mìneachadh 2. Caochlaideachd aonaichte.

Ceadaichibh dhomh, a dhaoine uaisle ! Tha aon uallach aig a’ chlas òil cuideachd - bidh e ag òl! Agus san fharsaingeachd, tha am facal "uallach" na bhun-bheachd air leth neo-shoilleir. Tha cuideigin an urra ri mar a thachair don chinne-daonna, agus tha cuideigin an urra ri bhith a’ togail na penguins a chaidh a thionndadh aig a’ phòla.

Beachdaichidh sinn air dà bhuileachadh den neach-òl. Anns a 'chiad fhear, a chaidh ainmeachadh gu h-àrd, tha trì clasaichean - dòrtadh, deoch agus greim-bìdh.

Tha an dàrna fear air a sgrìobhadh tron ​​​​dòigh-obrach “Air adhart agus a-mhàin air adhart” agus tha a h-uile loidsig san dòigh ann Achd:

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

Tha an dà chlas seo, bho shealladh neach-amhairc bhon taobh a-muigh, a 'coimhead dìreach mar an ceudna agus a' roinn an aon uallach airson "òl".

Mì-mhisneachd!

An uairsin thèid sinn air-loidhne agus lorg sinn mìneachadh eile air SRP - am Prionnsabal Atharrachadh Singilte.

Tha SCP ag ràdh gu bheil "Tha aon agus aon adhbhar aig modal airson atharrachadh". Is e sin, “Tha uallach na adhbhar airson atharrachadh.”

(Tha e coltach gu robh na balaich a thàinig a-steach leis a’ mhìneachadh thùsail misneachail ann an comasan telepathic an duine ape)

A-nis tha a h-uile dad a 'tuiteam na àite. Air leth, is urrainn dhuinn na modhan dòrtadh, òl agus greim-bìdh atharrachadh, ach anns an neach-òl fhèin chan urrainn dhuinn ach sreath agus co-dhèanamh gnìomhachd atharrachadh, mar eisimpleir, le bhith a’ gluasad greim-bìdh mus òl thu no a’ cur leughadh toast ris.

Anns an dòigh-obrach “Air adhart agus a-mhàin air adhart”, chan eil a h-uile dad a ghabhas atharrachadh ach air atharrachadh san dòigh Achd. Faodaidh seo a bhith furasta a leughadh agus èifeachdach nuair nach eil mòran loidsig ann agus is ann ainneamh a bhios e ag atharrachadh, ach gu tric thig e gu crìch ann an dòighean uamhasach de loidhnichean 500 gach fear, le barrachd ma tha aithrisean ann na tha riatanach airson an Ruis a dhol còmhla ri NATO.

Mìneachadh 3. Ionadail atharrachaidhean.

Gu tric chan eil luchd-òl a’ tuigsinn carson a dhùisg iad ann an àros cuideigin eile, no càite a bheil am fòn-làimhe aca. Tha an t-àm ann logadh mionaideach a chuir ris.

Feuch an tòisich sinn a 'logadh leis a' phròiseas dòrtadh:

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

Le bhith ga chuairteachadh a-steach PourOperation, rinn sinn gnìomh gu ciallach bho shealladh uallach agus cuairteachadh, ach a-nis tha sinn troimh-chèile le prionnsapal caochlaidheachd. A bharrachd air an obair fhèin, a dh'fhaodas atharrachadh, bidh an logadh fhèin cuideachd ag atharrachadh. Feumaidh tu logger sònraichte a sgaradh agus a chruthachadh airson an obair dòrtadh:

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

Mothaichidh an leughadair grinn sin Log Às dèidh, Log air thoiseach и OnMearachd Faodar atharrachadh leotha fhèin cuideachd, agus, ann an co-chòrdadh ris na ceumannan roimhe, cruthaichidh e trì clasaichean: PourLoggerRoimhe, PourLogger Às deidh и PourErrorLogger.

Agus a’ cuimhneachadh gu bheil trì obrachaidhean ann airson neach-òl, gheibh sinn naoi clasaichean logaidh. Mar thoradh air an sin, tha an cearcall òil gu lèir air a dhèanamh suas de chlasaichean 14 (!!!).

Hyperbola? Cha mhòr! Roinnidh fear muncaidh le grenade lobhadh an “pourer” ann an decanter, glainne, luchd-obrachaidh dòrtadh, seirbheis solar uisge, modail fiosaigeach de bhualadh mholacilean, agus airson an ath chairteal feuchaidh e ris na h-eisimeileachdan fhuasgladh às aonais caochladairean cruinne. Agus creidibh mi, cha stad e.

Is ann aig an ìre seo a tha mòran a’ tighinn chun cho-dhùnadh gur e sgeulachdan sìthe bho rìoghachdan pinc a th’ ann an SRP, agus a’ falbh a chluich nòtaichean...

... gun a bhith ag ionnsachadh mu dheidhinn an treas mìneachadh air Srp:

“Tha am Prionnsabal Uallach Singilte ag ràdh sin bu chòir rudan a tha coltach ri atharrachadh a bhith air an stòradh ann an aon àite". neo"Dè na h-atharrachaidhean còmhla a bu chòir a chumail ann an aon àite"

Is e sin, ma dh'atharraicheas sinn clàradh gnìomhachd, feumaidh sinn atharrachadh ann an aon àite.

Is e puing glè chudromach a tha seo - leis gu robh a h-uile mìneachadh air SRP gu h-àrd ag ràdh gu robh e riatanach na seòrsaichean a phronnadh fhad ‘s a bha iad gan pronnadh, is e sin, chuir iad“ crìoch àrd ”air meud an nì, agus a-nis tha sinn mu thràth a’ bruidhinn mu dheidhinn “crìoch nas ìsle”. Ann am faclan eile, Chan e a-mhàin gu bheil SRP ag iarraidh “a’ pronnadh fhad ‘s a tha iad a’ pronnadh”, ach cuideachd gun a bhith a’ dèanamh cus dheth - “na bi a’ pronnadh rudan eadar-cheangailte”. Is e so am blàr mòr a bha eadar ràsair Occam agus fear an ape !

Prionnsabal Uallach Singilte. Chan eil e cho sìmplidh sa tha e coltach

A-nis bu chòir don neach-òl a bhith a 'faireachdainn nas fheàrr. A bharrachd air an fhìrinn nach eil feum air an logger IPourLogger a roinn ann an trì clasaichean, is urrainn dhuinn cuideachd a h-uile logger a chur còmhla ann an aon sheòrsa:

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

Agus ma chuireas sinn an ceathramh seòrsa obrachaidh ris, tha an clàradh air a shon deiseil mu thràth. Agus tha còd na h-obrach fhèin glan agus saor bho fhuaim bun-structair.

Mar thoradh air an sin, tha 5 clasaichean againn airson fuasgladh fhaighinn air an duilgheadas òl:

  • Obrachadh a 'dòrtadh
  • Obrachadh ag òl
  • Obrachadh jamming
  • Logadair
  • Aghaidh an neach-òl

Tha uallach teann air gach fear dhiubh airson aon ghnìomhachd agus tha aon adhbhar aca airson atharrachadh. Tha a h-uile riaghailt coltach ri atharrachadh faisg air làimh.

Eisimpleir fìor-bheatha

Sgrìobh sinn seirbheis aon uair airson neach-dèiligidh b2b a chlàradh gu fèin-ghluasadach. Agus nochd modh DIA airson 200 loidhne de shusbaint coltach ris:

  • Rach gu 1C agus cruthaich cunntas
  • Leis a 'chunntas seo, rachaibh chun mhodal pàighidh agus cruthaich e an sin
  • Dèan cinnteach nach deach cunntas le leithid de chunntas a chruthachadh air a’ phrìomh fhrithealaiche
  • Cruthaich cunntas ùr
  • Cuir na toraidhean clàraidh sa mhodal pàighidh agus an àireamh 1c ris an t-seirbheis toraidhean clàraidh
  • Cuir fiosrachadh cunntais ris a’ chlàr seo
  • Cruthaich àireamh puing airson an neach-dèiligidh seo anns an t-seirbheis phuing. Thoir seachad an àireamh cunntais 1c agad chun na seirbheis seo.

Agus bha timcheall air 10 gnìomhachd gnìomhachais eile air an liosta seo le ceangal uamhasach. Bha feum aig cha mhòr a h-uile duine air an nì cunntais. Bha feum air an ID puing agus ainm neach-dèiligidh ann an leth de na fiosan.

Às deidh uair a thìde de ath-nuadhachadh, bha e comasach dhuinn an còd bun-structair agus cuid de na h-nòsan a thaobh a bhith ag obair le cunntas a sgaradh ann an dòighean / clasaichean fa leth. Rinn modh Dhè e nas fhasa, ach bha 100 loidhne de chòd air fhàgail nach robh dìreach airson a bhith gun cheangal.

Is ann dìreach às deidh beagan làithean a dh’ fhàs e soilleir gur e algorithm gnìomhachais brìgh an dòigh “aotrom” seo. Agus gu robh an tuairisgeul tùsail air na mion-chomharrachadh teignigeach gu math toinnte. Agus is e an oidhirp an dòigh seo a bhriseadh ann am pìosan a bhriseas an SRP, agus chan ann a chaochladh.

Foirmeileachd.

Tha an t-àm ann ar deoch fhàgail nar n-aonar. Tiormaich na deòir agad - gu cinnteach tillidh sinn thuige uaireigin. A-nis leig dhuinn an eòlas bhon artaigil seo a dhèanamh foirmeil.

Foirmealachd 1. Mìneachadh air SRP

  1. Roinn na h-eileamaidean gus am bi uallach air gach fear dhiubh airson aon rud.
  2. Tha uallach a’ seasamh airson “adhbhar airson atharrachadh.” Is e sin, chan eil ach aon adhbhar aig gach eileamaid airson atharrachadh, a thaobh loidsig gnìomhachais.
  3. Atharraichean a dh’ fhaodadh a bhith ann an loidsig gnìomhachais. feumaidh a bhith ionadail. Feumaidh eileamaidean a tha ag atharrachadh gu sioncronaich a bhith faisg air làimh.

Foirmealachd 2. Slatan-tomhais fèin-dheuchainn riatanach.

Chan fhaca mi slatan-tomhais gu leòr airson an SRP a choileanadh. Ach tha suidheachaidhean riatanach ann:

1) Faighnich dhut fhèin dè a bhios an clas/modh/modal/seirbheis seo a’ dèanamh. feumaidh tu a fhreagairt le mìneachadh sìmplidh. ( Tapadh leat Brightori )

mìneachaidhean

Ach, uaireannan tha e gu math duilich mìneachadh sìmplidh a lorg

2) Le bhith a’ càradh bug no a’ cur feart ùr ris a’ toirt buaidh air an àireamh as lugha de fhaidhlichean / chlasaichean. Mas fheàrr - aon.

mìneachaidhean

Leis gu bheil uallach (airson feart no bug) air a chuairteachadh ann an aon fhaidhle/clas, tha fios agad gu cinnteach càite an coimhead thu agus dè a dheasaicheas tu. Mar eisimpleir: chan fheum am feart de bhith ag atharrachadh toradh gnìomhachd logaidh ach an neach-clàraidh atharrachadh. Chan eil feum air ruith tron ​​​​chòrr den chòd.

Is e eisimpleir eile smachd UI ùr a chuir ris, coltach ris an fheadhainn roimhe. Ma bheir seo ort 10 aonadan eadar-dhealaichte agus 15 luchd-tionndaidh eadar-dhealaichte a chur ris, tha e coltach gu bheil thu a’ dèanamh cus dheth.

3) Ma tha grunn luchd-leasachaidh ag obair air feartan eadar-dhealaichte den phròiseact agad, is e glè bheag de choltas còmhstri aonaidh, is e sin, an coltas gun tèid an aon fhaidhle / clas atharrachadh le grunn luchd-leasachaidh aig an aon àm.

mìneachaidhean

Ma tha, nuair a bhios tu a 'cur ris an obair ùr "Doirt vodca fon bhòrd", feumaidh tu buaidh a thoirt air an neach-clàraidh, obrachadh a bhith ag òl agus a' dòrtadh, tha e coltach gu bheil na dleastanasan air an roinn gu cam. Gu dearbh, chan eil seo an-còmhnaidh comasach, ach bu chòir dhuinn feuchainn ris an àireamh seo a lughdachadh.

4) Nuair a thèid ceist soilleireachaidh fhaighneachd dhut mu loidsig gnìomhachais (bho leasaiche no manaidsear), thèid thu gu teann a-steach do aon chlas / faidhle agus gheibh thu fiosrachadh às an sin a-mhàin.

mìneachaidhean

Tha feartan, riaghailtean no algoirmean air an sgrìobhadh gu teann, gach fear ann an aon àite, agus chan eil iad air an sgapadh le brataichean air feadh an àite còd.

5) Tha an t-ainmeachadh soilleir.

mìneachaidhean

Tha an clas no an dòigh againn an urra ri aon rud, agus tha an t-uallach air a nochdadh na ainm

AllManagersManagerService - is dòcha clas Dhè
Pàigheadh ​​​​ionadail - is dòcha nach eil

Foirmealachd 3. Modh-obrach leasachaidh Occam-first.

Aig toiseach an dealbhaidh, chan eil fios aig an duine muncaidh agus chan eil e a 'faireachdainn gu bheil a h-uile càil den duilgheadas air a rèiteachadh agus faodaidh e mearachd a dhèanamh. Faodaidh tu mearachdan a dhèanamh ann an diofar dhòighean:

  • Dèan nithean ro mhòr le bhith a’ ceangal diofar dhleastanasan
  • Ath-dhealbhadh le bhith a 'roinn aon dhleastanas ann an iomadh seòrsa
  • Mìnich crìochan dleastanas gu ceàrr

Tha e cudromach cuimhneachadh air an riaghailt: “tha e nas fheàrr mearachd mòr a dhèanamh,” no “mura h-eil thu cinnteach, na roinn e.” Ma tha, mar eisimpleir, gu bheil dà dhleastanas anns a’ chlas agad, tha e fhathast furasta a thuigsinn agus faodar a roinn na dhà le glè bheag de dh’ atharrachaidhean air còd an neach-dèiligidh. Mar as trice tha e nas duilghe glainne a chruinneachadh bho shards glainne air sgàth gu bheil an co-theacsa air a sgaoileadh thairis air grunn fhaidhlichean agus dìth eisimeileachd riatanach ann an còd an neach-cleachdaidh.

Tha an t-àm ann latha a ghairm dheth

Chan eil farsaingeachd SRP cuingealaichte ri OOP agus SOLID. Tha e a 'buntainn ri modhan, gnìomhan, clasaichean, modalan, microservices agus seirbheisean. Tha e a’ buntainn an dà chuid ri leasachadh “figax-figax-and-prod” agus “saidheans rocaid”, a’ dèanamh an t-saoghail beagan nas fheàrr anns a h-uile àite. Ma smaoinicheas tu mu dheidhinn, is e seo cha mhòr prionnsapal bunaiteach gach innleadaireachd. Tha innleadaireachd meacanaigeach, siostaman smachd, agus gu dearbh a h-uile siostam iom-fhillte air an togail bho cho-phàirtean, agus tha “fo-fhilleadh” a’ toirt sùbailteachd do luchd-dealbhaidh, tha “overfragmentation” a’ toirt air falbh luchd-dealbhaidh èifeachdais, agus tha crìochan ceàrr gan toirt air falbh bho adhbhar agus fois inntinn.

Prionnsabal Uallach Singilte. Chan eil e cho sìmplidh sa tha e coltach

Chan eil SRP air a chruthachadh le nàdar agus chan eil e na phàirt de fhìor shaidheans. Bidh e a’ briseadh a-mach às na crìochan bith-eòlasach is saidhgeòlach againn.Is e dìreach dòigh a th’ ann airson smachd a chumail air agus leasachadh siostaman iom-fhillte a’ cleachdadh an eanchainn ape-man. Tha e ag innse dhuinn mar a bhriseas sinn siostam. Dh'fheumadh an cruthachadh tùsail tomhas math de telepathy, ach tha mi an dòchas gu bheil an artaigil seo a 'glanadh cuid den sgàilean-smocaidh.

Source: www.habr.com

Cuir beachd ann