Prinsip Tanggung Jawab Tunggal. Teu sakumaha basajan sakumaha sigana

Prinsip Tanggung Jawab Tunggal. Teu sakumaha basajan sakumaha sigana Prinsip tanggung jawab tunggal, ogé katelah prinsip tanggung jawab tunggal,
alias prinsip variability seragam - hiji bodo pisan leueur ngartos tur sapertos patarosan saraf dina wawancara programmer.

Kenalan serius munggaran kuring sareng prinsip ieu lumangsung dina awal taun kahiji, nalika anu ngora sareng héjo dibawa ka leuweung pikeun ngajantenkeun murid kaluar tina larva - murid nyata.

Di leuweung, urang dibagi kana grup 8-9 urang masing-masing sarta boga kompetisi - grup mana nu bakal inuman botol vodka panggancangna, disadiakeun yén jalma kahiji ti grup tuang vodka kana gelas, nu kadua inuman eta. jeung katilu boga snack a. Unit nu geus réngsé operasi na ngalir ka tungtung antrian grup urang.

Kasus dimana ukuran antrian éta sababaraha tilu éta palaksanaan alus SRP.

Harti 1. Tanggung jawab tunggal.

Definisi resmi Prinsip Tanggung Jawab Tunggal (SRP) nyatakeun yén unggal éntitas ngagaduhan tanggung jawab sareng alesan pikeun ayana, sareng ngan ukur hiji tanggung jawab.

Pertimbangkeun objék "Drinker" (Tippler).
Pikeun ngalaksanakeun prinsip SRP, urang bakal ngabagi tanggung jawab kana tilu:

  • Hiji tuang (PourOperation)
  • Hiji inuman (DrinkUpOperation)
  • Nu saurang boga snack (TakeBiteOperation)

Unggal pamilon dina prosés tanggung jawab hiji komponén prosés, nyaeta, boga hiji tanggung jawab atom - nginum, tuang atawa snack.

Liang nginum, kahareupna mangrupikeun adul pikeun operasi ieu:

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

Prinsip Tanggung Jawab Tunggal. Teu sakumaha basajan sakumaha sigana

Kunaon?

Programer manusa nyerat kode pikeun lalaki-kera, sareng lalaki-kera henteu ati-ati, bodo sareng sok buru-buru. Anjeunna tiasa nahan sareng ngartos ngeunaan 3 - 7 istilah dina hiji waktos.
Dina kasus mabok, aya tilu istilah ieu. Nanging, upami urang nyerat kodeu nganggo hiji lambar, maka éta bakal ngandung panangan, gelas, gelut sareng argumen anu teu terbatas ngeunaan politik. Sareng sadaya ieu bakal aya dina awak hiji metode. Kuring yakin anjeun parantos ningali kode sapertos kitu dina prakték anjeun. Teu tés paling manusiawi pikeun psyche nu.

Di sisi séjén, lalaki kera dirancang pikeun simulate objék dunya nyata dina sirah na. Dina imajinasina, anjeunna tiasa nyorong aranjeunna babarengan, ngumpul objék anyar ti aranjeunna, sareng ngabongkar aranjeunna dina cara anu sami. Ngabayangkeun mobil model heubeul. Dina imajinasi anjeun, anjeun tiasa muka panto, unscrew motong panto jeung ningali aya mékanisme angkat jandela, di jerona bakal aya gears. Tapi anjeun teu bisa ningali sakabeh komponen mesin dina waktos anu sareng, dina hiji "listing". Sahenteuna "lalaki monyét" teu bisa.

Ku alatan éta, programer manusa nguraikeun mékanisme kompléks jadi sakumpulan elemen kirang kompleks jeung gawé. Sanajan kitu, eta bisa decomposed ku sababaraha cara: dina loba mobil heubeul saluran hawa asup kana panto, sarta dina mobil modern gagalna dina éléktronika konci nyegah engine ti ngamimitian, nu bisa jadi masalah salila perbaikan.

ayeuna, SRP mangrupikeun prinsip anu ngajelaskeun CARA nguraikeun, nyaéta, dimana ngagambar garis pamisah.

Anjeunna nyebutkeun yen perlu decompose nurutkeun prinsip division tina "tanggung jawab," nyaeta, nurutkeun tugas objék nu tangtu.

Prinsip Tanggung Jawab Tunggal. Teu sakumaha basajan sakumaha sigana

