Ƙa'idar Nauyi ɗaya. Ba mai sauƙi kamar yadda ake gani ba

Ƙa'idar Nauyi ɗaya. Ba mai sauƙi kamar yadda ake gani ba Ƙa'idar alhakin ɗaya, wanda kuma aka sani da ka'idar alhakin guda ɗaya,
aka ka'idar bambancin uniform - wani musamman m Guy fahimta da kuma irin wannan m tambaya a shirye-shirye hira.

Babban masaniyata ta farko da wannan ka'ida ta faru ne a farkon shekara ta farko, lokacin da aka kai matasa da kore zuwa daji don sanya ɗalibai daga tsutsa - ɗalibai na gaske.

A cikin dajin, an raba mu zuwa rukuni na mutane 8-9 kowanne kuma mun yi gasa - wace kungiya za ta fi shan kwalabe na vodka, muddin mutum na farko daga cikin rukuni ya zuba vodka a cikin gilashi, na biyu ya sha. kuma na uku yana da abun ciye-ciye. Sashen da ya kammala aikinsa ya matsa zuwa ƙarshen jerin gwanon ƙungiyar.

Halin da girman layin ya kasance mai yawa na uku shine kyakkyawan aiwatar da SRP.

Ma'anar 1. Alhakin guda ɗaya.

Ma'anar ka'idar Nauyin Nauyi ɗaya (SRP) a hukumance ya bayyana cewa kowace ƙungiya tana da nata alhakin da dalilin wanzuwarta, kuma tana da nauyi ɗaya kawai.

Yi la'akari da abin "Mai sha" (Tippler).
Don aiwatar da ƙa'idar SRP, za mu raba nauyin zuwa uku:

  • Daya zuba (PourOperation)
  • sha daya (DrinkUpoperation)
  • Mutum yana da abun ciye-ciye (TakeBiteOperation)

Kowane mahalarta a cikin tsari yana da alhakin wani bangare na tsari, wato, yana da alhakin atomic guda ɗaya - sha, zuba ko abun ciye-ciye.

Ramin sha, bi da bi, shi ne facade ga waɗannan ayyuka:

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

Ƙa'idar Nauyi ɗaya. Ba mai sauƙi kamar yadda ake gani ba

Me ya sa?

Mai shirye-shiryen ɗan adam yana rubuta lambar don mutumin biri, kuma mutumin biri ba shi da hankali, wawa kuma koyaushe cikin gaggawa. Yana iya riƙe da fahimta game da sharuɗɗan 3-7 a lokaci ɗaya.
A wajen mashayi kuwa, wadannan sharudda uku ne. Duk da haka, idan muka rubuta lambar tare da takarda ɗaya, to, zai ƙunshi hannaye, tabarau, fadace-fadace da muhawara marasa iyaka game da siyasa. Kuma duk wannan zai kasance a cikin jikin hanya ɗaya. Na tabbata kun ga irin wannan lambar a cikin aikin ku. Ba gwajin ɗan adam ba don psyche.

A daya bangaren kuma, an yi wa mutumin biri ne don ya kwaikwayi abubuwan duniya da ke kansa. A cikin tunaninsa, zai iya tura su wuri ɗaya, ya haɗa sabbin abubuwa daga gare su, ya ƙwace su daidai da hanyar. Ka yi tunanin tsohuwar mota samfurin. A cikin tunanin ku, zaku iya buɗe kofa, buɗe ƙofa ɗin datsa sannan ku ga wurin hanyoyin ɗaga taga, waɗanda a ciki za a sami kayan aiki. Amma ba za ka iya ganin duk abubuwan da ke cikin injin a lokaci guda ba, a cikin "jeri" ɗaya. Aƙalla “mutumin biri” ba zai iya ba.

Don haka, masu tsara shirye-shirye na ɗan adam suna rikitar da hadaddun hanyoyin zuwa saitin abubuwan da ba su da rikitarwa da aiki. Duk da haka, ana iya lalacewa ta hanyoyi daban-daban: a cikin tsofaffin motoci da yawa, tashar iska ta shiga ƙofar, kuma a cikin motoci na zamani, gazawar na'urorin lantarki na kullewa ya hana injin farawa, wanda ke da matsala a lokacin gyarawa.

