Mfundo ya Udindo Umodzi. Osati mophweka monga zikuwonekera

Mfundo ya Udindo Umodzi. Osati mophweka monga zikuwonekera Single responsibility mfundo, yomwe imadziwikanso kuti mfundo ya udindo umodzi,
aka mfundo ya kusinthasintha kwa yunifolomu - munthu woterera kwambiri kuti amvetsetse komanso funso lamanjenje pamafunso apulogalamu.

Kudziwana kwanga koyamba ndi mfundoyi kunachitika kumayambiriro kwa chaka choyamba, pamene achinyamata ndi obiriwira anatengedwa kupita kunkhalango kukapanga ophunzira kuchokera ku mphutsi - ophunzira enieni.

M'nkhalango, tinagawidwa m'magulu a anthu 8-9 aliyense ndipo tinali ndi mpikisano - ndi gulu liti lomwe likanamwa botolo la vodka mofulumira kwambiri, pokhapokha ngati munthu woyamba wa gululo atsanulira vodka mu galasi, wachiwiri amamwa. ndipo wachitatu ali ndi chotupitsa. Chigawo chomwe chamaliza ntchito yake chimapita kumapeto kwa mzere wa gululo.

Mlandu womwe kukula kwa mzere kunali kuchulukitsa kwa atatu kunali kukhazikitsidwa kwabwino kwa SRP.

Tanthauzo 1. Udindo umodzi.

Kutanthauzira kovomerezeka kwa Single Responsibility Principle (SRP) kumanena kuti bungwe lirilonse liri ndi udindo wake ndi chifukwa chokhalirapo, ndipo lili ndi udindo umodzi wokha.

Ganizirani chinthu "Drinker" (Tippler).
Kuti tigwiritse ntchito mfundo ya SRP, tigawa maudindowo m'magulu atatu:

  • Mmodzi amathira (PourOperation)
  • Chakumwa chimodzi (DrinkUpOperation)
  • Wina ali ndi chakudya (TakeBiteOperation)

Aliyense wa omwe akutenga nawo mbali pakuchitapo kanthu ali ndi udindo wa gawo limodzi la ndondomekoyi, ndiye kuti ali ndi udindo umodzi wa atomiki - kumwa, kutsanulira kapena kudya.

Bowo lakumwera, nalonso, ndi mawonekedwe a maopaleshoni awa:

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

Mfundo ya Udindo Umodzi. Osati mophweka monga zikuwonekera

Chifukwa chiyani?

Wopanga mapulogalamu amunthu amalembera nyani-munthu, ndipo anyani-munthu amakhala wosatchera khutu, wopusa komanso wofulumira nthawi zonse. Amatha kugwira ndikumvetsetsa za 3 - 7 mawu nthawi imodzi.
Pankhani ya chidakwa, pali atatu mwa mawu awa. Komabe, ngati tilemba code ndi pepala limodzi, ndiye kuti idzakhala ndi manja, magalasi, ndewu ndi mikangano yosatha ponena za ndale. Ndipo zonsezi zidzakhala mu thupi la njira imodzi. Ndikukhulupirira kuti mwawonapo code yotere muzochita zanu. Osati mayeso aumunthu kwambiri a psyche.

Kumbali ina, anyani anapangidwa kuti azitengera zinthu zenizeni m’mutu mwake. M’maganizo mwake, akhoza kuzikankhira pamodzi, kusonkhanitsa zinthu zatsopano kuchokera pa izo, ndi kuzing’amba mofananamo. Tangoganizani galimoto yachitsanzo yakale. M'malingaliro anu, mutha kutsegula chitseko, kutsegula chitseko ndikuwona njira zokweza zenera, mkati mwake mudzakhala magiya. Koma simungathe kuwona zigawo zonse zamakina nthawi imodzi, mu "mndandanda" umodzi. Osachepera "munthu wa nyani" sangathe.

Chifukwa chake, opanga mapulogalamu aumunthu amawola zida zovuta kukhala gulu lazinthu zocheperako komanso zogwira ntchito. Komabe, imatha kuwonongeka m'njira zosiyanasiyana: m'magalimoto ambiri akale, njira yolowera mpweya imalowera pakhomo, ndipo m'magalimoto amakono, kulephera kwamagetsi a loko kumalepheretsa injiniyo kuti isayambike, zomwe zingakhale zovuta pakukonzanso.

