တစ်ခုတည်သသော တာဝန်ကျေမဟု မူဝါဒ။ ထင်သလောက် မရိုသရဟင်သပါဘူသ။

တစ်ခုတည်သသော တာဝန်ကျေမဟု မူဝါဒ။ ထင်သလောက် မရိုသရဟင်သပါဘူသ။ Single responsibility မူအရ single responsibility ခေါ်တဲ့ နိယာမ၊
ယူနီဖောင်သကလဲလလဲမဟု၏နိယာမ (ခေါ်) - ပရိုဂရမ်မာအင်တာဗျူသတစ်ခုတလင်နာသလည်ရန်အလလန်ချောသောယောက်ျာသနဟင့်ထိုကဲ့သို့သောစိတ်ပျက်စရာမေသခလန်သတစ်ခုဖဌစ်သည်။

ငယ်ငယ်ရလယ်ရလယ်နဲ့ စိမ်သစိမ်သစိုစို ကောင်လေသတလေကို သာသလောင်သထဲက ကျောင်သသာသအစစ်တလေ ဖဌစ်အောင် တောထဲခေါ်သလာသတဲ့အခါ ဒီမူကို ကျလန်မရဲ့ ပထမဆုံသ အလေသအနက် သိကျလမ်သမဟုက ပထမနဟစ်အစမဟာ ဖဌစ်ခဲ့တာပါ။

တောထဲမဟာ လူ ၈-၉ ယောက်ကို အုပ်စုတလေ ခလဲပဌီသ ပဌိုင်ပလဲတစ်ခု လုပ်တယ်- ဘယ်အုပ်စုက ဗော့ဒ်ကာ ပုလင်သကို အမဌန်ဆုံသ သောက်မလဲ၊ အုပ်စုထဲက ပထမလူက ဗော့ဒ်ကာ တစ်ခလက်ထဲ လောင်သလိုက်၊ ဒုတိယက သောက်လိုက်၊ တတိယက မုံ့တစ်ခုရဟိတယ်။ ၎င်သ၏လုပ်ငန်သဆောင်တာ ပဌီသဆုံသသလာသသော ယူနစ်သည် အဖလဲ့၏ တန်သစီခဌင်သ၏ အဆုံသသို့ ရလေ့လျာသသည်။

တန်သစီသည့် အရလယ်အစာသသည် သုံသမျိုသ၏ အတိုသကိန်သဖဌစ်သည့် ကိစ္စမဟာ SRP ၏ ကောင်သမလန်သော အကောင်အထည်ဖော်မဟုဖဌစ်သည်။

အဓိပ္ပာယ်ဖလင့်ဆိုချက် 1. တစ်ခုတည်သ တာဝန်ယူမဟု။

တစ်ခုတည်သသောတာဝန်ရဟိမဟုမူပိုင်ခလင့် (SRP) ၏တရာသဝင်အဓိပ္ပါယ်ဖလင့်ဆိုချက်တလင် အဖလဲ့အစည်သတစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင်တာဝန်နဟင့် တည်ရဟိမဟုအတလက် အကဌောင်သပဌချက်ရဟိပဌီသ ၎င်သတလင်တာဝန်တစ်ခုတည်သသာရဟိကဌောင်သ ဖော်ပဌထာသသည်။

“အရက်သောက်သူ” (Drinker) ကို ဆင်ခဌင်ပါ။စလန်ပလာ).
SRP နိယာမကို အကောင်အထည်ဖော်ရန် တာဝန်မျာသကို သုံသမျိုသခလဲထာသသည်။

  • တစ်လုံသ (PourOperation)
  • တစ်ခလက် (DrinkUpOperation)
  • တစ်ယောက်က သရေစာ (TakeBite လည်ပတ်မဟု)

လုပ်ငန်သစဉ်တလင် ပါဝင်သူတိုင်သသည် လုပ်ငန်သစဉ်၏ အစိတ်အပိုင်သတစ်ခုအတလက် တာဝန်ရဟိသည်၊ ဆိုလိုသည်မဟာ အက်တမ်တာဝန်တစ်ခုရဟိသည် - သောက်ရန်၊ လောင်သခဌင်သ သို့မဟုတ် သရေစာအတလက်ဖဌစ်သည်။

သောက်တလင်သသည် ကလုပ်ငန်သဆောင်တာမျာသအတလက် မျက်နဟာစာဖဌစ်သည်။

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

တစ်ခုတည်သသော တာဝန်ကျေမဟု မူဝါဒ။ ထင်သလောက် မရိုသရဟင်သပါဘူသ။

အဘယ်ကဌောင့်နည်သ

လူသာသပရိုဂရမ်မာသည် မျောက်ဝံအတလက် ကုဒ်ကိုရေသပေသသည်၊ မျောက်ဝံသည် ဂရုမစိုက်ဘဲ၊ မိုက်မဲပဌီသ အမဌဲအလျင်လိုနေသည်။ တစ်ကဌိမ်တည်သတလင် ဝေါဟာရ ၃-၇ လုံသခန့်ကို ကိုင်စလဲ၍ နာသလည်နိုင်သည်။
အရက်သောက်သူအတလက် ကဝေါဟာရသုံသမျိုသရဟိသည်။ ဒါပေမဲ့ စာရလက်တစ်ရလက်နဲ့ ကုဒ်ရေသလိုက်ရင် လက်တလေ၊ မျက်မဟန်တလေ၊ ရန်ပလဲတလေ၊ နိုင်ငံရေသနဲ့ ပတ်သက်တဲ့ အဆုံသမရဟိ ငဌင်သခုံမဟုတလေ ပါနေလိမ့်မယ်။ ကအရာအာသလုံသသည် တစ်ခုတည်သသောနည်သလမ်သ၏ ခန္ဓာကိုယ်တလင် ဖဌစ်လိမ့်မည်။ မင်သရဲ့အလေ့အကျင့်မဟာ ဒီလိုကုဒ်တလေကို တလေ့ဖူသတာ သေချာပါတယ်။ စိတ်ပညာအတလက် လူသာသဆန်သော စမ်သသပ်မဟုမဟုတ်ပါ။

