⚔ しっかりした原理をもつLOTR💍👿


これは、固体のプリンシパルを見て、どのようにリングの主は、映画のシリーズのさまざまな部分でそれを適用する奇妙な種類の楽しい方法になるだろう.この希望は、一般的にプログラミングの概念のより楽しい議論を奨励し、私のような固体のプリンシパルの別の視点のような技術的に才能の少ない個人を得るためです.与えられた、私は完璧ではない、事前にフィルムや概念についてのすべてのミス情報を事前にお詫び申し上げます.
TLDR:同じ古いソリッドプリンシパルですが、それを説明するためにLOTRを使用します.

単独責任
この映画の中のいくつかのキャラクターは、明確な、単一の責任を念頭に置いていた.フロドの明白なケースでは、彼の1つの本当の責任はMordorに行って、それが熱くなるようにそれを落とすことでした.
public class Frodo 

{ 

  public void ExecuteMission() 

  { 
     Console.WriteLine($"I, {nameof(Frodo)}, am tasked with 
                carrying the ring and throwing it in the ever 
                 fiery pit of Mordor!"); 

  } 
}
この例はまた、SamWise Gamgeeに拡張することができます.そして、その人は彼らの親友が彼らを会社を保つことによって彼らのゴールに達するのを手伝うことを求められます.

オープンクローズ
ヘルムの深い戦い.私はあなたが何を考えているかを知っています.ヘルムの深い構造はすべてでは悪くなかった、あなたはすべての種類の場所を持っていた“任意の”アーチャーは🤦‍♂️).
public class HelmsDeep 
{ 
        private readonly IEnumerable<IArcher> _archers;

        public HelmsDeep(IEnumerable<IArcher> archers) 
        { 
            _archers = archers; 
        } 

        public void DefendHelmsDeep(AttackType attackType) 
        { 
            if (attackType = AttackType.areApproachingTheWall) 
                 DefendUsing(_archers); 
        } 
} 
これはすべての良いと良いですが、ヘルム深さは、壁の中から来て、別の種類の攻撃の準備をしたいので、我々は何を行うか?次のif文を追加します.
else if (attackType = AttackType. penetratedTheWalls) 
                DefendUsing(_swordsmen); 
コードの各行が特定の戦術で深いヘルムズを守ることができるようにする準備の年であるならば、想像してください.あらゆる種類の状況のために設定するために深くヘルムのまわりに新しい線を加えなければならないことは困難です.山に突き刺されたあの大規模な構造はどんな戦闘にもなると変更の余地がない.我々がする必要があるすべての防御戦術のタイプを取るし、それを実行するには、これはすべてのヘルムズは、すべてのコストで守るために必要なニーズです!
私たちはIDefensiveTactic 実装されている実行メソッドを必要とするインターフェイス:
public interface IDefensiveTactic 
{ 
   void Execute(); 
} 
次に、このインターフェイスを実装しますArchersDefenceTactic またはSwordsmanDefenceTactic WHOはインターフェイスメソッドを実装しなければなりませんexecute . 我々は最終的にヘルムの深いクラスに来てDefendHelmsDeep メソッドIDefensiveTactic 引数とcall executeとして入力します.
public void DefendHelmsDeep (IDefensiveTactic defensiveTactic) 
{ 
   defensiveTactic.Execute(); 
} 
我々がここから見ることができるように、ヘルムズの深さはそれを擁護しているものを正確に知っていません、しかし、それはそれを攻撃しているものに対するあらゆる防御を歓迎します.🤬 「GAAAAATEのブレース」

Liskov置換
私が感じるのは、以下に示すように、王位継承によって簡素化されることです.
public abstract class King 
{ 
   public abstract void DoKingStuff(); 
} 

public class Thengel : King 
{
    public override void DoKingStuff() 
      => Console.WriteLine("doing Thengel the king stuff"); 
}