Tsopano, SRP ndi mfundo yomwe imalongosola MMENE mungawononge, ndiko kuti, komwe mungajambule mzere wogawa.

Akunena kuti ndikofunikira kuwola molingana ndi mfundo ya kugawa kwa "udindo," ndiko kuti, molingana ndi ntchito za zinthu zina.

Mfundo ya Udindo Umodzi. Osati mophweka monga zikuwonekera

Tiyeni tibwerere ku kumwa komanso zabwino zomwe nyani amalandira pakuwola:

  • Code yakhala yomveka bwino pamlingo uliwonse
  • Khodiyo imatha kulembedwa ndi opanga mapulogalamu angapo nthawi imodzi (aliyense amalemba chinthu chosiyana)
  • Kuyesa kwaotomatiki kumakhala kosavuta - chinthucho chimakhala chosavuta, ndikosavuta kuyesa
  • Kuphatikizika kwa code kumawonekera - mutha kusintha DrinkUpOperation ku opaleshoni yomwe chidakwa chimathira madzi pansi pa tebulo. Kapena sinthani opareshoni yothira ndi opaleshoni yomwe mumasakaniza vinyo ndi madzi kapena vodka ndi mowa. Kutengera ndi zomwe bizinesi ikufuna, mutha kuchita chilichonse popanda kukhudza nambala yanjira Tippler.Act.
  • Kuchokera pazochita izi mutha pindani osusuka (pogwiritsa ntchito TakeBitOperation), Mowa (kugwiritsa ntchito kokha DrinkUpOperation molunjika kuchokera mu botolo) ndikukwaniritsa zofunikira zina zambiri zamabizinesi.

(O, zikuwoneka kuti iyi ndi mfundo ya OCP, ndipo ndinaphwanya udindo wa positiyi)

Ndipo, ndithudi, kuipa:

  • Tiyenera kupanga mitundu yambiri.
  • Woledzera amamwa kwa nthawi yoyamba patatha maola angapo kuposa momwe akanakhalira.

Tanthauzo 2. Kusinthasintha kogwirizana.

Ndiloleni, njonda! Kalasi yakumwa ilinso ndi udindo umodzi - imamwa! Ndipo kawirikawiri, mawu oti "udindo" ndi lingaliro losavuta kwambiri. Wina ali ndi udindo pa tsogolo la anthu, ndipo wina ali ndi udindo wokweza ma penguin omwe anagubuduzika pamtengo.

Tiyeni tikambirane ziwiri kukhazikitsa wa kumwa. Yoyamba, yomwe tatchula pamwambapa, ili ndi makalasi atatu - kutsanulira, zakumwa ndi zokhwasula-khwasula.

Yachiwiri idalembedwa kudzera mu njira ya "Forward and Only Forward" ndipo ili ndi malingaliro onse munjirayo Chitani:

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

Magulu awiriwa, kuchokera kwa wowonera kunja, amawoneka chimodzimodzi ndikugawana udindo womwewo wa "kumwa".

Chisokonezo!

Kenako timapita pa intaneti ndikupeza tanthauzo lina la SRP - Mfundo Yosinthira Kumodzi.

SCP ikunena kuti "Module ili ndi chifukwa chimodzi chokha chosinthira". Ndiko kuti, "Udindo ndi chifukwa cha kusintha."

(Zikuwoneka kuti anyamata omwe adabwera ndi tanthauzo lapachiyambi anali ndi chidaliro mu kuthekera kwa telepathic kwa anyani)

Tsopano zonse zikugwera m'malo mwake. Payokha, titha kusintha njira zothira, kumwa ndi zokhwasula-khwasula, koma mwa wakumwayo wekha tingathe kusintha ndondomeko ndi zikuchokera ntchito, mwachitsanzo, kusuntha akamwe zoziziritsa kukhosi pamaso kumwa kapena kuwonjezera kuwerenga toast.