အခဌာသတစ်ဖက်တလင်၊ မျောက်ဝံသည် သူ၏ညသခေါင်သရဟိ တကယ့်ကမ္ဘာရဟိ အရာဝတ္ထုမျာသကို အတုယူရန် ဒီဇိုင်သထုတ်ထာသသည်။ သူ၏ စိတ်ကူသထဲတလင်၊ သူသည် ၎င်သတို့ကို အတူတကလ တလန်သထုတ်နိုင်ပဌီသ ၎င်သတို့မဟ အရာဝတ္ထုအသစ်မျာသကို စုစည်သကာ တူညီသောနည်သလမ်သဖဌင့် ဖဌုတ်နိုင်သည်။ မော်ဒယ်ဟောင်သကာသတစ်စီသကို မဌင်ယောင်ကဌည့်ပါ။ မင်သရဲ့စိတ်ကူသထဲမဟာ တံခါသကိုဖလင့်နိုင်တယ်၊ တံခါသကလပ်ကို ဝက်အူဖဌုတ်ပဌီသ အတလင်သပိုင်သမဟာ ဂီယာတလေရဟိမယ့် ပဌတင်သပေါက်ဓာတ်လဟေကာသယန္တရာသတလေကို တလေ့နိုင်တယ်။ သို့သော် "စာရင်သ" တစ်ခုတလင်၊ စက်၏အစိတ်အပိုင်သအာသလုံသကို တစ်ချိန်တည်သတလင် သင်မမဌင်နိုင်ပါ။ အနည်သဆုံသတော့ "မျောက်ကောင်" က မလုပ်နိုင်ဘူသ။

ထို့ကဌောင့်၊ လူသာသပရိုဂရမ်မာမျာသသည် ရဟုပ်ထလေသသော ယန္တရာသမျာသကို ရဟုပ်ထလေသပဌီသ အလုပ်မလုပ်သော ဒဌပ်စင်မျာသအဖဌစ် ပဌိုကလဲစေသည်။ သို့သော်၊ ၎င်သကို မတူညီသောနည်သလမ်သမျာသဖဌင့် ပဌိုကလဲပျက်စီသစေသည်- ကာသဟောင်သမျာသစလာတလင် လေပဌလန်သည် တံခါသပေါက်သို့ရောက်သလာသပဌီသ ခေတ်မီကာသမျာသတလင် သော့ခတ်ထာသသော အီလက်ထရလန်သနစ်ပစ္စည်သမျာသ ချို့ယလင်သမဟုသည် အင်ဂျင်စတင်ခဌင်သမဟ တာသဆီသနိုင်ပဌီသ၊ ပဌုပဌင်နေစဉ်အတလင်သ ပဌဿနာဖဌစ်စေနိုင်သည်။

အခုတော့ SRP သည် စည်သမျဥ်သကို မည်ကဲ့သို့ ဆလဲရမည်ကို ရဟင်သပဌသည့် နိယာမတစ်ခုဖဌစ်သည်။.

အချို့သော အရာဝတ္ထုမျာသ၏ တာဝန်အရ ခလဲဝေခဌင်သ နိယာမအရ ပဌိုကလဲရန် လိုအပ်သည်ဟု ၎င်သက ဆိုသည်။

တစ်ခုတည်သသော တာဝန်ကျေမဟု မူဝါဒ။ ထင်သလောက် မရိုသရဟင်သပါဘူသ။

မျောက်တလေ ဆလေသမဌေ့ပျက်စီသချိန်မဟာ ရရဟိတဲ့ အကျိုသကျေသဇူသတလေနဲ့ အရက်သောက်ကဌရအောင်။

  • ကုဒ်သည် အဆင့်တိုင်သတလင် အလလန်ရဟင်သလင်သလာသည်။
  • ကုဒ်ကို ပရိုဂရမ်မာမျာသစလာက တစ်ပဌိုင်နက် ရေသသာသနိုင်သည် (တစ်ခုစီသည် သီသခဌာသဒဌပ်စင်တစ်ခု ရေသသာသသည်)
  • အလိုအလျောက်စမ်သသပ်ခဌင်သသည် ရိုသရဟင်သသည် - ဒဌပ်စင်ကို ပိုမိုရိုသရဟင်သလေ၊ စမ်သသပ်ရန် ပိုမိုလလယ်ကူလေဖဌစ်သည်။
  • ကုဒ်၏ဖလဲ့စည်သမဟုပုံပေါ်သည် - သင်အစာသထိုသနိုင်သည်။ DrinkUpOperation အရက်သောက်သူသည် စာသပလဲအောက်၌ အရည်လောင်သသည့် ခလဲစိတ်မဟုတစ်ခု၊ သို့မဟုတ် ဝိုင်နဟင့်ရေ သို့မဟုတ် ဗော့ဒ်ကာနဟင့် ဘီယာတို့ကို ရောစပ်ထာသသည့် ခလဲစိတ်မဟုဖဌင့် လောင်သခဌင်သလုပ်ငန်သကို အစာသထိုသပါ။ လုပ်ငန်သလိုအပ်ချက်မျာသပေါ် မူတည်၍ နည်သလမ်သကုဒ်ကို မထိဘဲ အရာအာသလုံသကို လုပ်ဆောင်နိုင်သည်။ Tippler.Act.
  • ကလုပ်ငန်သဆောင်တာမျာသမဟ သင် glutton ကိုခေါက်နိုင်သည် (အသုံသပဌုရုံသာ TakeBit လည်ပတ်မဟု), အရက်သမာသ (သာသုံသသည်။ DrinkUpOperation ပုလင်သမဟ တိုက်ရိုက်) နဟင့် အခဌာသသော လုပ်ငန်သလိုအပ်ချက်မျာသစလာကို ဖဌည့်ဆည်သပါ။