Yanzu, SRP wata ka'ida ce da ke bayyana YADDA ake rubewa, wato, inda za a zana layin rarrabawa.

Ya ce wajibi ne a rushe bisa ga ka'idar rarraba "alhakin," wato, bisa ga ayyukan wasu abubuwa.

Ƙa'idar Nauyi ɗaya. Ba mai sauƙi kamar yadda ake gani ba

Mu koma shaye-shaye da fa’idojin da mutumin biri yake samu a lokacin bazuwar:

  • Lambar ta bayyana sosai a kowane mataki
  • Masu shirye-shirye da yawa na iya rubuta lambar a lokaci ɗaya (kowannensu ya rubuta wani abu dabam)
  • An sauƙaƙe gwajin sarrafa kansa - mafi sauƙi na kashi, sauƙin gwadawa
  • Ƙaddamar da lambar ya bayyana - zaka iya maye gurbin DrinkUpoperation wani aiki da wani mashayi ya zuba ruwa a karkashin teburi. Ko kuma maye gurbin aikin zubar da aikin da kuka hada giya da ruwa ko vodka da giya. Dangane da buƙatun kasuwanci, zaku iya yin komai ba tare da taɓa lambar hanyar ba Tippler. Dokar.
  • Daga waɗannan ayyukan za ku iya ninka mai cin abinci (amfani kawai TakeBitOperation), Barasa (amfani kawai DrinkUpoperation kai tsaye daga kwalban) da kuma biyan wasu buƙatun kasuwanci da yawa.