Mu "Forward and Only Forward" njira, chirichonse chomwe chingasinthidwe chimasinthidwa mwa njira yokhayo Chitani. Izi zitha kuwerengedwa komanso zogwira mtima pakakhala zomveka pang'ono ndipo sizisintha kawirikawiri, koma nthawi zambiri zimatha kukhala njira zoyipa za mizere ya 500 iliyonse, yokhala ndi ziganizo zambiri kuposa zomwe zikanafunikira kuti Russia alowe nawo ku NATO.

Tanthauzo 3. Kuyika kwa zosintha.

Omwe amamwa nthawi zambiri samamvetsetsa chifukwa chake adadzuka m'nyumba ya munthu wina, kapena komwe foni yawo yam'manja ili. Yakwana nthawi yoti muwonjezere kudula mitengo mwatsatanetsatane.

Tiyeni tiyambe kudula mitengo ndi kutsanulira:

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

Pochikuta mkati PourOperation, tinachita mwanzeru poyang'ana udindo ndi encapsulation, koma tsopano tasokonezedwa ndi mfundo ya kusinthasintha. Kuphatikiza pa ntchito yokhayo, yomwe ingasinthe, kudula mitengoyo kumakhalanso kosinthika. Muyenera kupatukana ndikupanga chodula chapadera kuti mugwiritse ntchito:

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

Wowerenga mosamala adzazindikira zimenezo LogAfter, LogBefore и OneError Itha kusinthidwanso payekhapayekha, ndipo, pofananiza ndi masitepe am'mbuyomu, ipanga makalasi atatu: PourLoggerBefore, PourLoggerAfter и PourErrorLogger.

Ndipo pokumbukira kuti pali maopaleshoni atatu a wakumwa, timapeza makalasi asanu ndi anayi odula mitengo. Zotsatira zake, bwalo lonse lakumwa lili ndi makalasi 14 (!!!).

Hyperbola? Ayi! Munthu wa nyani yemwe ali ndi grenade yowola amagawaniza "othira" kukhala decanter, galasi, kuthira oyendetsa, ntchito yoperekera madzi, chitsanzo cha kugunda kwa mamolekyu, ndipo kwa kotala lotsatira adzayesa kuthetsa kudalira popanda zosintha padziko lonse lapansi. Ndipo ndikhulupirireni, iye sadzasiya.

Apa ndipamene ambiri amafika ponena kuti SRP ndi nthano zochokera ku maufumu a pinki, ndipo amapita kukasewera Zakudyazi ...

popanda kuphunzira za kukhalapo kwa tanthauzo lachitatu la Srp:

“Mfundo Yaudindo Imodzi imanena kuti zinthu zofanana ndi kusintha ziyenera kusungidwa pamalo amodzi". kapena "Zomwe zasintha palimodzi ziyenera kusungidwa pamalo amodzi"

Ndiye kuti, ngati tisintha mitengo ya opareshoni, ndiye kuti tiyenera kuyisintha pamalo amodzi.

Iyi ndi mfundo yofunika kwambiri - popeza mafotokozedwe onse a SRP omwe anali pamwambawa adanena kuti kunali koyenera kuphwanya mitundu pamene akuphwanyidwa, ndiko kuti, adaika "malire apamwamba" pa kukula kwa chinthucho, ndipo tsopano. tikukamba kale za "malire otsika" . Mwanjira ina, SRP sikuti imangofunika "kuphwanya ndikuphwanya", komanso kuti musapitirire - "osaphwanya zinthu zolumikizana". Iyi ndiye nkhondo yayikulu pakati pa lumo la Occam ndi anyani!

Mfundo ya Udindo Umodzi. Osati mophweka monga zikuwonekera

Tsopano wakumwayo ayenera kumva bwino. Kuphatikiza pa mfundo yakuti palibe chifukwa chogawaniza IPourLogger logger m'magulu atatu, tikhoza kuphatikiza odula onse kukhala mtundu umodzi:

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

Ndipo ngati tiwonjezera mtundu wachinayi wa ntchito, ndiye kuti kudula mitengoyo kwakonzeka kale. Ndipo ndondomeko ya machitidwewo ndi oyera komanso opanda phokoso lachitukuko.

Zotsatira zake, tili ndi makalasi 5 othana ndi vuto lakumwa:

  • Kuthira ntchito
  • Kumwa ntchito
  • Jamming ntchito
  • Logger
  • Chomwa chakumwa chamkati