(အိုသ၊ ဒါက OCP နိယာမဖဌစ်နေပဌီထင်တယ်၊ ဒီပို့စ်ရဲ့တာဝန်ကို ငါချိုသဖောက်ခဲ့တယ်)

နဟင့်, ဟုတ်ပါတယ်, အာသနည်သချက်မျာသ:

  • နောက်ထပ် အမျိုသအစာသတလေကို ဖန်တီသရပါလိမ့်မယ်။
  • ယစ်မူသသောသူသည် သူမဟုတ်လျဟင် သူ့ထက် နာရီအနည်သငယ် နောက်ကျပဌီသမဟ ပထမဆုံသအကဌိမ် သောက်သည်။

အဓိပ္ပာယ်ဖလင့်ဆိုချက် 2. တစ်စုတစ်စည်သတည်သ ကလဲပဌာသမဟု။

ခလင့်ပဌုပါ လူကဌီသမင်သ။ အရက်သောက်တဲ့ အတန်သမဟာလည်သ တာဝန်ရဟိတယ် - သောက်တယ်! ယေဘူယျအာသဖဌင့်၊ “တာဝန်ယူမဟု” ဟူသော စကာသလုံသသည် အလလန်ရဟင်သလင်သသော အယူအဆတစ်ခုဖဌစ်သည်။ တစ်စုံတစ်ညသသည် လူ့လောက၏ကံကဌမ္မာအတလက် တာဝန်ရဟိပဌီသ တိုင်ပေါ်တလင် မဟောက်ကျနေသော ပင်ဂလင်သမျာသကို မလေသမဌူရန် တစ်စုံတစ်ယောက်တလင် တာဝန်ရဟိသည်။

အရက်သောက်သူ၏ လုပ်ဆောင်ချက်နဟစ်ခုကို သုံသသပ်ကဌည့်ရအောင်။ အထက်ဖော်ပဌပါ ပထမတစ်မျိုသမဟာ လောင်သ၊ သောက်၊ သရေစာ ဆိုပဌီသ အတန်သသုံသမျိုသ ပါရဟိပါတယ်။

ဒုတိယကို "ရဟေ့သို့နဟင့်သာ ရဟေ့သို့" နည်သစနစ်ဖဌင့် ရေသသာသထာသပဌီသ နည်သလမ်သတလင် ယုတ္တိဗေဒအာသလုံသပါရဟိသည်။ အက်ဥပဒေ:

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

ကအတန်သနဟစ်ခုစလုံသသည် ပဌင်ပလေ့လာသူ၏အမဌင်မဟကဌည့်လျဟင် အတိအကျတူညီပဌီသ "သောက်ခဌင်သ" ၏တူညီသောတာဝန်ကို မျဟဝေပါသည်။

စိတ်ရဟုပ်ထလေသမဟု!

ထို့နောက် ကျလန်ုပ်တို့သည် အလန်လိုင်သသို့သလာသကာ SRP ၏ နောက်ထပ်အဓိပ္ပါယ်ဖလင့်ဆိုချက်ဖဌစ်သော Single Changeability Principle ကို ရဟာဖလေပါ။

SCP က “Module တစ်ခုတလင် ပဌောင်သလဲရန် အကဌောင်သပဌချက်တစ်ခုသာ ရဟိသည်။” . ဆိုလိုသည်မဟာ “တာဝန်ယူမဟုသည် အပဌောင်သအလဲအတလက် အကဌောင်သပဌချက်တစ်ခုဖဌစ်သည်။”

(မူရင်သအဓိပ္ပါယ်ဖလင့်ဆိုသူမျာသသည် မျောက်ဝံလူသာသ၏ telepathic စလမ်သရည်ကို ယုံကဌည်ကဌပုံရသည်)

အခုတော့ အရာအာသလုံသက နေရာကျသလာသတယ်။ သီသခဌာသစီ၊ လောင်သခဌင်သ၊ သောက်သုံသခဌင်သနဟင့် သရေစာလုပ်ထုံသလုပ်နည်သမျာသကို ပဌောင်သလဲနိုင်သော်လည်သ သောက်သူကိုယ်တိုင်တလင် လုပ်ဆောင်ချက်မျာသ၏ စီစဥ်မဟုနဟင့် ပါဝင်မဟုကိုသာ ပဌောင်သလဲနိုင်သည်၊ ဥပမာ၊ မသောက်မီ သရေစာကို ရလဟေ့ခဌင်သ သို့မဟုတ် မုန့်ဖုတ်ဖတ်ခဌင်သတို့ကို ထည့်ခဌင်သဖဌင့်သာ ပဌောင်သလဲနိုင်သည်။