Hayu urang balik deui ka nginum sareng kauntungan anu ditampi ku lalaki monyét nalika dékomposisi:

  • Kodeu parantos jelas pisan dina unggal tingkatan
  • Kodeu tiasa ditulis ku sababaraha programer sakaligus (masing-masing nyerat unsur anu misah)
  • Tés otomatis disederhanakeun - langkung saderhana unsurna, langkung gampang diuji
  • Komposisi kode muncul - anjeun tiasa ngagentos DrinkUpOperation ka operasi nu mabok tuang cairan handapeun méja. Atawa ngagentos operasi tuang sareng operasi dimana anjeun nyampur anggur sareng cai atanapi vodka sareng bir. Gumantung kana syarat bisnis, anjeun tiasa ngalakukeun sagalana tanpa noél kodeu métode Tippler.Act.
  • Tina operasi ieu anjeun tiasa ngalipet glutton (ngan nganggo TakeBitOperation), Alkohol (ngan nganggo DrinkUpOperation langsung tina botol) sareng nyumponan seueur syarat bisnis anu sanés.

(Oh, sigana ieu mangrupikeun prinsip OCP, sareng kuring ngalanggar tanggung jawab pos ieu)

Sareng, tangtosna, kontra:

  • Urang kedah nyiptakeun langkung seueur jinis.
  • Hiji mabok inuman pikeun kahiji kalina sababaraha jam engké ti anjeunna disebutkeun bakal boga.

Harti 2. Variabilitas ngahiji.

Hayu atuh, gentlemen! Kelas nginum ogé boga tanggung jawab tunggal - éta inuman! Sareng sacara umum, kecap "tanggung jawab" mangrupikeun konsép anu teu jelas. Aya anu tanggung jawab kana nasib umat manusa, sareng aya anu tanggung jawab pikeun ngangkat pinguin anu digulingkeun dina kutub.

Hayu urang nganggap dua palaksanaan drinker nu. Kahiji, disebutkeun di luhur, ngandung tilu kelas - tuang, inuman sarta snack.

Nu kadua ditulis ngaliwatan metodologi "Maju tur Ngan Maju" sarta ngandung sakabéh logika dina métode kalakuan:

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

Duanana kelas ieu, ti sudut pandang hiji panitén luar, kasampak persis sarua jeung babagi tanggung jawab sarua "nginum".

Kabingungan!

Teras we buka online tur manggihan harti sejen tina SRP - Prinsip Changeability Tunggal.

SCP nyatakeun yén "A modul boga hiji na ngan hiji alesan pikeun ngarobah". Maksudna, "Tanggung jawab mangrupikeun alesan pikeun robih."

(Sigana éta lalaki anu datang nepi ka harti aslina éta yakin kana kamampuhan telepathic lalaki kera)

Ayeuna sagalana ragrag kana tempat. Kapisah, urang bisa ngarobah tuang, nginum jeung snacking prosedur, tapi dina drinker sorangan ngan bisa ngarobah runtuyan jeung komposisi operasi, contona, ku mindahkeun snack saméméh nginum atawa nambahkeun bacaan roti bakar.

Dina pendekatan "Maju sareng Ngan Maju", sadayana anu tiasa dirobih ngan ukur dina metodeu kalakuan. Ieu tiasa dibaca sareng efektif nalika aya sakedik logika sareng jarang robih, tapi sering ditungtungan ku metode anu dahsyat tina 500 garis masing-masing, kalayan langkung seueur pernyataan-pernyataan tibatan anu diperyogikeun pikeun Rusia gabung sareng NATO.

Harti 3. Lokalisasi parobahan.

Anu nginum sering henteu ngartos naha aranjeunna hudang di apartemen batur, atanapi dimana telepon sélulérna. Geus waktuna pikeun nambahkeun logging lengkep.

Hayu urang mimitian log kalayan prosés tuang:

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

Ku encapsulating eta di PourOperation, Urang acted bijaksana ti sudut pandang tanggung jawab jeung encapsulation, tapi ayeuna urang bingung jeung prinsip variability. Salian operasi sorangan, nu bisa robah, logging sorangan ogé jadi robah. Anjeun kedah misahkeun sareng ngadamel logger khusus pikeun operasi tuang:

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

Nu maca taliti bakal perhatikeun éta LogAfter, LogSaméméh и OnError ogé bisa dirobah individual, sarta, ku analogi jeung léngkah saméméhna, bakal nyieun tilu kelas: PourLoggerBefore, PourLoggerAfter и PourErrorLogger.

Sarta remembering yén aya tilu operasi pikeun drinker a, urang meunang salapan kelas logging. Hasilna, sakabéh bunderan nginum diwangun ku 14 (!!!) kelas.

Hiperbola? boro-boro! Lalaki monyét kalayan granat dékomposisi bakal ngabagi "tuang" kana decanter, gelas, operator tuang, jasa suplai cai, modél fisik tabrakan molekul, sareng pikeun saparapat salajengna anjeunna bakal nyobian ngabéréskeun katergantungan tanpa. variabel global. Sareng percanten ka abdi, anjeunna moal eureun.