Aliyense wa iwo ali ndi udindo wokhazikika pa ntchito imodzi ndipo ali ndi chifukwa chimodzi chosinthira. Malamulo onse ofanana ndi kusintha ali pafupi.

Chitsanzo chenicheni cha moyo

Tinalembapo ntchito yolembetsa basi kasitomala wa b2b. Ndipo njira ya MULUNGU idawonekera pamizere 200 yofananira:

  • Pitani ku 1C ndikupanga akaunti
  • Ndi akauntiyi, pitani kugawo lolipira ndikulipanga pamenepo
  • Onetsetsani kuti akaunti yokhala ndi akaunti yotereyi sinapangidwe pa seva yayikulu
  • Pangani akaunti yatsopano
  • Onjezani zotsatira zolembetsa mugawo lolipira ndi nambala ya 1c ku ntchito yolembetsa
  • Onjezani zambiri za akaunti patebuloli
  • Pangani nambala yamapointsi ya kasitomalayu muntchito yamapointi. Tumizani nambala yanu ya akaunti ya 1c ku ntchitoyi.

Ndipo panali mabizinesi enanso 10 pamndandandawu wokhala ndi kulumikizana koyipa. Pafupifupi aliyense amafunikira chinthu chaakaunti. ID ya point ndi dzina la kasitomala zimafunikira mu theka la mafoni.

Pambuyo pa ola la refactoring, tinatha kulekanitsa ndondomeko ya zomangamanga ndi zina mwazinthu zogwirira ntchito ndi akaunti mu njira / makalasi osiyana. Njira ya Mulungu idapangitsa kuti zikhale zosavuta, koma panali mizere 100 yamakhodi yomwe sinkafuna kumasulidwa.

Patangotha ​​​​masiku angapo zidadziwika kuti chiyambi cha njira "yopepuka" ndi ndondomeko yamalonda. Ndipo kuti kufotokozera koyambirira kwaukadaulo kunali kovuta kwambiri. Ndipo ndikuyesa kuphwanya njira iyi kukhala zidutswa zomwe zidzaphwanya SRP, osati mosemphanitsa.

Mwachizolowezi.

Yakwana nthawi yoti tisiye kuledzera tokha. Yatsani misozi yanu - tidzabwereranso tsiku lina. Tsopano tiyeni tikonze chidziwitso kuchokera m'nkhaniyi.

Mwachizolowezi 1. Tanthauzo la SRP

  1. Alekanitse zinthu kuti aliyense wa iwo akhale ndi udindo pa chinthu chimodzi.
  2. Udindo umayimira "chifukwa chosinthira." Ndiye kuti, chinthu chilichonse chimakhala ndi chifukwa chimodzi chokha chosinthira, malinga ndi malingaliro abizinesi.
  3. Zosintha zomwe zingatheke kumalingaliro abizinesi. ziyenera kukhala zakumaloko. Zinthu zomwe zimasintha mogwirizana ziyenera kukhala pafupi.

Mwachizolowezi 2. Zofunikira zodziyesa nokha.

Sindinawone njira zokwanira zokwaniritsira SRP. Koma pali zofunikira:

1) Dzifunseni zomwe kalasi iyi / njira / gawo / ntchito imachita. muyenera kuyankha ndi tanthauzo losavuta. ( Zikomo Brightori )

mafotokozedwe

Komabe, nthawi zina zimakhala zovuta kupeza tanthauzo losavuta

2) Kukonza cholakwika kapena kuwonjezera chinthu chatsopano kumakhudza kuchuluka kwa mafayilo/makalasi. Moyenera - mmodzi.

mafotokozedwe

Popeza udindo (wachinthu kapena cholakwika) uli mu fayilo/kalasi imodzi, mumadziwa komwe mungayang'ane ndi zomwe mungasinthe. Mwachitsanzo: mawonekedwe akusintha zotuluka za ntchito yodula mitengo amafunikira kusintha odula okha. Palibe chifukwa chodutsa ma code ena onse.

Chitsanzo china ndikuwonjezera chiwongolero chatsopano cha UI, chofanana ndi cham'mbuyomu. Izi zikakukakamizani kuti muwonjezere mabungwe 10 osiyanasiyana ndi ma converter 15 osiyanasiyana, zikuwoneka ngati mukupitilira.