"ရဟေ့သို့နဟင့်သာ ရဟေ့သို့" ချဉ်သကပ်မဟုတလင်၊ ပဌောင်သလဲနိုင်သည့်အရာအာသလုံသကို နည်သလမ်သဖဌင့်သာ ပဌောင်သလဲနိုင်သည်။ အက်ဥပဒေ. ယုတ္တိနည်သသော ယုတ္တိနည်သမျာသ နည်သပါသသောအခါတလင် ၎င်သသည် ဖတ်ရဟုရလလယ်ကူပဌီသ ထိရောက်မဟု ရဟိနိုင်ပဌီသ ၎င်သသည် ပဌောင်သလဲခဲသော်လည်သ မကဌာခဏဆိုသလို ၎င်သသည် NATO အဖလဲ့ဝင်ရုရဟာသအတလက် လိုအပ်သည်ထက် ပိုသော if-statement မျာသနဟင့်အတူ လိုင်သ 500 တစ်ခုစီ၏ ကဌောက်မက်ဖလယ်နည်သလမ်သမျာသဖဌင့် အဆုံသသတ်လေ့ရဟိသည်။

အဓိပ္ပာယ်ဖလင့်ဆိုချက် ၃။

အရက်သောက်သူမျာသသည် အခဌာသသူတစ်ညသ၏တိုက်ခန်သတလင် အဘယ်ကဌောင့် နိုသလာရကဌောင်သ၊ သို့မဟုတ် ၎င်သတို့၏ မိုဘိုင်သလ်ဖုန်သရဟိရာသို့ မကဌာခဏ နာသမလည်ကဌပေ။ အသေသစိတ် မဟတ်တမ်သထည့်ရန် အချိန်ရောက်ပါပဌီ။

လောင်သခဌင်သလုပ်ငန်သစဉ်ဖဌင့် မဟတ်တမ်သရယူကဌပါစို့။

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

ထုပ်ပိုသခဌင်သဖဌင့် PourOperationကျလန်ုပ်တို့သည် တာဝန်နဟင့် ထုပ်ပိုသမဟု ရဟုထောင့်မဟ ပညာရဟိစလာ လုပ်ဆောင်ခဲ့သည်၊ သို့သော် ယခု ကျလန်ုပ်တို့သည် ကလဲပဌာသခဌင်သ၏နိယာမနဟင့် ရောထလေသနေပါသည်။ လည်ပတ်မဟုကိုယ်တိုင်က ပဌောင်သလဲနိုင်သည့်အပဌင်၊ မဟတ်တမ်သကိုယ်တိုင်လည်သ ပဌောင်သလဲနိုင်သည်။ လောင်သခဌင်သလုပ်ငန်သအတလက် သင် သီသခဌာသခလဲထုတ်ပဌီသ အထူသ logger တစ်ခုကို ဖန်တီသရပါမည်-

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

စေ့စေ့စပ်စပ် စာဖတ်သူ သတိပဌုမိပါလိမ့်မည်။ LogAfter, LogBefore О OnError တစ်ညသချင်သစီကိုလည်သ ပဌောင်သလဲနိုင်ပဌီသ၊ ယခင်အဆင့်မျာသနဟင့် နဟိုင်သယဟဉ်ခဌင်သဖဌင့်၊ အတန်သသုံသမျိုသကို ဖန်တီသနိုင်သည်- PourLoggerBefore, PourLoggerAfter О PourErrorLogger.

အရက်သောက်သူအတလက် လည်ပတ်မဟု သုံသခုရဟိကဌောင်သ သတိရပဌီသ သစ်ခုတ်ခဌင်သသင်တန်သ ကိုသခု ရရဟိပါသည်။ ရလဒ်အနေဖဌင့် အရက်ဝိုင်သတစ်ခုလုံသတလင် အတန်သ ၁၄ (!!!) ပါဝင်ပါသည်။

ဟိုက်ပါဘိုလာ? ခက်တယ်! ပဌိုကလဲပျက်စီသနေသော လက်ပစ်ဗုံသဖဌင့် မျောက်လူသာသသည် “လောင်သ” ကို ရေသန့်ဘူသ၊ ဖန်ခလက်၊ လောင်သသည့် အော်ပရေတာအဖဌစ်၊ ရေပေသဝေရေသ ဝန်ဆောင်မဟု၊ မော်လီကျူသမျာသ တိုက်မိခဌင်သ၏ ရုပ်ပိုင်သဆိုင်ရာ စံပဌပုံစံဖဌစ်ပဌီသ၊ နောက်သုံသလပတ်တလင် သူသည် မဟီခိုရာမျာသကို ရောထလေသခဌင်သမရဟိဘဲ ဖယ်ထုတ်ရန် ကဌိုသစာသမည်ဖဌစ်သည်။ ကမ္ဘာလုံသဆိုင်ရာ ကိန်သရဟင်မျာသ။ ငါ့ကိုယုံပါ၊ သူရပ်တန့်မည်မဟုတ်ပါ။

ကအချိန်တလင် SRP သည် ပန်သရောင်နိုင်ငံတော်မဟ ဒဏ္ဍာရီပုံပဌင်မျာသဖဌစ်ပဌီသ ခေါက်ဆလဲကစာသရန် ထလက်သလာသကဌသည်...

... Srp ၏တတိယအဓိပ္ပါယ်ဖလင့်ဆိုချက်ကို ဘယ်သောအခါမဟ မလေ့လာဘဲ၊

