Single mutoro musimboti, unozivikanwawo semusimboti webasa rimwechete,
aka musimboti wekusiyana kweyunifomu - murume anotsvedza zvakanyanya kuti anzwisise uye mubvunzo wekutya wakadaro pabvunzurudzo yevagadziri.
Kuziva kwangu kwekutanga kwakakomba nemusimboti uyu kwakaitika pakutanga kwegore rangu rokutanga, apo vaduku uye vakasvibira vakaendeswa kusango kuti vaite vadzidzi chaivo kubva mumakonye.
Musango, takakamurwa kuita mapoka evanhu 8-9 mumwe nemumwe uye takaita makwikwi - nderipi boka raizonwa bhodhoro revodka nekukurumidza, chero munhu wekutanga kubva muboka anodurura vodka mugirazi, wechipiri achinwa. uye wechitatu ane chokudya. Chikwata chapedza kushanda kwacho chinoenda kumagumo emutsara weboka.
Iyo nyaya apo saizi yemutsetse yaive yakawanda yevatatu yaive yekuitwa kwakanaka kweSRP.
Tsanangudzo 1. Basa rimwechete.
Tsanangudzo yepamutemo yeSingle Responsibility Principle (SRP) inotaura kuti sangano rega rega rine basa raro uye chikonzero chekuvapo, uye rine basa rimwe chete.
Funga nezvechinhu "Chinwiwa" (Tippler).
Kuti tiite iyo SRP musimboti, isu tinogovanisa mabasa kuita matatu:
- Mumwe anodira (PourOperation)
- Chinwiwa chimwe (DrinkUpOperation)
- Mumwe ane snack (TakeBiteOperation)
Mumwe nemumwe wevatori vechikamu muchiitiko ichi ane mutoro kune chimwe chikamu chemaitiro, ndiko kuti, ane basa rimwe reatomu - kunwa, kudurura kana snack.
Gomba rekunwira, zvakare, ifacade yezviito izvi:
сlass Tippler {
//...
void Act(){
_pourOperation.Do() // налить
_drinkUpOperation.Do() // выпить
_takeBiteOperation.Do() // закусить
}
}
Sei?
Mugadziri wevanhu anonyora kodhi yeape-murume, uye ape-murume haana hanya, akapusa uye anogara achimhanya. Anokwanisa kubata uye kunzwisisa nezve 3 - 7 mazwi panguva imwe chete.
Panyaya yechidhakwa, pane matatu emazwi aya. Zvisinei, kana tikanyora kodeti nepepa rimwe chete, ipapo ichava nemaoko, magirazi, hondo uye nharo dzisingagumi pamusoro pezvematongerwo enyika. Uye izvi zvese zvichange zviri mumuviri weimwe nzira. Ndine chokwadi chekuti wakaona kodhi yakadaro mukuita kwako. Kwete iyo yakanyanya hunhu bvunzo ye psyche.
Ukuwo, murume wetsoko akagadzirwa kuti atevedzere zvinhu chaizvo zviri mumusoro make. Mukufungidzira kwake, anogona kuzvisunda pamwe chete, kuunganidza zvinhu zvitsva kubva pazviri, uye kuzviparadzanisa nenzira imwe cheteyo. Fungidzira motokari yemhando yekare. Mune fungidziro yako, unogona kuvhura musuwo, kusunungura gonhi remusuwo uye ona ipapo mahwindo ekusimudza masisitimu, mukati mawo mune magiya. Asi haugone kuona zvese zvikamu zvemuchina panguva imwe chete, mune imwe "rondedzero". Kanenge "monkey man" haigoni.
Naizvozvo, vagadziri vezvirongwa zvevanhu vanoodza nzira dzakaoma kuita seti yezvishoma uye zvinoshanda zvinhu. Zvisinei, inogona kusvibiswa nenzira dzakasiyana-siyana: mumotokari dzakawanda dzekare, mhepo yemhepo inopinda mumusuwo, uye mumotokari dzemazuva ano, kukundikana mumagetsi ekuvhara kunodzivirira injini kubva pakutanga, iyo inogona kuva dambudziko panguva yekugadzirisa.
Zvino, SRP musimboti unotsanangura MAITIRO ekuora, ndiko kuti, kupi kudhirowa mutsara wekupatsanura.
Anotaura kuti zvakafanira kuora maererano nemusimboti wekuparadzanisa "mutoro," kureva, maererano nemabasa ezvimwe zvinhu.
Ngatidzokerei kunwa uye zvakanakira izvo murume wetsoko anogamuchira panguva yekuora:
- Kodhi yave kujeka zvakanyanya pamatanho ese
- Iyo kodhi inogona kunyorwa nevanoverengeka programmers kamwechete (mumwe nemumwe anonyora chinhu chakasiyana)
- Kuedza otomatiki kunorerutswa - iyo iri nyore chinhu, zviri nyore kuyedza
- Iko kuumbwa kwekodhi kunooneka - iwe unogona kutsiva DrinkUpOperation kuoparesheni apo chidhakwa chinodira mvura pasi petafura. Kana kutsiva iyo yekudurura nekuvhiya kwaunosanganisa waini nemvura kana vodka nedoro. Zvichienderana nezvinodiwa nebhizinesi, iwe unogona kuita zvese pasina kubata iyo nzira kodhi Tippler.Act.
- Kubva pamabasa aya unogona kupeta makaro (uchishandisa chete TakeBitOperation), Doro (kushandisa chete DrinkUpOperation zvakananga kubva mubhodhoro) uye kusangana nezvimwe zvakawanda zvebhizinesi zvinodiwa.
(Ah, zvinoita sekunge iyi yatove musimboti weOCP, uye ndakatyora basa reiyi positi)
Uye, chokwadi, iyo cons:
- Tichafanira kugadzira mamwe marudzi.
- Chidhakwa chinonwa kekutanga maawa mashoma gare gare kupfuura zvaangadai anwa neimwe nzira.
Tsanangudzo 2. Kusiyana kwakabatana.
Nditenderei, varume! Kirasi yekunwa zvakare ine basa rimwechete - rinonwa! Uye kazhinji, izwi rekuti "mutoro" ipfungwa isina kujeka. Mumwe munhu ane mhosva yekuguma kwevanhu, uye mumwe munhu ane mutoro wekusimudza mapenguin akapidigurwa padanda.
Ngatitarisei maviri ekushandiswa kweanonwa. Yekutanga, yataurwa pamusoro apa, ine makirasi matatu - kudira, kunwa uye snack.
Yechipiri inonyorwa kuburikidza ne "Pamberi uye Chete Pamberi" nzira uye ine zvese zvine musoro munzira Act:
//Не тратьте время на изучение этого класса. Лучше съешьте печеньку
с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);
}
}
}Makirasi maviri aya, kubva pakuona kwemucherechedzi wekunze, anotarisa zvakafanana uye anogovera basa rimwechete re "kunwa".
Kuvhiringidzika!
Tobva taenda online totsvaga imwe tsananguro yeSRP - iyo Imwe Shanduko Yekushanduka Musimboti.
SCP inoti "Module ine chikonzero chimwe chete chekuchinja". Ndiko kuti, "Mutoro ndicho chikonzero chekuchinja."
(Zvinoita sekuti vakomana vakauya netsanangudzo yepakutanga vaive nechivimbo mukugona kwe telepathic yeape man)
Zvino zvinhu zvose zvinowira panzvimbo. Takaparadzana, tinogona kushandura kudira, kunwa uye snacking maitiro, asi mumunwi wacho pachawo tinogona kungoshandura kutevedzana uye kuumbwa kwekushanda, somuenzaniso, nekufambisa snack isati yanwa kana kuwedzera kuverenga kwechigunwe.
Munzira ye "Forward and Only Forward", zvinhu zvose zvinogona kuchinjwa zvinoshandurwa chete nenzira Act. Izvi zvinogona kuverengeka uye zvinobudirira kana paine pfungwa shoma uye isingawanzo chinja, asi kazhinji inoguma munzira dzinotyisa dze500 mitsetse imwe neimwe, ine zvakawanda kana-zvirevo kupfuura zvinodiwa kuti Russia ijoinhe NATO.
Tsanangudzo 3. Nzvimbo yekuchinja.
Vanonwa doro kazhinji havanzwisise kuti sei vakamuka mufurati yemumwe munhu, kana kuti nharembozha yavo iripi. Yasvika nguva yekuwedzera matanda akadzama.
Ngatitangei kutema matanda nemaitiro ekudira:
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}");
}
}Nekuiputira mukati PourOperation, takaita nekuchenjera kubva pakuona kwemutoro uye encapsulation, asi ikozvino tinovhiringidzika nenheyo yekusiyana. Pamusoro pekushanda pachayo, iyo inogona kuchinja, kutema matanda pachayo kunoshandukawo. Iwe uchafanirwa kuparadzanisa uye kugadzira yakakosha logger yekudurura oparesheni:
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)
}
}
}Muverengi akangwarira achazviona LogAfter, LogBefore и OneError inogona zvakare kushandurwa yega, uye, nekuenzanisa nematanho apfuura, ichagadzira makirasi matatu: PourLoggerBefore, PourLoggerAfter и PourErrorLogger.
Uye tichirangarira kuti kune matatu maoparesheni emunhu anonwa, tinowana makirasi mapfumbamwe ekutema matanda. Somugumisiro, denderedzwa rose rekunwa rinosanganisira 14 (!!!) makirasi.
Hyperbola? Kashoma! Murume wetsoko ane grenade yekuora anotsemura "duru" kuita decanter, girazi, vanodururira vashandisi, sevhisi yekupa mvura, chimiro chemuviri chekudhumhana kwemamorekuru, uye kwechikamu chinotevera achaedza kumisa kutsamira pasina. global variables. Uye nditende, haazoregi.
Panguva ino ndipo apo vazhinji vanosvika pakugumisa kuti SRP ingano dzepink humambo, voenda kunotamba noodles...
... ndisina kumbodzidza nezve kuvapo kwetsanangudzo yechitatu yeSrp:
“The Single Responsibility Principle inotaura izvozvo zvinhu zvakafanana nekuchinja zvinofanirwa kuchengetwa munzvimbo imwechete". kana"Ndedzipi shanduko pamwe chete dzinofanira kuchengetwa munzvimbo imwechete"
Ndiko kuti, kana tikashandura kutema kwechigadziro, saka tinofanira kuchishandura munzvimbo imwechete.
Ichi chinhu chakakosha zvikuru - sezvo tsananguro dzese dzeSRP dzaive pamusoro dzaiti zvaive zvakafanira kupwanya mhando dzichipwanywa, ndiko kuti, vakaisa "muganho wepamusoro" pahukuru hwechinhu, uye zvino. tiri kutotaura nezve "muganho wakaderera" . Nemamwe mashoko, SRP haingodi "kupwanya paunenge uchipwanya", asiwo kuti urege kuipfuura - "usapwanya zvinhu zvinopindirana". Iyi ndiyo hondo huru pakati pebadza raOccam nemurume wetsoko!
Iye zvino munwi anofanira kunzwa zviri nani. Pamusoro pekuti hapana chikonzero chekutsemura IPourLogger logger kuita makirasi matatu, isu tinogona zvakare kusanganisa ese anorodha mumhando imwechete:
class OperationLogger{
public OperationLogger(string operationName){/*..*/}
public void LogBefore(object[] args){/*...*/}
public void LogAfter(object[] args){/*..*/}
public void LogError(object[] args, exception e){/*..*/}
}Uye kana tikawedzera rudzi rwechina rwekushanda, ipapo kutema matanda kwacho kwatogadzirira. Uye iyo kodhi yekushanda pachayo yakachena uye isina ruzha rwezvivakwa.
Nekuda kweizvozvo, isu tine makirasi mashanu ekugadzirisa dambudziko rekunwa:
- Kudurura kushanda
- Kunwa kushanda
- Jamming operation
- Logger
- Chinwiwa facade
Mumwe nemumwe wavo ane basa rakasimba kune rimwe basa uye ane chikonzero chimwe chekuchinja. Mitemo yese yakafanana neshanduko iri pedyo.
Muenzaniso chaiwo wehupenyu
Isu takambonyora sevhisi yekunyoresa otomatiki mutengi web2b. Uye nzira yaMWARI yakaonekwa yemitsara mazana maviri yezvinyorwa zvakafanana:
- Enda ku1C uye gadzira account
- Neiyi account, enda kumodule yekubhadhara uye gadzira ipapo
- Tarisa kuti account ine nhamba iyi yeakaundi haina kugadzirwa muakaundi huru. server
- Gadzira account itsva
- Wedzera mhedzisiro yekunyoresa mumodhi yekubhadhara uye iyo 1c nhamba kune yekunyoresa mhinduro sevhisi
- Wedzera ruzivo rweakaundi patafura iyi
- Gadzira nhamba yemapoinzi yemutengi uyu musevhisi yepoint. Pfuura nhamba yako yeakaundi ye1c kune iyi sevhisi.
Uye paive neanosvika gumi mamwe mabhizinesi mashandiro pane iyi runyorwa nekubatana kunotyisa. Anenge munhu wese aida account chinhu. Iyo point ID uye zita remutengi zvaidiwa muhafu yekufona.
Mushure meawa refactoring, takakwanisa kuparadzanisa kodhi yezvivakwa uye mamwe ma nuances ekushanda neakaundi mune akasiyana nzira / makirasi. Nzira yaMwari yakaita kuti zvive nyore, asi pakanga pasara mitsara zana yekodhi iyo yaisada kusungirirwa.
Chete mushure memazuva mashoma zvakava pachena kuti hunhu hweiyi "lightweight" nzira ibhizinesi algorithm. Uye kuti tsananguro yepakutanga yehunyanzvi hwekutsanangurwa yaive yakaoma. Uye ndiko kuedza kuputsa nzira iyi kuita zvidimbu izvo zvinoputsa SRP, uye kwete zvinopesana.
Formalism.
Yasvika nguva yekuti tisiye takadhakwa zvedu. Pukuta misodzi yako - isu tichadzoka kwairi rimwe zuva. Zvino ngatigadzirisei ruzivo kubva muchinyorwa ichi.
Formalism 1. Tsanangudzo yeSRP
- Kuparadzanisa zvinhu kuitira kuti chimwe nechimwe chazvo chiite chimwe chinhu.
- Basa rinomirira "chikonzero chekuchinja." Ndokunge, chimwe nechimwe chinhu chine chikonzero chimwe chete chekuchinja, maererano nebhizinesi logic.
- Inogona kuchinja kune bhizinesi logic. inofanira kunge iri munharaunda. Zvinhu zvinoshanduka nesynchronously zvinofanira kunge zviri pedyo.
Formalism 2. Inodiwa yekuzviongorora maitiro.
Ini handisati ndaona maitiro akakwana ekuzadzisa iyo SRP. Asi pane zvinodiwa mamiriro:
1) Zvibvunze kuti kirasi iyi / nzira / modhi / sevhisi inoita sei. unofanira kuipindura netsanangudzo iri nyore. ( Ndatenda )
tsananguro
Zvisinei, dzimwe nguva zvakaoma zvikuru kuwana tsananguro iri nyore
2) Kugadzirisa bhagi kana kuwedzera chinhu chitsva kunokanganisa huwandu hushoma hwemafaira / makirasi. Zvakanaka - imwe.
tsananguro
Sezvo mutoro (wechimwe chinhu kana bug) wakavharirwa mune imwe faira / kirasi, iwe unonyatsoziva kwekutarisa uye nekugadzirisa. Semuyenzaniso: chimiro chekushandura chinobuda mumabasa ekucheka matanda chinoda kushandura chete logger. Hapana chikonzero chekumhanya kuburikidza neyasara yekodhi.
Mumwe muenzaniso kuwedzera hutsva hweUI control, yakafanana neyakapfuura. Kana izvi zvichikumanikidza kuti uwedzere gumi akasiyana masangano uye gumi nemashanu ekushandura akasiyana, zvinoita sekunge uri kuzvipfuudza.
3) Kana vagadziri vakati wandei vari kushanda pane akasiyana maficha epurojekiti yako, saka mukana wekubatanidza kunetsana, ndiko kuti, mukana wekuti imwechete faira / kirasi ichashandurwa nevakawanda vanogadzira panguva imwe chete, ishoma.
tsananguro
Kana, paunenge uchiwedzera kuvhiyiwa kutsva "Dururira vodka pasi petafura", iwe unofanirwa kukanganisa iyo logger, kushanda kwekunwa nekudurura, zvino zvinoita sekunge mitoro yakakamurwa zvisina kunaka. Zvechokwadi, izvi hazviiti nguva dzose, asi tinofanira kuedza kuderedza nhamba iyi.
4) Pawakabvunzwa mubvunzo unojekesa nezve bhizinesi logic (kubva kune anovandudza kana maneja), iwe unoenda zvakasimba mukirasi imwe / faira uye unogamuchira ruzivo chete kubva ipapo.
tsananguro
Zvimiro, mitemo kana maalgorithms akanyorwa zvakabatanidzwa, imwe neimwe munzvimbo imwechete, uye isina kupararira nemireza munzvimbo yese yekodhi.
5) Zita racho rakajeka.
tsananguro
Kirasi yedu kana nzira ine mutoro wechinhu chimwe, uye mutoro unoratidzwa muzita rayo
AllManagersManagerService - kazhinji kirasi yaMwari
LocalPayment - pamwe kwete
Formalism 3. Occam-yekutanga nzira yekuvandudza.
Pakutanga kwekugadzira, monkey murume haazive uye haanzwi zvese zvinyengeri zvedambudziko riri kugadziriswa uye anogona kukanganisa. Iwe unogona kukanganisa nenzira dzakasiyana:
- Ita kuti zvinhu zvikure zvakanyanya nekubatanidza mabasa akasiyana
- Reframing nekupatsanura basa rimwechete mumhando dzakawanda dzakasiyana
- Rondedzera zvisizvo miganhu yebasa
Zvakakosha kuyeuka mutemo: "zviri nani kuita chikanganiso chikuru," kana "kana iwe usina chokwadi, usaparadzanisa." Kana, semuenzaniso, kirasi yako iine mabasa maviri, saka ichiri kunzwisisika uye inogona kupatsanurwa kuita maviri nekuchinja kushoma kune kodhi yemutengi. Kuunganidza girazi kubva kune shards yegirazi kunowanzo kuoma zvakanyanya nekuda kweiyo mamiriro ari kupararira kune akati wandei mafaera uye kushaikwa kwezvinodiwa zvinodiwa mukodhi yemutengi.
Yasvika nguva yekuridaidza kuti zuva
Kukura kweSRP hakugumiri kuOOP neSOLID. Inoshanda kune nzira, mabasa, makirasi, modules, microservices uye masevhisi. Inoshanda kune ese ari maviri "figax-figax-uye-prod" uye "rocket-sainzi" kusimudzira, zvichiita kuti nyika ive nani kwese kwese. Kana iwe ukafunga nezvazvo, iyi ingangoita musimboti wakakosha weinjiniya yese. Mechanical engineering, control system, uye zvechokwadi ese akaomarara masisitimu anovakwa kubva kune zvikamu, uye "underfragmentation" inotadzisa vanogadzira kuchinjika, "kuwedzeredza" kunotadzisa vanogadzira kushanda, uye miganhu isiriyo inovashayisa kufunga uye rugare rwepfungwa.
SRP haina kugadzirwa nemasikirwo uye haisi chikamu chesainzi chaiyo. Inobuda pazvimiro zvedu zvebhaibheri uye zvepfungwa.Ingori nzira yekudzora nekugadzira masisitimu akaomarara uchishandisa uropi hwemunhu wetsoko. Anotiudza nzira yekuora hurongwa. Iko kuumbwa kwepakutanga kwaida huwandu hwakaringana hweterepathy, asi ndinovimba chinyorwa ichi chinobvisa imwe yefodya.
Source: www.habr.com