3) Ngati opanga angapo akugwira ntchito zosiyanasiyana za polojekiti yanu, ndiye kuti mwayi wophatikizana, ndiye kuti, mwayi woti fayilo / kalasi yomweyi idzasinthidwe ndi omanga angapo nthawi imodzi, ndizochepa.

mafotokozedwe

Ngati, powonjezera opareshoni yatsopano "Thirani vodka pansi pa tebulo", muyenera kukhudza odula mitengo, ntchito yakumwa ndi kuthira, ndiye kuti ntchitoyo imagawidwa molakwika. Inde, izi sizingatheke nthawi zonse, koma tiyenera kuyesetsa kuchepetsa chiwerengerochi.

4) Mukafunsidwa funso lomveka bwino lokhudza malingaliro abizinesi (kuchokera kwa wopanga kapena manejala), mumapita m'kalasi imodzi/fayilo ndikulandila zambiri kuchokera pamenepo.

mafotokozedwe

Mawonekedwe, malamulo kapena ma aligorivimu amalembedwa molumikizana, chilichonse pamalo amodzi, ndipo osabalalika ndi mbendera pamalo a code.

5) Kutchula dzina kumamveka bwino.

mafotokozedwe

Kalasi yathu kapena njira yathu ili ndi udindo pa chinthu chimodzi, ndipo udindowo ukuwonetsedwa m'dzina lake

AllManagersManagerService - mwina gulu la Mulungu
LocalPayment - mwina ayi

Formalism 3. Njira yachitukuko ya Occam-yoyamba.

Kumayambiriro kwa mapangidwe, nyani munthu sadziwa ndipo samamva zobisika zonse za vuto kuthetsedwa ndipo akhoza kulakwitsa. Mutha kulakwitsa m'njira zosiyanasiyana:

  • Pangani zinthu kukhala zazikulu kwambiri pophatikiza maudindo osiyanasiyana
  • Kukonzanso pogawa udindo umodzi mumitundu yosiyanasiyana
  • Fotokozani molakwika malire a udindo

Ndikofunika kukumbukira lamuloli: "ndi bwino kulakwitsa kwambiri," kapena "ngati simukudziwa, musachigawane." Ngati, mwachitsanzo, kalasi yanu ili ndi maudindo awiri, ndiye kuti ikumvekabe ndipo ikhoza kugawidwa pawiri ndi kusintha kochepa kwa code kasitomala. Kusonkhanitsa galasi kuchokera ku magalasi a galasi nthawi zambiri kumakhala kovuta kwambiri chifukwa cha nkhaniyo ikufalikira pamafayilo angapo komanso kusowa kwa kudalira kofunikira mu code kasitomala.

Yakwana nthawi yoti mutchule tsiku

Kukula kwa SRP sikungokhala ku OOP ndi SOLID. Zimakhudza njira, ntchito, makalasi, ma modules, microservices ndi ntchito. Zimagwiranso ntchito ku chitukuko cha "figax-figax-and-prod" ndi "rocket-science", zomwe zimapangitsa dziko kukhala labwinoko kulikonse. Ngati mukuganiza za izi, iyi ndi mfundo yofunika kwambiri ya uinjiniya wonse. Makina opangira makina, machitidwe owongolera, ndipo machitidwe onse ovuta amamangidwa kuchokera ku zigawo zina, ndipo "kugawa pang'ono" kumalepheretsa opanga kusinthasintha, "kuphwanya kwakukulu" kumalepheretsa opanga kupanga bwino, ndipo malire olakwika amawalepheretsa kulingalira ndi mtendere wamaganizo.

Mfundo ya Udindo Umodzi. Osati mophweka monga zikuwonekera

SRP sinapangidwe mwachilengedwe ndipo si gawo la sayansi yeniyeni. Imachoka muzofooka zathu zamoyo komanso zamaganizidwe.Ndi njira yokhayo yowongolera ndi kupanga machitidwe ovuta kugwiritsa ntchito ubongo wa anyani. Amatiuza momwe tingawolere dongosolo. Kupanga koyambirira kumafuna kuchuluka kwa telepathy, koma ndikhulupilira kuti nkhaniyi ithetsa zina mwazosuta.

Source: www.habr.com

Kuwonjezera ndemanga