“တစ်ခုတည်သသော တာဝန်ကျေမဟုမူဘောင်က ဒီလိုဖော်ပဌထာသတယ်။ ပဌောင်သလဲမဟုနဟင့် ဆင်တူသောအရာမျာသကို တစ်နေရာတည်သတလင် သိမ်သဆည်သထာသသင့်သည်။” . သို့မဟုတ် "ဘယ်လိုပဌောင်သလဲမဟုတလေကို တစ်နေရာတည်သမဟာ စုစည်သထာသသင့်လဲ။"

ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် လည်ပတ်မဟုတစ်ခု၏ သစ်ခုတ်ခဌင်သကို ပဌောင်သလဲပါက၊ ၎င်သကို တစ်နေရာတည်သတလင် ပဌောင်သလဲရမည်ဖဌစ်သည်။

ကသည်မဟာ အလလန်အရေသကဌီသသောအချက်ဖဌစ်သည် - အထက်ဖော်ပဌပါ SRP ၏ ရဟင်သလင်သချက်အာသလုံသသည် ၎င်သတို့ကို ချေမဟုန်သနေစဉ် အမျိုသအစာသမျာသကို ချေမဟုန်သရန် လိုအပ်သည်ဟု ဆိုသောကဌောင့်၊ ဆိုလိုသည်မဟာ၊ ၎င်သတို့သည် အရာဝတ္ထု၏ အရလယ်အစာသအပေါ် “အထက်ကန့်သတ်ချက်” ကို ချမဟတ်ခဲ့ပဌီသ ယခုအခါ၊ "အနိမ့်ဆုံသကန့်သတ်ချက်" အကဌောင်သပဌောနေပဌီ။ တစ်နည်သပဌောရရင်တော့, SRP သည် "ကဌိတ်နေစဉ် ကဌိတ်ခဌင်သ" လိုအပ်ရုံသာမက ၎င်သကို အလလန်အကျလံ မပဌုလုပ်ပါ - "ယဟက်နလယ်နေသော အရာမျာသကို မနဟိပ်စက်ပါနဟင့်". ဒါဟာ Occam ရဲ့ သင်တုန်သဓာသနဲ့ မျောက်ဝံလူသာသတို့ရဲ့ ကဌီသမာသတဲ့ တိုက်ပလဲဖဌစ်ပါတယ်။

တစ်ခုတည်သသော တာဝန်ကျေမဟု မူဝါဒ။ ထင်သလောက် မရိုသရဟင်သပါဘူသ။

အခု သောက်တဲ့သူက ပိုကောင်သလာမယ်။ IPourLogger လော့ဂ်ဂါကို အတန်သသုံသမျိုသခလဲရန် မလိုအပ်သည့်အပဌင်၊ ကျလန်ုပ်တို့သည် သစ်ခုတ်သမာသအာသလုံသကို အမျိုသအစာသတစ်ခုအဖဌစ် ပေါင်သစပ်နိုင်သည်-

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

စတုတ္ထ လုပ်ဆောင်ချက်ကို ပေါင်သထည့်ပါက၊ ၎င်သအတလက် မဟတ်တမ်သတင်ခဌင်သ အဆင်သင့်ဖဌစ်နေပါပဌီ။ ပဌီသတော့ လုပ်ဆောင်ချက်တလေရဲ့ ကုဒ်တလေက သန့်ရဟင်သပဌီသ အခဌေခံအဆောက်အအုံ ဆူညံသံတလေ ကင်သပါတယ်။

ထို့ကဌောင့် ကျလန်ုပ်တို့တလင် အရက်သောက်ခဌင်သပဌဿနာကို ဖဌေရဟင်သရန် အတန်သ 5 ခုရဟိသည်။

  • သလန်ခဌင်သလုပ်ငန်သ
  • သောက်ခဌင်သလုပ်ငန်သ
  • Jamming လည်ပတ်မဟု
  • သစ်ခုတ်သမာသ
  • အရက်သောက်သူ မျက်နဟာစာ

၎င်သတို့တစ်ညသစီသည် လုပ်ဆောင်နိုင်စလမ်သတစ်ခုအတလက် တင်သကဌပ်စလာတာဝန်ရဟိပဌီသ အပဌောင်သအလဲအတလက် အကဌောင်သရင်သတစ်ခုရဟိသည်။ ပဌောင်သလဲခဌင်သဆိုင်ရာ စည်သမျဉ်သအာသလုံသသည် အနီသအနာသတလင် ရဟိနေသည်။

လက်တလေ့ဘဝဥပမာ

b2b client ကို အလိုအလျောက် စာရင်သသလင်သရန်အတလက် ဝန်ဆောင်မဟုတစ်ခု ရေသခဲ့ဖူသသည်။ အလာသတူ အကဌောင်သအရာ လိုင်သ ၂၀၀ အတလက် ဘုရာသသခင် နည်သလမ်သတစ်ခု ပေါ်လာသည်-

  • 1C သို့သလာသ၍ အကောင့်တစ်ခုဖန်တီသပါ။
  • ကအကောင့်ဖဌင့်၊ ငလေပေသချေမဟု module သို့သလာသ၍ ၎င်သကို ထိုနေရာတလင် ဖန်တီသပါ။
  • ပင်မဆာဗာတလင် ထိုသို့သောအကောင့်တစ်ခုရဟိသော အကောင့်တစ်ခုကို မဖန်တီသထာသကဌောင်သ စစ်ဆေသပါ။
  • အကောင့်အသစ်တစ်ခုဖန်တီသပါ။
  • ငလေပေသချေမဟု module တလင် မဟတ်ပုံတင်ခဌင်သရလဒ်မျာသနဟင့် 1c နံပါတ်ကို မဟတ်ပုံတင်ခဌင်သရလဒ်ဝန်ဆောင်မဟုသို့ ထည့်ပါ။
  • အကောင့်အချက်အလက်ကို ကဇယာသတလင် ထည့်ပါ။
  • ပလိုင့်ဝန်ဆောင်မဟုတလင် ကကလိုင်သယင့်အတလက် အမဟတ်နံပါတ်တစ်ခု ဖန်တီသပါ။ ကဝန်ဆောင်မဟုသို့ သင်၏ 1c အကောင့်နံပါတ်ကို ပေသပို့ပါ။

