Šodien pirmais no S.O.L.I.D. grupas - "S"

“S” apzīmē - The Single Responsibility Principle (SRP).

 

The Single Responsibility Principle states that every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.

 

Tātad šis pagalvojums definē to, ka klasei ir ieteicams nodarboties un risināt tikai kādu konkrētu noteiktu problēmu. Jo vairāk atbildības uzņemas klase, jo lielāka varbūtība, ka pie izmaiņām, tiks ieviestas un izstrādātas jaunas kļūdas.

 

Zemāk ir dots pavisam triviāls piemērs, lai uzskatamāk nodemonstrētu Single Responsibility principu. Piemērs ir no apdrošināšanas biznesa, bet tas nekas :)

Piemēram, ir sistēmā definēts apdrošināšanas pieteikums (InsuranceApplication). Klase pēc savas būtības risina daudzas problēmas, piemēram:

  1. apdrošināšanas pieteikums ir spējīgs sevi novalidēt jeb pārbaudīt datu pareizīgumu;
  2. māk izdot polisi;
  3. un attiecīgi māk arī pabrīdināt klientu par to, ka polise ir sekmīgi izdota.

 

Pieņemsim, ka klienta pabrīdināšana nepieciešama tikai internetā (sistēmas komponente – Web Sales) izdotajām polisēm. Klašu diagramma attēlota zemāk.

 

image

 

Tradicionālajā veidā mēs definētu izdošanas metodi (Issue), kurā savukārt būtu iestrādāta loģika, kas pārbauda, no kuras sistēmas tiek izdota polise, un attiecīgi iekļautu klienta pabrīdināšanas (NotifyClient) metodes izsaukumu savā ķēdītē vai arī gluži pretēji - nē. Zemāk dotais piemērs ir tikai ar placeholderiem, lai lieki nepiesārņotu ēteru..

 

public class InsuranceApplication
{
    public int SourceSystem { get; set; }
 
    public void Issue()
    {
        Validate();
 
        // issue logic here
 
        if (SourceSystem == 1)  // 1 - web sales
        {
            NotifyClient();
        }
    }
 
    public void NotifyClient()
    {
 
    }
 
    public void Validate()
    {
 
    }
}

 

Viena no pamat kļūdām, kas pieļauta šajā koda uzbūvē, ir, InsuranceApplication klase zina pārāk daudz jeb klasei ir jāatbild par pārāk daudzām lietām – apdrošināšanas pieteikums zina, no kādas sistēmas šī konkrētā polise ir bijusi pieteikta un attiecīgi arī reaģē uz to izdošanas brīdī – informējot klientu par jauno polisi tikai un vienīgi interneta polises gadījumā.

 

Jaunā klašu diagramma ievērojot SRP principu būtu apmēram šāda:

 

image

 

Tātad:

  1. Izveidojam vienu bāzes (abstraktu vai arī virtuālu) klasi, kas reglamentē kopējo jeb generic izskatu apdrošināšanas polises pieteikuma klasei, kas sastāv no validācijas un izdošanas metodēm.
  2. Būtu jānodefinē divas apdrošināšanas pieteikuma apakšklases, kuras realizētu katrai no sistēmām nepieciešamo funkcionalitāti.
  3. Tikai polises interneta pieteikuma apakšklasē, būtu realizēta klienta pabrīdināšanas funkcionalitāte, jo tā nav nepieciešama BackOffice sistēmā.
  4. TODO: nepieciešams būtu arī atdalīt klienta pabrīdināšanas komponenti no tiešas izmantošanas interneta polises pieteikuma klasē (gaidi burtu “I” no S.O.L.I.D. grupas), bet to mēs izdarīsim vēlāk.

 

NB! Jāpiemin, ka SRP princips ļoti noder gadījumos, kad mainot kādu no funkcionalitātēm jeb atbildībām, ko uzņemas realizēt klase, nav nepieciešams pārkompilēt arī visas tieši saistošās sistēmas. Piemēram, pirmajā variantā, kad netika ievērots vēl SRP princips, mainot klienta pabrīdināšanas mehānismu (piemēram, no elektroniskā pasta uz SMS) nāktos pārkompilēt arī backoffice sistēmas komponentes, kurām loģiski nav nekāda sakara ar klienta pabrīdināšanas jeb notifikācijas sistēmas komponenti, kas tiek izmantota tikai interneta polisēm.

 