(Oh, da alama wannan riga ce ka'idar OCP, kuma na keta alhakin wannan post)

Kuma, ba shakka, fursunoni:

  • Dole ne mu ƙirƙiri ƙarin nau'ikan.
  • Wani mashayi yana sha a karon farko bayan sa'o'i biyu fiye da yadda zai sha.

Ma'anar 2. Haɗin kai.

Ku ba ni izini, maza! Ajin sha kuma yana da alhakin guda ɗaya - yana sha! Kuma gabaɗaya, kalmar “alhaki” ra’ayi ne maras tabbas. Wani ne ke da alhakin makomar bil'adama, kuma wani ne ke da alhakin tayar da penguins da aka kifar da su a sanda.

Bari mu yi la'akari da aiwatarwa guda biyu na mai shayarwa. Na farko, wanda aka ambata a sama, ya ƙunshi nau'i uku - zuba, sha da abun ciye-ciye.

An rubuta na biyu ta hanyar “Gaba da Gaba kawai” kuma ya ƙunshi duk dabaru a cikin hanyar dokar:

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

Duk waɗannan azuzuwan, daga ra'ayi na mai kallo na waje, suna kallon daidai kuma suna da alhakin "sha" iri ɗaya.

Rudani!

Sa'an nan kuma mu shiga kan layi kuma mu gano wani ma'anar SRP - Ƙa'idar Canji Mai Sauƙi.

SCP ya ce "Module yana da dalili guda ɗaya kawai don canzawa". Wato "Alhaki dalili ne na canji."

(Da alama cewa mutanen da suka fito da ma'anar asali sun kasance da tabbaci a cikin kwarewar telepathic na mutumin biri)

Yanzu komai ya fada a wurin. Na dabam, za mu iya canza hanyar zubewa, sha da ciye-ciye, amma a cikin mai shayarwa kanta kawai za mu iya canza tsari da tsarin aiki, alal misali, ta hanyar motsa abun ciye-ciye kafin sha ko ƙara karatun gurasa.

A cikin tsarin "Gaba da Gaba", duk abin da za a iya canza shi ne kawai a cikin hanyar dokar. Wannan na iya zama abin karantawa da tasiri lokacin da akwai ƙananan tunani kuma yana da wuya ya canza, amma sau da yawa ya ƙare a cikin hanyoyi masu ban tsoro na 500 kowannensu, tare da karin bayani fiye da yadda ake bukata don Rasha ta shiga NATO.

Ma'anar 3. Ƙaddamar da canje-canje.

Masu shaye-shaye sau da yawa ba sa fahimtar dalilin da yasa suka farka a gidan wani, ko kuma inda wayar hannu take. Lokaci ya yi da za a ƙara cikakkun bayanai.

Bari mu fara shiga tare da tsarin zubawa:

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

By encapsulating shi a ciki PourOperation, Mun yi aiki da hikima daga ra'ayi na alhakin da encapsulation, amma yanzu mun rikice tare da ka'idar canji. Baya ga aikin da kansa, wanda zai iya canzawa, shigar da kanta kuma ya zama mai canzawa. Dole ne ku rabu kuma ku ƙirƙiri logger na musamman don aikin zuba:

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

Mai karatu mai zurfi zai lura da haka LogBayan, LogKafin и Kuskure Daya Hakanan za'a iya canza su daban-daban, kuma, ta hanyar kwatankwacin matakan da suka gabata, zai haifar da azuzuwan uku: PourLogger Kafin, PourLoggerBayan и PourErrorLogger.

Kuma idan muka tuna cewa ana yi wa mashayin tiyata sau uku, muna samun aji tara. Sakamakon haka, duka da'irar sha ta ƙunshi azuzuwan 14 (!!!).

Hyperbola? Da kyar! Mutumin biri da gurneti mai bazuwa zai raba "mai zubo" a cikin injin daskarewa, gilashin, masu aikin zuba jari, sabis na samar da ruwa, samfurin jiki na karo na kwayoyin halitta, kuma a cikin kwata na gaba zai yi ƙoƙari ya kwance abin dogara ba tare da shi ba. masu canji na duniya. Kuma ku gaskata ni, ba zai daina ba.

A wannan lokacin ne mutane da yawa suka yanke shawarar cewa SRP tatsuniyoyi ne daga masarautun ruwan hoda, kuma suna tafiya don buga noodles ...

... ba tare da koyo game da wanzuwar ma'anar Srp ta uku ba:

“Ka’idar Nauyin Nauyin Shi kaɗai ya bayyana haka abubuwan da suke kama da canji yakamata a adana su wuri guda". ko"Abin da ya canza tare ya kamata a ajiye shi wuri guda"

Wato idan muka canza gunkin aiki, to dole ne mu canza shi a wuri guda.

Wannan lamari ne mai mahimmanci - tun da duk bayanin SRP da aka ambata a sama ya ce wajibi ne a murkushe nau'ikan yayin da ake murƙushe su, wato, sun sanya "iyakance daga sama" akan girman abin, kuma yanzu muna magana ne game da "ƙuntatawa daga ƙasa" . Watau, SRP ba kawai yana buƙatar "murkushewa yayin da ake murkushewa ba", amma kuma kada a wuce gona da iri - "kada ku murkushe abubuwan da ke tsaka da juna". Wannan shine babban yaki tsakanin reza Occam da mutumin biri!

Ƙa'idar Nauyi ɗaya. Ba mai sauƙi kamar yadda ake gani ba

Yanzu ya kamata mai shayarwa ya ji daɗi. Baya ga gaskiyar cewa babu buƙatar raba ma'aunin IPourLogger zuwa aji uku, muna kuma iya haɗa duk masu yin katako zuwa nau'i ɗaya:

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

Kuma idan muka ƙara nau'in aiki na huɗu, to, an riga an riga an shirya yin rajistar shi. Kuma ka'idodin ayyukan da kansu suna da tsabta kuma ba tare da hayaniya ba.

Sakamakon haka, muna da azuzuwan 5 don magance matsalar sha:

  • Zuba aiki
  • Aikin sha
  • Aiki na jamming
  • Logger
  • Facade mai shayarwa

Kowannensu yana da alhakin aiki guda ɗaya kuma yana da dalili ɗaya na canji. Duk dokoki masu kama da canji suna nan kusa.

Misalin rayuwa na gaske

Mun taɓa rubuta sabis don yin rajista ta atomatik abokin ciniki b2b. Kuma hanyar ALLAH ta bayyana akan layi guda 200 na abun ciki iri ɗaya:

  • Je zuwa 1C kuma ƙirƙirar lissafi
  • Tare da wannan asusun, je zuwa tsarin biyan kuɗi kuma ƙirƙira shi a can
  • Bincika cewa ba a ƙirƙiri asusu mai irin wannan asusu akan babban uwar garken ba
  • Ƙirƙiri sabon asusu
  • Ƙara sakamakon rajista a cikin tsarin biyan kuɗi da lambar 1c zuwa sabis ɗin sakamakon rajista
  • Ƙara bayanan asusun zuwa wannan tebur
  • Ƙirƙiri lamba lamba don wannan abokin ciniki a cikin sabis ɗin batu. Wuce lambar asusun ku na 1c zuwa wannan sabis ɗin.

Kuma akwai ƙarin ayyukan kasuwanci kusan 10 akan wannan jerin tare da mugunyar haɗin gwiwa. Kusan kowa yana buƙatar abin asusun. Ana buƙatar ID na batu da sunan abokin ciniki a cikin rabin kiran.

Bayan sa'a guda na sake fasalin, mun sami damar raba lambar kayan aiki da wasu daga cikin nuances na aiki tare da asusu zuwa hanyoyin / azuzuwan daban. Hanyar Allah ta sauƙaƙa, amma akwai layukan layukan 100 waɗanda kawai ba a so a warware su.

Sai kawai bayan 'yan kwanaki ya bayyana a fili cewa ainihin wannan hanyar "mai nauyi" shine algorithm na kasuwanci. Kuma cewa ainihin bayanin ƙayyadaddun fasaha ya kasance mai rikitarwa sosai. Kuma yunƙurin karya wannan hanya ce za ta keta tsarin SRP, ba akasin haka ba.

Tsarin al'ada.

Lokaci ya yi da za mu bar mu maye. Ka bushe hawayenka - tabbas za mu koma gare shi wata rana. Yanzu bari mu tsara ilimin daga wannan labarin.

Tsarin tsari 1. Ma'anar SRP

  1. Rarrabe abubuwan don kowane ɗayan su yana da alhakin abu ɗaya.
  2. Nauyin yana nufin "dalilin canzawa." Wato kowane kashi yana da dalili guda ɗaya na canji, ta fuskar dabaru na kasuwanci.
  3. Canje-canje masu yuwuwar zuwa dabaru na kasuwanci. dole ne a kasance cikin gida. Abubuwan da ke canzawa tare da juna dole ne su kasance kusa.

Formalism 2. Ma'auni na gwajin kai na wajibi.

Ban ga isassun ma'auni don cika SRP ba. Amma akwai sharuddan da suka wajaba:

1) Tambayi kanka menene wannan aji/hanyar/module/sabis yake yi. dole ne ku amsa shi da ma'ana mai sauƙi. ( Na gode Brightori )

bayani

Koyaya, wani lokacin yana da matukar wahala a sami ma'ana mai sauƙi

2) Gyara kwaro ko ƙara sabon fasali yana rinjayar ƙaramin adadin fayiloli / azuzuwan. Da kyau - daya.