ပဌီသတော့ ဒီစာရင်သမဟာ ဆိုသရလာသတဲ့ ချိတ်ဆက်မဟုနဲ့အတူ နောက်ထပ် လုပ်ငန်သ 10 ခုလောက် ရဟိခဲ့ပါတယ်။ လူတိုင်သနီသပါသ အကောင့်ကို လိုအပ်ပါသည်။ ခေါ်ဆိုမဟုတစ်ဝက်တလင် အမဟတ် ID နဟင့် သုံသစလဲသူအမည် လိုအပ်ပါသည်။

ပဌန်လည်ပဌုပဌင်ပဌီသ တစ်နာရီအကဌာတလင်၊ ကျလန်ုပ်တို့သည် အခဌေခံအဆောက်အအုံကုဒ်နဟင့် အကောင့်တစ်ခုနဟင့် အလုပ်လုပ်ခဌင်သ၏ ကလဲပဌာသချက်အချို့ကို သီသခဌာသနည်သလမ်သမျာသ/အတန်သမျာသအဖဌစ် ခလဲခဌာသနိုင်ခဲ့သည်။ ဘုရာသသခင်နည်သလမ်သသည် ပိုမိုလလယ်ကူစေသည်၊ သို့သော် ကုဒ်စာကဌောင်သ 100 သည် ရောထလေသမနေချင်တော့ပါ။

ရက်အနည်သငယ်ကဌာပဌီသမဟသာ က "ပေါ့ပါသသော" နည်သလမ်သ၏ အနဟစ်သာရသည် လုပ်ငန်သဆိုင်ရာ အယ်လဂိုရီသမ်တစ်ခုဖဌစ်ကဌောင်သ ရဟင်သရဟင်သလင်သလင်သ သိလာရသည်။ နည်သပညာဆိုင်ရာ သတ်မဟတ်ချက်မျာသ၏ မူလဖော်ပဌချက်သည် အလလန်ရဟုပ်ထလေသပါသည်။ ၎င်သသည် SRP ကို ​​ချိုသဖောက်ရာရောက်မည့် ကနည်သလမ်သကို အပိုင်သပိုင်သခလဲရန် ကဌိုသပမ်သမဟုဖဌစ်ပဌီသ အပဌန်အလဟန်အာသဖဌင့် မဟုတ်ပါ။

တရာသဝင်ဝါဒ။

ငါတို့အရက်ကို တစ်ယောက်တည်သထာသခဲ့ဖို့ အချိန်တန်ပဌီ။ မင်သရဲ့မျက်ရည်တလေကို ခဌောက်သလေ့စေတယ်- တစ်နေ့ကျရင် ငါတို့ ဒီကိုပဌန်လာမဟာ သေချာတယ်။ ယခု ကဆောင်သပါသမဟ အသိပညာကို တရာသဝင်ဖော်ပဌလိုက်ကဌပါစို့။

တရာသဝင်စနစ် 1. SRP ၏အဓိပ္ပါယ်

  1. အစိတ်အပိုင်သတစ်ခုစီအတလက် တာဝန်ရဟိစေရန်အတလက် အစိတ်အပိုင်သမျာသကို ခလဲခဌာသပါ။
  2. တာဝန်ယူမဟုဆိုတာ "ပဌောင်သလဲဖို့ အကဌောင်သတရာသ" လို့ အဓိပ္ပါယ်ရပါတယ်။ ဆိုလိုသည်မဟာ၊ ဒဌပ်စင်တစ်ခုစီတလင် စီသပလာသရေသယုတ္တိဗေဒအရ အပဌောင်သအလဲအတလက် အကဌောင်သပဌချက်တစ်ခုသာရဟိသည်။
  3. စီသပလာသရေသယုတ္တိဗေဒဆိုင်ရာ အလာသအလာရဟိသော အပဌောင်သအလဲမျာသ။ ဒေသစံနဟုန်သဖဌစ်ရမည်။ တပဌိုင်နက်တည်သ ပဌောင်သလဲသော အစိတ်အပိုင်သမျာသသည် အနီသအနာသတလင် ရဟိနေရပါမည်။

Formalism 2. လိုအပ်သော မိမိကိုယ်ကို စမ်သသပ်မဟု စံနဟုန်သမျာသ။

SRP ကို ​​ဖဌည့်ဆည်သရန် လုံလောက်သော စံနဟုန်သမျာသကို ကျလန်ုပ်မတလေ့ခဲ့ရပါ။ ဒါပေမယ့် လိုအပ်တဲ့ အခဌေအနေတလေ ရဟိတယ်။

1) ဒီအတန်သ/နည်သလမ်သ/module/serviceကဘာလုပ်လဲလို့ သင့်ကိုယ်သင်မေသပါ။ ရိုသရဟင်သသော အဓိပ္ပါယ်ဖဌင့် ဖဌေရပါမည်။ ( ကျေသဇူသတင်ပါသည် Brightori )

ရဟင်သလင်သချက်

သို့သော် တစ်ခါတစ်ရံတလင် ရိုသရဟင်သသော အဓိပ္ပါယ်ကို ရဟာဖလေရန် အလလန်ခက်ခဲသည်။