Nya dina titik ieu seueur anu nyimpulkeun yén SRP mangrupikeun dongéng ti karajaan pink, sareng angkat maén mie ...

... tanpa kantos diajar ngeunaan ayana definisi katilu Srp:

"Prinsip Tanggung Jawab Tunggal nyatakeun yén hal anu sarupa jeung robah kudu disimpen dina hiji tempat". atawa"Naon parobahan babarengan kudu diteundeun dina hiji tempat"

Nyaéta, upami urang ngarobih logging operasi, maka urang kedah ngarobih dina hiji tempat.

Ieu mangrupikeun titik anu penting pisan - sabab sadayana katerangan ngeunaan SRP di luhur nyarios yén éta kedah ngaremukkeun jinis nalika ditumbuk, nyaéta, aranjeunna netepkeun "wates luhur" dina ukuran obyék, sareng ayeuna. urang geus ngobrol ngeunaan "wates handap" . Istilah sanésna, SRP henteu ngan ukur meryogikeun "ngaremukan bari ngaremukan", tapi ogé henteu kaleuleuwihan - "ulah naksir hal-hal anu aya hubunganana". Ieu perang hébat antara agul Occam jeung lalaki kera!

Prinsip Tanggung Jawab Tunggal. Teu sakumaha basajan sakumaha sigana

Ayeuna anu nginum kedah langkung saé. Salian kanyataan yén teu kedah ngabagi IPourLogger logger kana tilu kelas, urang ogé tiasa ngagabungkeun sadaya logger kana hiji jinis:

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

Sareng upami urang nambihan jinis operasi kaopat, maka logging pikeun éta parantos siap. Sareng kodeu operasi sorangan bersih sareng bebas tina gangguan infrastruktur.

Hasilna, urang gaduh 5 kelas pikeun ngarengsekeun masalah nginum:

  • Operasi tuang
  • Operasi nginum
  • Operasi jamming
  • Logger
  • Fasad nginum

Masing-masingna tanggung jawab pikeun hiji fungsi sareng gaduh hiji alesan pikeun robih. Kabéh aturan sarupa robah lokasina caket dieu.

conto kahirupan nyata

Urang sakali nulis layanan pikeun otomatis ngadaptar klien b2b. Sareng metode ALLAH muncul pikeun 200 baris eusi anu sami:

  • Pindah ka 1C sareng jieun akun
  • Kalayan akun ieu, angkat ka modul pamayaran sareng jieun di dinya
  • Pariksa yén akun sareng akun sapertos kitu teu acan didamel dina server utama
  • Jieun akun anyar
  • Tambahkeun hasil pendaptaran dina modul pamayaran sareng nomer 1c kana jasa hasil pendaptaran
  • Tambahkeun inpo akun kana tabel ieu
  • Jieun nomer titik pikeun klien ieu dina layanan titik. Lebetkeun nomer rekening 1c anjeun ka jasa ieu.

Sareng aya kira-kira 10 langkung seueur operasi bisnis dina daptar ieu kalayan konektipitas anu dahsyat. Ampir sadayana peryogi obyék akun. ID titik sareng nami klien diperyogikeun dina satengah telepon.

Saatos sajam refactoring, kami tiasa misahkeun kode infrastruktur sareng sababaraha nuansa gawé bareng akun kana metode / kelas anu misah. Métode Allah ngagampangkeun, tapi aya 100 garis kode anu tinggaleun anu henteu hoyong diungkabkeun.

Ngan saatos sababaraha dinten janten jelas yén hakekat metode "ringan" ieu mangrupikeun algoritma bisnis. Sareng yén pedaran asli spésifikasi téknis éta rada rumit. Sarta eta teh usaha pikeun megatkeun metoda ieu kana potongan anu bakal ngalanggar SRP, sarta teu sabalikna.

Formalisme.

Geus waktuna ninggalkeun urang mabok sorangan. Garingkeun cimata anjeun - urang pasti bakal uih deui dina hiji dinten. Ayeuna hayu urang formalize pangaweruh tina artikel ieu.

Formalisme 1. Harti SRP

  1. Pisahkeun unsur-unsurna supados masing-masing nanggungjawaban kana hiji hal.
  2. Tanggung jawab nangtung pikeun "alesan pikeun ngarobah". Hartina, unggal unsur boga ngan hiji alesan pikeun robah, dina watesan logika bisnis.
  3. Poténsi parobahan logika bisnis. kudu dilokalkeun. Unsur nu robah sinkron kudu deukeut.

Formalisme 2. Kriteria tés diri diperlukeun.

Kuring geus teu katempo kriteria cukup pikeun minuhan SRP. Tapi aya syarat diperlukeun:

1) Nanya ka diri naon kelas / métode / modul / jasa ieu. Anjeun kudu ngajawab eta kalawan harti basajan. ( Hatur nuhun Brightori )