public class Théoden : Thengel 
{ 
    public override void DoKingStuff() 
      => Console.WriteLine("doing Théoden the king stuff"); 
} 
Théoden 彼のパパがAから来たので、王ですKing 彼らはすべて王の長い列から来て、最初の王は王のものをしなければならなかった.その結果、彼らから直接受け継がれている者はDoKingStuff キングスウェイ、同じ署名を使用します.この場合はThengel 誰が王から直接継承し、メソッドをオーバーライドすることを余儀なくされた.十分に.Théoden 彼らはすでにハードワークを行った彼らの父親から受け継いだので、何かをオーバーライドする必要はありませんしかし、彼らは同じメソッドを継承するので、そのメソッドの同じ出力を継承します.何が、ものが彼らの父の道をしたくなかった王に起こったことは何ですか?

界面分離
良いオールドGimliは、何も過去の何かをこっそりまたはリングを保持することができませんでしたファイトファイトの戦いの戦いはありません.私は、これがあらゆるキャラクタが特定の特性/機能で知られている点で、SRPに関連していると思います.legolasは、他のエルフのように、非常に物理的にフィットしている弓は、長いとがった耳があります.
私はすべての文字が1つのスーパー文字で包まれている場合は、この酒の名前を取得しているIMainCharacter , それは、映画を見てより退屈にするでしょう.この主人公は、多くの戦いに参加する必要はありません、こっけいなものの束を行う、木に話をし、魔法を行うし、洞窟の巨大なモンスターから自分自身を保存するが、彼らはすべての中にそれが無駄にされているすべての中に彼らの武器を持っている.これは次のようになります.
public interface IMainCharacter 
{
    void ExecuteMission(); 
    void ResistTemptation(); 
    void SaveMyself(); 
    void SneakPastStuff(); 
    void TalkToTrees(); 
    void Battle(); 
    void DoMagic(); 
    void DoArcheryStuff(); 
    void BeShortAndAngryWithAnAxeFor100Years(); 
} 
その代わりに、すべての文字が特定の特性を継承することができたということですICanSneak , ICanFight or ICanHoldTheRing 例えば.つの能力を持つ多くの文字が同時に、その能力の100 %を行うことができます(しかし、それぞれのためにいくつかあるので)が、すべての能力を持つ1つの主要な文字は、ほとんどすべてのそれらを使用しないでしょう.

依存性反転
この話はもう一つの方法があった.Mordorの間、リングの全フェローシップは確立されることができました.「私たちはサウロンについて議論しなければならないが、一度だけ我々はmordorになる」.それで、彼らはMordorのクラスの中を歩き、そこでミッションのインスタンスを初期化します.
public class Mordor 
{ 
    public void EnterAndExecute(Fellowship theFellowship) 
    { 
        theFellowship.DiscussSauron(); 
        theFellowship.ComeUpWithIdeaOfDestroyingRing(); 
        var mission  = new DropTheRingInPit(new Frodo()); 
        mission.ExecuteMission(); 
    } 
} 
だから😑... この例では、フェローシップは明らかにモーテルをコーヒーショップと考えて、物事について話すためにリラックスしています.しかし、ミッションが半分の方法(実行時に)を変更する必要がある場合、それだけではないときに、それはコンセプション中に(コンパイル時に)?
public class Mordor
{ 
    private readonly IMission _mission; 
    public MordorDIP(IMission mission) 
    { 
        _mission = mission; 
    }

    public void EnterAndExecute(List<IHobbit> hobbits) 
    { 
        _mission.ExecuteMission(); 
    } 
} 
ここでは、どのようにミッション、それが何であるかを見ることができます.我々は、我々がする必要があることを知っているmordorに入ります(ここの抽象化に依存する詳細).誰も、それを後で見つけるためにそこに入りません.私はホビットのリストを残して、そこでホビットが何をするかについて考慮するために_mission ラインは実行されます、すなわち、私はSmeagol(技術的にはHobbitsを生まれたレースからのものでした)はFrodoとリングについてSamwiseでしゃがんでいました.
私は常にプログラミングの概念を見て、実際の生活の中で映画やアイテムのシナリオに関連して、それは奇妙な私はそれのために奇妙にラベルを付けることができますが、ヘイホー何を行うことができます付与.私はあなたがこれを楽しんで、私は魅力的な方法であなたの時間を無駄にしてほしい😂 しかし、そうするために時間を割いていただき、ありがとうございます.
あなたが同意するならば、同意してください、そして、あなたが固い原理のうちの1つと共鳴するLOTRの他の部分を見ることができるならば、知らせてください!