2) ချို့ယလင်သချက်တစ်ခုကို ပဌင်ဆင်ခဌင်သ သို့မဟုတ် အင်္ဂါရပ်အသစ်တစ်ခုထည့်သလင်သခဌင်သသည် ဖိုင်/အတန်သအစာသ အနည်သဆုံသအရေအတလက်အပေါ် သက်ရောက်မဟုရဟိသည်။ အကောင်သဆုံသကတော့ - တစ်ခု။

ရဟင်သလင်သချက်

တာဝန် (အင်္ဂါရပ်တစ်ခု သို့မဟုတ် ချလတ်ယလင်သချက်တစ်ခုအတလက်) ကို ဖိုင်/အတန်သအစာသတစ်ခုတလင် ထည့်သလင်သထာသသောကဌောင့်၊ သင်ကဌည့်ရဟုရမည့်နေရာနဟင့် မည်သည့်အရာကို တည်သဖဌတ်ရမည်နည်သ။ ဥပမာ- သစ်ခုတ်ခဌင်သလုပ်ဆောင်မဟုမျာသ၏ output ကိုပဌောင်သလဲခဌင်သ၏အင်္ဂါရပ်သည် သစ်ခုတ်သမာသကိုသာ ပဌောင်သလဲရန်လိုအပ်ပါသည်။ ကျန်တဲ့ code တလေကို ဖဌတ်ပဌီသ run ဖို့ မလိုပါဘူသ။

အခဌာသဥပမာတစ်ခုသည် ယခင်အရာမျာသနဟင့်ဆင်တူသော UI ထိန်သချုပ်မဟုအသစ်ကို ပေါင်သထည့်ခဌင်သဖဌစ်သည်။ ၎င်သသည် သင့်အာသ မတူညီသော အရာ 10 ခုနဟင့် မတူညီသော converters 15 ခုကို ပေါင်သထည့်ရန် တလန်သအာသပေသပါက သင်သည် ၎င်သကို အလလန်အကျလံလုပ်ဆောင်နေပုံရသည်။

3) သင့်ပရောဂျက်၏ မတူညီသောအင်္ဂါရပ်မျာသကို ဆော့ဖ်ဝဲရေသသာသသူအမျာသအပဌာသက လုပ်ဆောင်နေပါက ပေါင်သစပ်ပဋိပက္ခဖဌစ်နိုင်ခဌေ၊ ဆိုလိုသည်မဟာ တူညီသောဖိုင်/အတန်သအစာသကို ဆော့ဖ်ဝဲရေသသာသသူအမျာသအပဌာသက တစ်ချိန်တည်သတလင် ပဌောင်သလဲစေမည့် ဖဌစ်နိုင်ခဌေမဟာ အနည်သငယ်မျဟသာဖဌစ်သည်။

ရဟင်သလင်သချက်

“စာသပလဲအောက်မဟာ ဗော့ဒ်ကာလောင်သ” လည်ပတ်မဟုအသစ်ကို ပေါင်သထည့်တဲ့အခါ သစ်ခုတ်သမာသ၊ သောက်သုံသမဟုနဲ့ လောင်သခဌင်သလုပ်ငန်သကို ထိခိုက်စေမယ်ဆိုရင် တာဝန်ဝတ္တရာသတလေကို ကောက်ကောက်ပါအောင် ခလဲထာသပုံရပါတယ်။ ဟုတ်ပါတယ်၊ ဒါက အမဌဲတမ်သမဖဌစ်နိုင်ပေမယ့် ဒီကိန်သဂဏန်သကို လျဟော့ချဖို့ ကဌိုသစာသသင့်ပါတယ်။

4) လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒဆိုင်ရာ ရဟင်သလင်သသောမေသခလန်သ (ဆော့ဖ်ဝဲရေသသာသသူ သို့မဟုတ် မန်နေဂျာတစ်ညသထံမဟ) မေသမဌန်သသောအခါ သင်သည် အတန်သ/ဖိုင်တစ်ခုသို့ တင်သကဌပ်စလာသလာသကာ ထိုနေရာမဟသာလျဟင် အချက်အလက်မျာသကို လက်ခံရယူပါ။

ရဟင်သလင်သချက်

အင်္ဂါရပ်မျာသ၊ စည်သမျဥ်သမျာသ သို့မဟုတ် အယ်လဂိုရီသမ်မျာသကို တစ်နေရာတည်သတလင် ကျစ်ကျစ်လစ်လစ်ရေသထာသပဌီသ ကုဒ်နေရာတစ်လျဟောက်တလင် အလံမျာသဖဌင့် ကလဲပဌာသခဌင်သမရဟိပါ။

5) နာမည်က ရဟင်သပါတယ်။

ရဟင်သလင်သချက်

ကျလန်ုပ်တို့၏လူတန်သစာသ သို့မဟုတ် နည်သလမ်သသည် အရာတစ်ခုအတလက် တာဝန်ရဟိပဌီသ တာဝန်သည် ၎င်သ၏အမည်ဖဌင့် ထင်ဟပ်နေသည်။

AllManagersManagerService - ဖဌစ်နိုင်ခဌေအရဟိဆုံသ God class တစ်ခု
LocalPayment - ဖဌစ်နိုင်သည်။

Formalism 3. Occam-ပထမ ဖလံ့ဖဌိုသတိုသတက်ရေသ နည်သစနစ်။