Ko tad patiešām dod šī principa ievērošana:

  1. Zemākas pakāpes atkarību (angl. coupling) starp sistēmas komponentēm un augstākas pakāpes saistība (angl. cohesion) sistēmas moduļa vai komponentes iekšienē.
  2. Samazinās if un switch nosacījumu skaitu izejas kodā, jo katra no atbildībām tiek veikta un risināta attiecīgi citā vietā.
  3. prasību izmaiņas ietekmē pēc iespējas mazāku apgabalu sistēmā, kā rezultātā samazināsies potenciālo problēmu skaits, kas var tikt saražots labojot kādu no problēmām, ko klase risina.
  4. Vairākas mazas klases ar mazāku jeb specifiskāku atbildību nodrošina elastīgāku sistēmas uzbūvi.

 

 

Šis OO dizainēšanas princips ir pavisam vienkāršs un saprotams un nav nekāda raķešu zinātne, tomēr, jāsaka, ka esmu secinājis, ka arī cilvēkiem ar šo dizainu visvairāk problēmas sagādā to atpazīt kodā un pareizajās vietās pielietot.

 

 

Cerams, ka noderēs!

Pārējie raksti SOLID sērijā:

Published Sunday, October 31, 2010 10:12 PM by valdis.iljuconoks

Comments

# re: Šodien pirmais no S.O.L.I.D. grupas - "S"

Paldies, Valdi ;)

Friday, November 05, 2010 10:16 PM by Māris L.

# re: Šodien pirmais no S.O.L.I.D. grupas - "S"

>"The Single Responsibility Principle states that every object should have a single responsibility"; "Tātad šis pagalvojums definē to, ka klasei ir ieteicams nodarboties un risināt tikai kādu konkrētu noteiktu problēmu."

Klase != objekts.

>Šis OO dizainēšanas princips ir pavisam vienkāršs un saprotams un nav nekāda raķešu zinātne, tomēr, jāsaka, ka esmu secinājis, ka arī cilvēkiem ar šo dizainu visvairāk problēmas sagādā to atpazīt kodā un pareizajās vietās pielietot.

Princips "grūti uztverams" tāpēc, ka tas ir subjektīvs. Tas pakārtojas programmētāja "skatu punkta izvērsumam".

Es varu skatīties uz sistēmu un teikt, ka tās vienīgais mērķis ir atvieglot apdrošināšanas biznesa procesus, bet tas nenozīmē, ka kodā viss jāattēlo kā viens, plakans, milzīgs objekts. Tas pats arī otrā virzienā - diez vai būs jēga abstrahēt "1+1" kā:

 public class Summator:ICanSumIntegers{

  public virtual int Sum(int left, int right){

   return left+right;

  }

 }

 new Summator().Sum(1,1)

Vēl ir labs indikators kā pamanīt SRP violation - miksēti abstrakcijas līmeņi. T.i. - ja es, piemēram, aprakstu biznesu, bet nākamajā rindā sāku parse`ot xml.

Tuesday, July 05, 2011 10:32 AM by Arnis Lapsa

# re: Šodien pirmais no S.O.L.I.D. grupas - "S"

You know what, I'm very much ilncined to agree.

Wednesday, November 09, 2011 6:06 AM by Jayde

# re: Šodien pirmais no S.O.L.I.D. grupas - "S"

It's appealing worth enough for me. In my view, if all website owners and bloggers made good content as you did, the web will be a lot more helpful than ever before.

Tuesday, December 13, 2011 9:16 AM by Cover Letter Writing Services

# GxexufBaiLTy

kftQzO I really like and appreciate your post.Much thanks again. Fantastic.

Saturday, March 24, 2012 1:42 PM by buy google +1

# Code review classicsTech Fellow Consulting | Tech Fellow Consulting

Pingback from  Code review classicsTech Fellow Consulting | Tech Fellow Consulting

Leave a Comment

(obligāts) 
(obligāts) 
(brīvizvēles)
(obligāts)