bayani

Tunda alhakin (don siffa ko kwaro) yana tattare a cikin fayil/aji ɗaya, kun san ainihin inda za ku duba da abin da za ku gyara. Misali: fasalin canza abubuwan da ake fitarwa na ayyukan shiga zai buƙaci canza logger kawai. Babu buƙatar gudu ta cikin sauran code.

Wani misali yana ƙara sabon iko na UI, kama da waɗanda suka gabata. Idan wannan ya tilasta maka ƙara abubuwa daban-daban guda 10 da masu canzawa 15 daban-daban, da alama kuna wuce gona da iri.

3) Idan masu haɓakawa da yawa suna aiki akan fasalulluka daban-daban na aikin ku, to, yuwuwar haɗuwa da rikice-rikice, wato, yuwuwar cewa fayil / aji iri ɗaya masu haɓakawa da yawa za su canza a lokaci guda, yana da kaɗan.

bayani

Idan, a lokacin da ƙara wani sabon aiki "Zuba vodka a karkashin tebur", kana bukatar ka shafi logger, da aiki na sha da kuma zuba, sa'an nan ya yi kama da alhakin da aka raba karkace. Tabbas, wannan ba koyaushe yana yiwuwa ba, amma yakamata mu yi ƙoƙarin rage wannan adadi.