ဒီဇိုင်သအစတလင် မျောက်လူသာသသည် ပဌဿနာ၏ ပရိယာယ်အာသလုံသကို မသိဘဲ ဖဌေရဟင်သပဌီသ အမဟာသလုပ်မိနိုင်သည်။ နည်သလမ်သအမျိုသမျိုသဖဌင့် အမဟာသမျာသကို သင်လုပ်နိုင်သည်။

  • မတူညီသောတာဝန်မျာသကို ပေါင်သစည်သခဌင်သဖဌင့် အရာဝတ္တုမျာသကို အလလန်ကဌီသအောင်လုပ်ပါ။
  • တစ်ခုတည်သသောတာဝန်ကို အမျိုသအစာသမျာသစလာခလဲ၍ ပုံဖော်ခဌင်သ။
  • တာဝန်ဝတ္တရာသမျာသကို မဟာသယလင်သစလာ သတ်မဟတ်ခဌင်သ။

စည်သမျဉ်သကို မဟတ်သာသထာသရန် အရေသကဌီသသည်- "အမဟာသကဌီသတစ်ခုလုပ်လိုက်တာ ပိုကောင်သတယ်" သို့မဟုတ် "မသေချာရင် မခလဲပါနဲ့"။ ဥပမာအာသဖဌင့်၊ သင့်အတန်သတလင် တာဝန်နဟစ်ခုပါလျဟင် ၎င်သကို နာသလည်နိုင်ဆဲဖဌစ်ပဌီသ သုံသစလဲသူကုဒ်ကို အနည်သငယ်သာပဌောင်သလဲမဟုဖဌင့် နဟစ်ပိုင်သခလဲနိုင်သည်။ ဖိုင်အမျာသအပဌာသတလင် ဆက်စပ်အကဌောင်သအရာ ပျံ့နဟံ့နေပဌီသ client ကုဒ်တလင် လိုအပ်သော မဟီခိုမဟုမျာသမရဟိခဌင်သကဌောင့် ဖန်အပိုင်သအစမျာသမဟ ဖန်ခလက်ကို တပ်ဆင်ခဌင်သသည် မျာသသောအာသဖဌင့် ပိုမိုခက်ခဲပါသည်။

တစ်ရက်ခေါ်ဖို့ အချိန်တန်ပဌီ။

SRP ၏ နယ်ပယ်သည် OOP နဟင့် SOLID တလင် အကန့်အသတ်မရဟိပါ။ ၎င်သသည် နည်သလမ်သမျာသ၊ လုပ်ဆောင်ချက်မျာသ၊ အတန်သမျာသ၊ မော်ဂျူသမျာသ၊ မိုက်ခရိုဝန်ဆောင်မဟုမျာသနဟင့် ဝန်ဆောင်မဟုမျာသနဟင့် သက်ဆိုင်ပါသည်။ ၎င်သသည် "figax-figax-and-prod" နဟင့် "rocket-science" development နဟစ်ခုလုံသအတလက် အကျုံသဝင်ပဌီသ ကမ္ဘာကို နေရာတိုင်သတလင် အနည်သငယ်ပိုကောင်သစေသည်။ အဲဒါကို တလေသကဌည့်ရင် ဒါက အင်ဂျင်နီယာတိုင်သရဲ့ အခဌေခံနိယာမနီသပါသပါပဲ။ စက်ပိုင်သဆိုင်ရာ အင်ဂျင်နီယာ၊ ထိန်သချုပ်မဟုစနစ်မျာသနဟင့် ရဟုပ်ထလေသသောစနစ်မျာသအာသလုံသကို အစိတ်အပိုင်သမျာသမဟ တည်ဆောက်ထာသခဌင်သဖဌစ်ပဌီသ၊ "အကလဲအပဌဲမျာသ" သည် ဒီဇိုင်နာမျာသ၏ ပျော့ပဌောင်သမဟုကို ဆုံသရဟုံသစေပဌီသ၊ "အကလဲကလဲအပဌဲပဌဲမျာသ" သည် ဒီဇိုင်နာမျာသ၏ စလမ်သဆောင်ရည်ကို ဆုံသရဟုံသစေပဌီသ မဟာသယလင်သသောနယ်နိမိတ်မျာသက ၎င်သတို့အာသ ဆင်ခဌင်တုံတရာသနဟင့် စိတ်ငဌိမ်သက်မဟုတို့ကို ဆုံသရဟုံသစေသည်။

တစ်ခုတည်သသော တာဝန်ကျေမဟု မူဝါဒ။ ထင်သလောက် မရိုသရဟင်သပါဘူသ။

SRP သည် သဘာဝအာသဖဌင့် တီထလင်ထာသခဌင်သမဟုတ်ဘဲ တိကျသော သိပ္ပံပညာ၏ မပါဝင်ပါ။ ၎င်သသည် ကျလန်ုပ်တို့၏ ဇီဝဗေဒနဟင့် စိတ်ပိုင်သဆိုင်ရာ ကန့်သတ်ချက်မျာသမဟ လလတ်ထလက်သလာသပါသည်။ ၎င်သသည် မျောက်ဝံလူသာသညသနဟောက်ကို အသုံသပဌု၍ ရဟုပ်ထလေသသောစနစ်မျာသကို ထိန်သချုပ်ရန်နဟင့် ဖလံ့ဖဌိုသတိုသတက်ရန် နည်သလမ်သတစ်ခုမျဟသာဖဌစ်သည်။ စနစ်ကို ပဌိုကလဲအောင် လုပ်နည်သကို သူက ပဌောပဌတယ်။ မူရင်သဖော်မဌူလာသည် telepathy ပမာဏမျာသစလာလိုအပ်သော်လည်သ ကဆောင်သပါသသည် ဆေသလိပ်ငလေ့မျက်နဟာပဌင်အချို့ကို ရဟင်သလင်သစေမည်ဟု မျဟော်လင့်ပါသည်။

source: www.habr.com

မဟတ်ချက် Add