katerangan

Sanajan kitu, kadang hésé pisan pikeun manggihan harti basajan

2) Ngalereskeun bug atanapi nambahkeun fitur anyar mangaruhan jumlah minimum file / kelas. Ideally - hiji.

katerangan

Kusabab tanggung jawab (pikeun fitur atanapi bug) encapsulated dina hiji file / kelas, anjeun terang persis dimana kasampak na naon edit. Contona: fitur ngarobah kaluaran operasi logging merlukeun ngan ngarobah logger. Teu perlu ngajalankeun ngaliwatan sesa kode.

Conto sanésna nyaéta nambihan kontrol UI énggal, sami sareng anu sateuacana. Upami ieu maksakeun anjeun nambihan 10 éntitas anu béda sareng 15 konvérsi anu béda, sigana anjeun kaleuleuwihan.

3) Upami sababaraha pamekar ngusahakeun fitur anu béda dina proyék anjeun, maka kamungkinan konflik ngahiji, nyaéta kamungkinan yén file / kelas anu sami bakal dirobih ku sababaraha pamekar dina waktos anu sami, minimal.

katerangan

Upami, nalika nambihan operasi énggal "Tuang vodka handapeun méja", anjeun kedah mangaruhan logger, operasi nginum sareng tuang, maka sigana tanggung jawab dibagi bengkok. Tangtu, ieu teu salawasna mungkin, tapi urang kudu nyobaan pikeun ngurangan angka ieu.

4) Nalika ditaroskeun patarosan anu ngajelaskeun logika bisnis (ti pamekar atanapi manajer), anjeun leres-leres angkat kana hiji kelas / file sareng nampi inpormasi ngan ti dinya.

katerangan

Fitur, aturan atanapi algoritma ditulis kompak, masing-masing dina hiji tempat, sareng henteu paburencay ku bandéra sapanjang rohangan kode.

5) Ngaranna jelas.

katerangan

Kelas atawa métode urang tanggung jawab hiji hal, sarta tanggung jawab ieu reflected dina ngaranna

AllManagersManagerService - paling dipikaresep kelas Allah
LocalPayment - meureun moal

Formalisme 3. Occam-mimiti ngembangkeun metodologi.

Dina awal desain, lalaki monyét teu nyaho jeung teu ngarasa sagala subtleties tina masalah keur direngsekeun tur bisa nyieun kasalahan. Anjeun tiasa ngalakukeun kasalahan ku sababaraha cara:

  • Jieun objék badag teuing ku merging tanggung jawab béda
  • Reframing ku ngabagi tanggung jawab tunggal kana sababaraha jinis
  • Teu bener nangtukeun wates tanggung jawab

Penting pikeun émut aturan: "Éta langkung saé pikeun ngalakukeun kasalahan anu ageung," atanapi "upami anjeun henteu yakin, ulah dipisahkeun." Upami, contona, kelas anjeun ngandung dua tanggung jawab, teras éta masih kaharti sareng tiasa dibagi jadi dua kalayan perobahan minimal kana kode klien. Nyusun sagelas tina beling gelas biasana langkung hese kusabab kontéks anu sumebar ka sababaraha file sareng kurangna katergantungan anu diperyogikeun dina kode klien.

Geus waktuna pikeun nelepon hiji poé

Ruang lingkup SRP henteu dugi ka OOP sareng SOLID. Ieu lumaku pikeun métode, fungsi, kelas, modul, microservices sarta jasa. Ieu lumaku pikeun duanana "figax-figax-na-prod" jeung "rokét-élmu" ngembangkeun, sahingga dunya saeutik hadé madhab. Upami anjeun mikirkeun éta, ieu ampir prinsip dasar sadaya rékayasa. Téknik mékanis, sistem kontrol, jeung memang sakabeh sistem kompléks diwangun ti komponén, sarta "underfragmentation" deprives désainer tina kalenturan, "overfragmentation" deprives désainer efisiensi, sarta wates lepat deprives aranjeunna tina alesan jeung karapihan pikiran.

Prinsip Tanggung Jawab Tunggal. Teu sakumaha basajan sakumaha sigana

SRP henteu diciptakeun ku alam sareng sanés bagian tina élmu pasti. Ieu megatkeun kaluar tina watesan biologis jeung psikologis urang. Ieu ngan hiji cara pikeun ngadalikeun jeung ngamekarkeun sistem kompléks ngagunakeun otak kera-lalaki. Anjeunna ngabejaan urang kumaha decompose sistem. Formulasi aslina peryogi jumlah telepati anu lumayan, tapi kuring ngarepkeun tulisan ieu ngabersihkeun sababaraha layar asap.

sumber: www.habr.com

Tambahkeun komentar