4) Lokacin da aka yi tambaya mai fayyace game da dabarun kasuwanci (daga mai haɓakawa ko manajan), kuna shiga cikin aji ɗaya / fayil ɗin kuma karɓar bayanai daga can kawai.

bayani

An rubuta fasali, ƙa'idodi ko algorithms a dunƙule, kowanne a wuri ɗaya, kuma ba a warwatse da tutoci cikin sararin lambar ba.

5) Sunan a bayyane yake.

bayani

Ajinmu ko hanyarmu tana da alhakin abu ɗaya, kuma alhakin yana bayyana a cikin sunansa

AllManagersManagerService - mai yiwuwa ajin Allah ne
Biyan gida - mai yiwuwa ba

Tsarin tsari 3. Occam-Hanyar ci gaba na farko.

A farkon zane, mutumin biri bai sani ba kuma baya jin duk dabarar matsalar da ake warwarewa kuma yana iya yin kuskure. Kuna iya yin kuskure ta hanyoyi daban-daban:

  • Sanya abubuwa su yi girma ta hanyar haɗa nauyi daban-daban
  • Ƙaddamarwa ta hanyar rarraba nauyi ɗaya zuwa nau'i daban-daban
  • Ba daidai ba ayyana iyakokin alhakin

Yana da mahimmanci a tuna da ƙa'idar: "yana da kyau a yi babban kuskure," ko "idan ba ku da tabbas, kada ku raba shi." Idan, alal misali, ajin ku ya ƙunshi nauyi biyu, to har yanzu ana iya fahimta kuma ana iya raba shi zuwa biyu tare da ƙaramin canje-canje ga lambar abokin ciniki. Haɗa gilashin gilashin gilashin gilashi yawanci ya fi wahala saboda mahallin da ake yadawa a cikin fayiloli da yawa da kuma rashin abin dogaro a cikin lambar abokin ciniki.

Lokaci yayi da za a kira shi rana

Iyalin SRP baya iyakance ga OOP da SOLID. Ya shafi hanyoyi, ayyuka, azuzuwan, kayayyaki, ƙananan sabis da sabis. Ya shafi duka "figax-figax-and-prod" da "kimiyyar roka" ci gaban, yana sa duniya ta ɗan fi dacewa a ko'ina. Idan kun yi tunani game da shi, wannan kusan shine ainihin ƙa'idar duk aikin injiniya. Injiniyan injiniya, tsarin sarrafawa, kuma hakika duk tsarin hadaddun an gina su ne daga abubuwan da aka gyara, kuma “rashin rarrabuwar kawuna” yana hana masu zanen sassauya, “overfragmentation” yana hana masu zanen inganci, kuma iyakokin da ba daidai ba suna hana su hankali da kwanciyar hankali.

Ƙa'idar Nauyi ɗaya. Ba mai sauƙi kamar yadda ake gani ba

Ba a ƙirƙira SRP ta yanayi ba kuma baya cikin ainihin kimiyya. Ya fita daga gazawar ilimin halitta da tunani, hanya ce kawai don sarrafawa da haɓaka hadaddun tsarin ta amfani da kwakwalwar biri. Ya gaya mana yadda ake lalata tsarin. Ƙirƙirar asali na buƙatar adadin telepathy mai kyau, amma ina fata wannan labarin ya share wasu daga cikin smokescreen.

source: www.habr.com

Add a comment