モデル、ロゞック、OOP、開発、その他に぀いお

あなたはよく考えたす-なぜ䜕かが䜕らかの方法で行われたすか マむクロサヌビスたたはモノリス、2リンクたたは3リンクがあるのはなぜですか 倚局アヌキテクチャが必芁な理由ず、いく぀の局がありたすか ビゞネスロゞック、アプリケヌションロゞック、プレれンテヌションロゞックずは䜕ですか アプリケヌションを芋おください-どのように蚭蚈されおいたすか その䞭には䜕があり、どこにあるのですか、なぜこのようになっおいるのですか

それは本に曞かれおいるからでしょうか これたたはそのアプロヌチ/パタヌンはあなたのどの問題を解決したすか

䞀芋しお明らかなこずでさえ、説明するのが非垞に難しい堎合がありたす。 そしお時々、説明しようずしお、明らかな考えが完党に間違っおいたずいう理解がありたす。

いく぀かの䟋を取り䞊げ、これらの問題をあらゆる偎面から研究しおみたしょう。



おもちゃの町

仮想郜垂

この蚀葉でどれだけ固い...

サブゞェクト゚リア

プレれンテヌションロゞック

状態保存

階局化

2段

Nå±€

2ずしお3

サヌビス

ツヌル

理論ず実践

たずめ



おもちゃの町



小さなおもちゃの街を想像しおみたしょう。 それはいく぀かの建物で構成され、いく぀かの道路が通りたす。 車は道路を動き、人々は歩きたす。 亀通は信号機で芏制されおいたす。 垂内で起こるこずはすべお特定のルヌルの察象であり、この倚様性はすべお制埡できたす。



人や車を動かしたり、信号機を切り替えたり、昌や倜の時間を倉曎したりできたす。耇数の人が同時にこの郜垂ず察話できたす。 圌らは単に芋たり䜕かをしたりしお、郜垂を匷制的に倉化させるこずができたす。 これらはすべお完党に存圚したすが、おもちゃの街を仮想䞖界に移すこずが必芁になるずきが来たす。









街ず盎接亀流した人々は、今では怅子で快適になり、暗いモニタヌを芋぀め、片手でマりスを握り、もう片方をキヌボヌドに眮き、すべおが埩掻し、仮想郜垂が目の前の色で茝く瞬間を埅っおいたす。 しかし、これを実珟するには、長い道のりがありたす。



仮想郜垂



たず、最も重芁なこず-仮想郜垂のモデルを䜜成する必芁がありたす。 これは単玔なもののように思えるかもしれたせんが、実際、これは問題ず困難の倧郚分が存圚する堎所です。 しかし、ただ開始する必芁があるので、始めたしょう。



私たちの目暙は、郜垂モデルを仮想圢匏で蚘述するこずです。 このため、䞀般的な高レベルのオブゞェクト指向蚀語を䜿甚したす。 このような蚀語の䜿甚には、郜垂の仮想モデルを䜜成するための䞻芁な構成芁玠ずしおのオブゞェクトの䜿甚が含たれたす。



もちろん、 1぀のオブゞェクトでモデル党䜓を単玔に蚘述するこずもできたすが、これには䞍必芁な耇雑さず耇雑さが䌎いたす。 すべおが1か所に「ダンプ」され、どのように混同されおいるかが明確でない堎合、䜕が起こっおいるのかを理解するのが難しくなり、さらに倉曎を加えるこずが難しくなりたす。 したがっお、結果のプログラムを混乱させないために、簡単にするために、郜垂の説明を小さな郚分に分けたす。



そのような郚分ずしお、私たちは私たちの実際の郜垂を芋るずきに互いに簡単に分離されおいるものを取りたす-この郜垂の個々のオブゞェクト文化の家、亀差点の赀いBMW、圌のビゞネスに぀いお走っおいるペトロノィッチ。 仮想䞖界の各オブゞェクトの説明は、そのプロパティ色、モデル、名前、堎所などの説明です。 毎回同じオブゞェクトの同じプロパティを繰り返し蚘述しないために、そのようなプロパティのグルヌプを遞択し、それらをオブゞェクトのタむプず呌びたす 。 良い候補者は、車、家、人などの䞀般的なタむプです。 䞻なプロパティの説明を集䞭するこずができたす。 たた、たずえば、さたざたなタむプのマシンは、「マシン」の基本タむプを独自のプロパティセットで補完し、新しいタむプのセット党䜓を䜜成したす。 元の型に察するこのような新しい型は、 盞続人ず呌ばれたす。 そしお、プロセス自䜓は、 継承による既存のタむプに基づいた新しいタむプの䜜成です。









私たちが䜜成したすべおの皮類のオブゞェクトは、私たちの郜垂のモデルを衚しおいたす。



その埌、郜垂内の既存のオブゞェクトごずにこれらのタむプのむンスタンスを䜜成し、䞀意の倀を入力したす。



そしお、すべおがその堎所に眮かれおいるように芋えたす。車のグルヌプが緑の信号を埅っおいる亀差点に立っおおり、女の子のゞュリアが゚レベヌタヌを埅っおいたす。さらに、巚倧な超高局ビルのパむプの氎が凍りたした。 モデルをstateで満たし、特定の時点で実際の郜垂の状態を繰り返したした。



しかし、実際の郜垂をよく芋るず、垞に倉化しおいるこずがわかりたす。 状態のすべおの倉曎は、さたざたなオブゞェクトのプロパティ倀の倉曎、新しいオブゞェクトの倖芳、たたは叀いオブゞェクトの消倱です。 ここで、信号機が切り替わり、「珟圚の信号機」プロパティの倀が赀から緑に倉曎されたした 。 ここで、゚レベヌタヌは「Floor」プロパティの倀を2番目から1 番目に倉曎し、「Doors open」プロパティの倀をyesからnoに倉曎したした 。



これは、私たちの郜垂が生き返るには、プログラムがモデルの状態を倉曎できる必芁があるこずを意味したす。぀たり、さたざたなオブゞェクトのプロパティを倉曎したり、新しいオブゞェクトを远加したり、叀いオブゞェクトを削陀したりするこずができたす、぀たり 行動する 。



これを行うには、私たちの街で可胜なすべおのアクションをプログラムに远加したす。 このような各アクションは、オブゞェクトたたはオブゞェクトのグルヌプのプロパティを倉曎する手順ずしお説明できたす。 これらすべおの手順の説明の埌、それらの数が非垞に倧きいこずが明らかになりたす。 利甚可胜なすべおの手順のサポヌトず倉曎を簡玠化するには、それらをグルヌプに分ける必芁がありたす。 よく考えるこずなく、アクションの類䌌性に基づいおこのような手順をグルヌプ化し、䞀連のクラスを取埗できたす。各クラスは、同様のアクションのセットを担圓したす。



今ではすべおが分割され、非垞に芋栄えが良いように芋えたすが、1぀の「しかし」がありたす。 オブゞェクトのプロパティの説明は、これらのプロパティを倉曎し、モデルを貧血モデルに倉える手順ずは完党に分離されおいたす。 この分離により、オブゞェクトのプロパティがどのように倉化するかは完党に理解できたせん。 たた、あるプロパティの倉曎を他のプロパティの倉曎に関連付ける必芁がある堎合、たたは他のプロパティの倀に䟝存する必芁がある堎合、オブゞェクトの内郚構造に関するこの知識は、このプロパティを倉曎するすべおのプロシヌゞャで耇補する必芁がありたす。 これらの問題を回避するために、アクションごずにプロシヌゞャをグルヌプ化するのではなく、プロパティを倉曎するタむプにこれらのプロシヌゞャを分解したす。



これにより、他のナヌザヌが䜿甚するプロパティずメ゜ッドのみを公開しお、オブゞェクトの内郚構造に関する知識を隠すこずができたす。 仕事の内郚原則を隠すこのプロセスは、 カプセル化ず呌ばれたす 。 たずえば、゚レベヌタヌを耇数の階に移動したいずしたす。 これを行うには、ドアの状態を確認する必芁がありたす-開閉、゚ンゞンの始動ず停止など。 このロゞックはすべお、フロアぞの移動アクションの背埌に単玔に隠されたす。 その結果、オブゞェクトのタむプは、これらのプロパティを倉曎するプロパティずプロシヌゞャのセットであるこずがわかりたした。



䞀郚のプロシヌゞャは同じ意味を持぀堎合がありたすが、異なるオブゞェクトに関連付けられたす。 たずえば、「音声信号を発する」手順は、赀のBMWず青のラダにありたす。 内郚ではたったく異なる方法で実行できたすが、同じ意味を持ちたす。



すでに䞀般的なタむプの「マシン」があるため、「音声信号を発する」手順をそこに眮くこずができたす。 そのような動䜜のロゞックがすべおの人で同じであれば、同じ堎所で刀断できたす。 これにより、掟生型が簡玠化され、コヌドの重耇がなくなりたす。 しかし、突然、掟生型でそのような動䜜のロゞックが異なる堎合、動䜜を再定矩するこずで簡単に倉曎できたす。 この可胜性はポリモヌフィズムず呌ばれたす。



抜象化、継承、カプセル化、およびポリモヌフィズム-これらはOOPの喜びであり、これに続いおより柔軟なデザむンを䜜成できたす。 それらに加えお、目的が同じである特定の原則のセットがありたす-より柔軟な蚭蚈を䜜成するのを助けるために。



この蚀葉でどれだけ固い...



SOLIDは、オブゞェクト指向蚭蚈の有名な原則の略です。 この略語には、各文字に1぀ず぀、5぀の非衚瀺がありたす。



単䞀責任の原則 -各゚ンティティは、倉曎の理由を1぀だけ持぀必芁がありたす。



すべおの家の各郚屋でむンタヌネットず電気の䞡方を䜿甚するために、むンタヌネットず電線甚のコネクタを備えた単䞀のコンセントが䜜成されたした。



public class Socket { private PowerWire _powerWire; private EthernetWire _ethernetWire; public Socket(PowerWire powerWire, EthernetWire ethernetWire) { _powerWire = powerWire; _ethernetWire = ethernetWire; } ... }
      
      





このようなコンセントの操䜜には、むンタヌネット回線ず電線を䟛絊する必芁がありたした。 そしお、すべおの゜ケットが垞にむンタヌネットず電気の䞡方を䜿甚するわけではないが、コンパクトで䟿利であるずいう事実には䜕の問題もないように思えたす。 しかし、倉化の時が来るず、すべおがそれほど䟿利ではなくなりたす。



たず、むンタヌネットが䞍芁なアパヌトや建物党䜓がありたした。 絶察に。 しかし、゜ケットが゜ケットで機胜するためには、そこにもむンタヌネットワむダを匕き䌞ばす必芁があり、利益をもたらさずに䜜業コストが増加するだけでした。



その埌、゜ケットに接地甚の远加のワむダを装​​備する必芁があるため、むンタヌネット専甚の゜ケットも含めお、すべおの゜ケットを倉曎する必芁がありたした。 倧量の䜜業が行われたしたが、むンタヌネットのみに䜿甚される゜ケットが圱響を受けない堎合は、それよりも少ない可胜性がありたす。



 public class Socket { private PowerWire _powerWire; private EthernetWire _ethernetWire; private GroundWire _groundWire; public Socket(PowerWire powerWire, EthernetWire ethernetWire, GroundWire groundWire) { _powerWire = powerWire; _ethernetWire = ethernetWire; _groundWire = groundWire; } ... }
      
      





しかし、最埌のストロヌは芁件でした。すべおのむンタヌネットアりトレットのむンタヌネットワむダを新しい暙準に倉曎するこずです。 䞀般に、すべおの゜ケットは同時にむンタヌネット゜ケットでもあるため、すべおを再床倉曎する必芁がありたした。 むンタヌネットに䜿甚されるコンセントの数は、すべおのコンセントの数よりも数倍少ないため、䜜業量ははるかに少なくなりたす。



 public class Socket { private PowerWire _powerWire; private SuperEnthernetWire _superEnthernetWire; private GroundWire _groundWire; public Socket(PowerWire powerWire, SuperEthernetWire superEthernetWire, GroundWire groundWare) { _powerWire = powerWire; _superEnthernetWire = superEnthernetWire; _groundWare = groundWare; } ... }
      
      





すべおの堎合においお、いく぀かの完党に無関係な職務が1぀のオブゞェクトに䞀床に結合されたずいう事実により、たったく䞍芁な量の䜜業が行われたした。 そしお、これらの矩務にはそれぞれ、倉曎の理由がありたす。



このような問題を回避するために、コンセントは、互いに独立した2぀の郚分電気コンセントずむンタヌネットコンセントに分割する必芁がありたした。



 public PowerSocket { private PowerWire _powerWire; private GroundWare _groundWare; public PowerSocket(PowerWire powerWire, GroundWare groundWare) { _powerWire = powerWire; _groundWare = groundWare; } ... } public class EthernetSocket { private SuperEthernetWire _superEthernetWire; public EthernetSocket (SuperEthernetWire _superEthernetWire) { _superEthernetWire = superEthernetWire; } ... }
      
      





そしお、実際に電気ずむンタヌネットの䞡方のコンセントが必芁な堎合は、 集玄を䜿甚できたす。



 public PowerEthernetSocket { private PowerSocket _powerSocket; private EthernetSocket _ethernetSocket; public PowerEthernetSocket (PowerSocket powerSocket, EthernetSocket ethernetSocket) { _powerSocket = powerWire; _ethernetSocket = ethernetSocket; } ... }
      
      





オヌプンクロヌズの原則 -オブゞェクトは倉曎のために閉じられ、拡匵のために開かれなければなりたせん。



垂内䞭心郚の重芁な情報を人々に知らせるために、最も忙しい亀差点に倧きなスクリヌンが蚭眮されたした。 さたざたな゜ヌスからのメッセヌゞのテキストを衚瀺したした。



 public class Message { public string Text { get; set; } } public class BigDisplay { public void DisplayMessage(Message message) { PrintText(message.Text); } public void PrintText(string text) { ... } }
      
      





しばらくしお、新しいタむプのメッセヌゞが衚瀺されたした-日付を含むメッセヌゞ。 そしお、画面䞊のそのようなメッセヌゞに぀いおは、日付ずテキストの䞡方を衚瀺する必芁がありたした。 掗緎はさたざたな方法で実行できたす。

1.「メッセヌゞ」のタむプから掟生した新しいタむプを䜜成し、属性「日付」を远加しお、メッセヌゞを衚瀺する手順を倉曎したす。



 public class Message { public string Text { get; set; } } public class MessageWithDate : Message { public DateTime Date { get; set; } } ... public void DisplayMessage(Message message) { if (message is MessageWithDate) PrintText(message.Date + Message.Text) else PrintText(message.Text); }
      
      





しかし、この方法は、䜕らかの圢でメッセヌゞを衚瀺するすべおのタむプの動䜜を倉曎する必芁があるずいう点で悪いです。 そしお、将来、新しい特別なタむプのメッセヌゞがただある堎合は、すべおを再床倉曎する必芁がありたす。



2.「date」プロパティを「message」タむプに远加し、テキストの受信方法を倉曎しお、次のようにしたす。



 public class Message { private string _text; public string Text { get { if(Date.HasValue) return Date.Value + _text; else return _text; } set { _text = value; } } public DateTime? Date { get; set; } }
      
      





しかし、最初に、このメ゜ッドはメむンのタむプを倉曎しおそれに動䜜を远加する必芁があるずいう点で悪いです。 第二に、新しいタむプのメッセヌゞが衚瀺された堎合、すべおのメッセヌゞにはない別の属性を䜜成し、コヌドに䞍芁なチェックを远加する必芁がありたす。 第䞉に、日付付きのメッセヌゞの堎合、日付なしでメッセヌゞテキストを取埗する方法はありたせん。 そしお、そのようなニヌズの堎合-メッセヌゞのテキストを遞択する必芁がありたす。



3.新しいタむプをたったく䜜成せず、メッセヌゞが画面に衚瀺される方法を倉曎しないように、メッセヌゞテキストに日付をすぐに曞き蟌みたす。 ただし、メッセヌゞから日付を取埗するだけの堎所では、最初にこのメッセヌゞに日付が含たれおいるかどうかを確認しおから、メッセヌゞテキストから分離する必芁があるため、この方法は䞍適切です。



開攟性ず近接性の原則に埓うず、これらの問題をすべお回避し、4番目の方法に進むこずができたす。



 public class Message { public string Text { get; set; } public virtual string GetDisplayText() { return Text; } } public class MessageWithDate : Message { public DateTime Date { get; set; } public override string GetDisplayText() { return Date + Text; } } ... public void DisplayMessage(Message message) { PrintText(message.GetDisplayText()); }
      
      





このアプロヌチでは、「メッセヌゞ」の基本タむプを倉曎する必芁はありたせん- 閉じたたたになりたす。 同時に、その機胜を拡匵するこずもできたす。 さらに、他のアプロヌチに固有の問題はすべおなくなりたす。



リスコフ眮換の原則 -基本型を䜿甚する関数は、基本型のサブタむプを知らなくおも䜿甚できる必芁がありたす。



「自転車」タむプをプログラムに远加したら、もう1぀のタむプ、「モペット」を远加したす。 モペットは自転車のようなものですが、それだけです。 そのため、バむクはモペットのベヌスタむプずしお最適です。 すぐに蚀われ、プログラムには別のタむプの「モペット」がありたした-「自転車」のタむプに由来したす。



 public class Bicycle { public int Location; public void Move (int distance) { ... } } public class MotorBicycle : Bicycle { public int Fuel; public override void Move(int distance) { if (fuel == 0) return; ... fuel = fuel – usedFuel; } }
      
      





しかし、自転車ず比范するず、モペットには1぀の䞍快な機胜がありたす。ガ゜リンがなくなるず、モペットは移動できなくなりたす。 そしお、この䞍快な機胜をコヌドで考慮する必芁がありたした。 圌らはそれを考慮に入れたしたが、それを重芁芖したせんでした-このため、あらゆる皮類の特定の機胜を考慮するために、掟生型がありたす。



モペットは自転車よりも高速であるため、可胜であれば、自転車が以前に䜿甚されおいたプログラムで䜿甚され始めたした。 しかし、ある晎れた日、プログラムはtight萜したした。 ゚ラヌの怜玢は長くお苊痛でした。 問題は定期的か぀ランダムに繰り返されたした。 眠れぬ倜の説明を省略し、すぐにすべおの病気の犯人-サむクリストを互いに離れた2぀のポむント間で移動させる方法に目を向けたす。



 public void LongJourney (int to, Biker biker, Bicycle bicycle) { while(bicycle.location < to) { int distance = to - bicycle.location; if (distance > 1000) distance = 1000; bicycle.move(distance); biker.sleep(); } }
      
      





ガ゜リンが䞍足しおいるモペットが自転車ではなくメ゜ッドに転送されるず、そのようなアクションが明瀺的に呌び出された堎合でも、モペットがセンチメヌトルを進めなかったため、氞遠にハングしたす。 この問題を修正するために、もちろんそうするこずができたす



 public void LongJourney (int to, Biker biker, Bicycle bicycle) { while(bicycle.location < to) { int distance = to - bicycle.location; if (distance > 1000) distance = 1000; if (bicycle is MotorBicycle && bicycle.Fuel == 0) FillFuel((MotorBicycle)bicycle); bicycle.move(distance); biker.sleep(); } } public void FillFuel(MotorBicycle motorBicycle) { ... }
      
      





しかし、そのような倉曎を導入するには、倚数の手順を倉曎する必芁がありたす。これは、第䞀に、長い間、第二に、忘れるこずができ、そのような忘华が別のずらえどころのない問題に぀ながるずいう事実に満ちおいたす。 さらに、このような条件の远加は、抜象化のリヌクになりたす。 そしお、行動に圱響を䞎える他の芁因が出珟した堎合、これらの困難はすべお倍増したす。



実際、最初の問題は、倖郚の類䌌点がすべおあるにも関わらず、モペットは䞀皮の自転車ではないずいう事実にありたす。 したがっお、それらを共通の分母に持ち蟌もうずしおも、䜕も良い結果にはなりたせん。 モペットに぀いおは、自転車から独立した別のタむプを䜜成し、必芁なすべおの手順でこれを考慮する必芁がありたした。



むンタヌフェむス分離の原則 -クラむアントは、䜿甚しない方法に䟝存するべきではありたせん。



より珟実的にするために、1぀の興味深い動䜜が远加されたした。 人が道路䞊の間違った堎所に珟れた堎合、圌が停止しおいた車䞡は停止し、鳎り響くはずです。 これを行うために、メ゜ッドが実装されたした。



 public void CheckIntersect(Car car, People[] people) { ... if (Intersect(car, people)) { car.Stop(); car.Beep(); } } public bool Intersect(Car car, People[] people) { ... }
      
      





動䜜がチェックされ、自転車がシステムに珟れお高速道路に走った男にぶ぀かるたで、すべおが順調でした。 衝突チェックず自動停止は車に察しおのみ行われたため、これは驚くこずではありたせん。



最初のクレむゞヌなアむデアは、自転車を「マシン」タむプの掟生物にしたいずいう願望である可胜性がありたす。 結局、よく芋るず、手順は自転車のようにマシンのアクションのみを䜿甚し、悪いこずは䜕も起こりたせん。 しかし、これはこの方法でのみです。 そのような奇劙な掟生型が、マシン固有のものを䜿甚する他のプロシヌゞャに枡されるず、そのようなプロシヌゞャは必然的に壊れたす。



2番目のクレむゞヌなアむデアは、自転車ず人ずの衝突をチェックするための別の手順を䜜成するこずです。 しかし、その埌、すべおのロゞックが耇補されるこずがわかりたす。 さらに、新しい車䞡ごずにホテルプロシヌゞャを䜜成する必芁がありたす。 これはたったく柔軟性がありたせん。



しかし、衝突チェック手順で車䞡が持぀2぀のアクションのみを䜿甚する堎合、特定のタむプをメ゜ッドに枡すのはなぜですか



このメ゜ッドで䜿甚できるタむプに準拠する必芁があるコントラクトを定矩し、すべおのビヌクルに実装できたす。



 public interface IVehicle { ... void Stop(); void Beep(); } public class Car : IVehicle { ... } public class Bycycle : IVehicle { ... } public void CheckIntersect(IVehicle vehicle, People[] peoples) { ... if (Intersect(vehicle, peoples)) { vehicle.Stop(); vehicle.Beep(); } } public bool Intersect(IVehicle vehicle, People[] people) { ... }
      
      





次に、この方法では、既存のタむプの車䞡ず、契玄条件に埓っお将来登堎するタむプの車䞡を転送できたす。



䟝存関係の逆転の原則 -抜象化は詳现に䟝存すべきではありたせん。 詳现は抜象化に䟝存する必芁がありたす。



私たちの街にはニュヌス通知システムがありたす。 システムは重芁なニュヌスを受信し、郜垂のスピヌカヌシステムを介しおそれらを攟送したす。



 public class NotifySystem { private SpeakerSystem _speakerSystem = new SpeakerSystem(); public void NotifyOnWarning(string message) { _speakerSystem.Play(message); } }
      
      





すべお正垞に動䜜したすが、芁件は倉曎される傟向がありたす。 珟圚、スピヌカヌシステムではなく、携垯電話を介しおSMSずしおメッセヌゞを送信する必芁がある堎合がありたす。 もちろん、SMS経由で通知メッセヌゞを送信するための別のオブゞェクトを䜜成するこずもできたすが、そのためにはほずんどのロゞックを耇補する必芁がありたす。 これを回避するために、他の方法を䜿甚したす。 通知システムは、原則ずしお、メッセヌゞの衚瀺方法を気にしたせん。 最も重芁なこずはそれらを送信するこずです。 したがっお、これを行うこずができたす。



 public class NotifySystem { private IMessageDelivery _messageDelivery; public public NotifySystem(IMessageDelivery messageDelivery) { _messageDelivery = messageDelivery; } public void NotifyOnWarning(string message) { _messageDelivery.SendMessage(message); } }
      
      





通知システム内で䜿甚するメッセヌゞ配信システムのむンタヌフェむスを単に発衚したす。 そしお、このむンタヌフェヌスの実装は、通知システムを䜿甚したい人の肩にかかっおいたす。 実際、私たちは消費者にずっお䟿利なように拡匵できるような行動パタヌンを䜜成しおいたす。



-そしお、これらのすべおの原則に煩わされず、どのようにコヌドを曞くこずも可胜でしょうか

-もちろん

「それでも同じように機胜したすか」

-圓然

-では、なぜこれらすべおの困難をOOP、OODの圢で䜿甚する必芁があるのですか これらすべおの困難に぀いお考えなければ、プログラムをもっず早く曞くこずになりたす そしお、曞く速床が速いほど良い

-プログラムが十分に単玔であり、゚ラヌのさらなる開発、修正、たたは修正が予想されない堎合、原則ずしおこれはすべお䞍芁です。 しかし プログラムが耇雑な堎合は、それを完成させおサポヌトする予定です。これらの「䞍必芁な困難」をすべお䜿甚するず、最も重芁なこず、぀たり改善ずサポヌトに費やされるリ゜ヌスの数、぀たりコストに盎接圱響したす 。



これらのすべおのルヌル、パタヌン、パラダむムは、コヌドをモゞュヌル化、柔軟、容易に拡匵可胜、および倉曎に耐えられるようにするずいう1぀の基本的な考え方によっお統䞀されおいたす。 原則ずしお、このような小さく疎結合されたモゞュヌルの動䜜を倉曎する方が、すべおが混圚しおいる倧きなモゞュヌルの動䜜を倉曎するよりも安䟡です。



サブゞェクト゚リア



「悪いアルゎリズムのコストが1,000ドルである堎合、悪いアヌキテクチャのコストは100䞇ドルになるこずを忘れないでください。」



それでも、䞊蚘で説明したこずはすべお、基本的に技術的な問題の解決策です。 OOP、OODの抂芁、それらの利点、およびそれらの䜿甚方法に぀いおは、すでに䜕十幎も蚈画されおいたす。 たずえば、SOLIDなどの2、3のキヌワヌドを操䜜しお、倚くの説明情報を取埗するだけで十分です。



問題が非垞に䞀般的であり、その解決のために䜕らかのアルゎリズムを必芁ずする堎合、ほずんどの堎合、すでに存圚しおいる可胜性がありたす。 怜玢゚ンゞンでのいく぀かのク゚リ、たずえば、「 茪になったワゎンを数え、解決策 」ず、目の前にある䜕癟もの結果。



しかし、ロゞックをモゞュヌルずサヌビスに正しく分割するには、技術的な知識だけでは䞍十分であり、怜玢゚ンゞンはここでは圹に立ちたせん。 䞻題分野をよく理解する必芁がありたすが、これは既に問題になっおいたす。プログラミングずはたったく関係のないこずを孊ぶこずに倚倧な努力を払う必芁があるからです。 そのため、開発者は技術的な問題を解決するこずを奜み、アナリストに頌っおビゞネス䞊の問題を解決したす。 しかし、アナリストはプログラムの内郚構造を認識しおいたせん。内郚構造はビゞネスの構造を反映しおいたせんが、この構造に関する開発者のアむデアを反映しおいたす。 そしお、この芋解が珟実から遠ざかるほど、この構造は、ビゞネスで発生した倉化に合わせお倉曎するこずがより難しくなりたす。



これも問題の二重の解釈によるものです。 最初に、アナリストはアプリケヌションで远加たたは倉曎する必芁があるものを理解しようずし、ビゞネスナヌザヌず通信したす。 その埌、圌はこの知識を開発者に自分の蚀葉で䌝えようずしたす。 その結果、真実が歪められ、これらすべおの歪みが最適なプログラム構造ではなくなる可胜性がありたす。



ナヌザヌは、すべおが芋えるように、日光が家の郚屋の日光に入らないようにずいう願いを衚明したした。 開発者は、考え盎すこずなく、壁の䞞い穎をくりぬいお確認したした。光がただ足りないこずがわかりたした。 その埌、開発者は近くの2぀の穎をくりぬき、再床確認したした。 十分な光があるこずを確認した埌、開発者はタスクが完了したず刀断したした。 この原則によれば、すべおの家に穎が空いおいたした。 芁件は満たされたした。

しかし、倏が終わり、冬が来お、それで寒さが倉わりたした。 怒ったナヌザヌは走り始め、郚屋がひどく寒くなったこずを誓い始めたした。 理由を明確にするず、日光の䞋で穎が開いたために、通りから倚くの冷たい空気が郚屋に入り、凍結するこずが明らかになりたした。 状況を明確にした埌、ナヌザヌは普通のりィンドりを望んでいたこずがわかりたしたが、いく぀かの芁件に぀いお蚀及するのを忘れ、アナリストは自分のやり方で䜕かを䞎え、䜕が起こったのかがわかりたした。 すべおが凍結されたため、倖出先で問題を解決する必芁があったため、良い窓を開発したり、冬に窓の穎を䜜り盎したりする時間はありたせんでした。 そのため、「束葉杖」ず仲良くしお、穎をポリ゚チレンで塞ぐこずにしたした。 この方法は、激しい凍結を取り陀くのに圹立ち、午埌には日光を残すこずができたした。 しかし、初期芁件の䞍完党な理解がもたらす新しい問題の数を誰が知っおいるのか...



開発のすべおの参加者の間でこの問題を解決するために、䜕が起こっおいるのか、そしお䜕のためにそれが必芁であるのかに぀いおの共通の平等なアむデアが開発されるべきです。 これには党䜓的なアプロヌチがありたす。 ドメむン駆動蚭蚈の目的は、開発のすべおの参加者間で共通の理解ず共通の甚語共通蚀語を開発するこずです。



モデルに察する䞍十分な理解は、開発者が技術的な問題を解決するために、開発者がより身近で理解しやすいこずをしようずするずいう事実に぀ながりたす。 玔粋に技術的な方法でビゞネス䞊の問題の解決を含みたす。 そしお技術的な問題がない堎合-圌らの発明ず圌ら自身の英雄的な解決策。 これはすべお、プログラム内の奇劙で䞍明瞭な構造の出珟に぀ながるだけです。 䞀方、開発者がIpoteka Driven Developmentに埓う堎合、これは意識的な遞択かもしれたせん。



しかし、OODの原則やその他の抜象的なトピックに関する短い旅行を終えお、プログラムに戻る時が来たした。 モデルにビゞネスロゞックを远加するず、凍結した郜垂のスナップショットだけでなく、本栌的なモデルが埗られたした。 実際のモデルの状態ず同じ方法で簡単に状態を倉曎できるモデル。



プレれンテヌションロゞック



私たちのすべおの成功にもかかわらず、ナヌザヌは絶滅したモニタヌの前でむラむラしお埅ち続けおいたす。 私たちは郜垂のモデルを䜜成し、そこに生呜を吹き蟌み、その倉化の論理を蚘述しお、非垞に重芁な仕事をしたした。 今、私たちはナヌザヌに私たちがやったこずを「芋る」機䌚を䞎える必芁がありたす。これを行うには、ナヌザヌず察話するようにアプリケヌションを教える必芁がありたす。たず、ナヌザヌは自分の郜垂で䜕が起こっおいるのか、車がどのように動くのか、倜窓がどのように点灯するのか、人々がどこぞ飛び出すのかを芋たいず思っおいたす。そしお次に、圌は街に圱響を䞎えたいず思っおいたす-信号機を切り替え、昌倜を倉え、新しい家を䜜りたすなど。



しかし、党䜓を党䜓ずしおカバヌするこずは、単玔な堎合にのみ可胜です。モデルが耇雑な堎合、画面䞊に完党に衚瀺し、さらに理解するために、それは難しいだけでなく、ほずんど䞍可胜になりたす。耇雑さに察凊する最善の方法は、これから行うように、耇雑さをより単玔な郚分に分割するこずです。モデルの状態を郚品で衚瀺したす。最も重芁なこずは、これらの郚品を正しく識別するこずです。そのような各郚分は、できるだけ自絊自足でなければなりたせん。いく぀かの有甚な情報を理解したり、倉曎に関しお必芁な決定を䞋したりするのに十分です。したがっお、ナヌザヌのタスクに応じお状態をパヌツに分割し、それらをナヌザヌに衚瀺しようずしたす。



たずえば、亀差点の信号機を調敎したす。これを行うために、私たちはどの家が立っおいるか、人々が働いおいるか䜏んでいるか、青信号を埅っおいるか、街の反察偎で䜕が起こっおいるかを知る必芁はありたせん。決定を䞋すために必芁なのは、十字架ずその䞊にあるものに関する情報だけです。車の数ず車線の数、暪断歩道で䜕人の人が埅っおいるか、信号機の信号は䜕ですか。このタスクのコンテキストでの亀差点は、他のオブゞェクト車、信号機、人が接続されおいるルヌトオブゞェクトです。たずえば、郜垂の亀通流党䜓を管理するなどの別のタスクの堎合、亀差点は別のルヌトオブゞェクト郜垂党䜓の茞送むンフラストラクチャの䞀郚になりたす。



ナヌザヌの画面に亀差点の状態を衚瀺するず、実際には、プログラムにアクセスしたずきの圌の「写真」が衚瀺され、ナヌザヌはそれを調べお決定する機䌚が䞎えられたす。ナヌザヌは、この「写真」をあらゆる角床から研究し、自分に圹立぀䜕かを孊ぶこずができたす。この知識に基づいお、圌はモデルの状態の倉曎に぀いお決定を䞋すこずができたす。これを行うために、圌は、䟋えば、亀通信号を切り替えるこずができたす。もちろん、写真はフリヌズせずにアニメヌション化するこずもできたす。定期的に倉曎し、発生した倉曎を衚瀺したす。ただし、最新のステヌタスが衚瀺される保蚌はありたせん。



実際のモデルを仮想モデルに転送する過皋で、それはパラメヌタずその倀の非人間的なセットに倉わりたした。そしお、あなたの心が望むずすぐに、このデヌタセットはねじれ、倉換されたす。したがっお、クロスロヌドは、モデルの他の郚分ず同様に、さたざたな方法で衚瀺できたす。そしお、それらすべおが䜿いやすいわけではありたせん。この利䟿性は、ナヌザヌの意思決定のスピヌドず品質に衚れたす。



たずえば、亀差点の状態をいく぀かのリストの圢匏で画面に衚瀺できたす。䞀方では、珟圚走行䞭のすべおの車をリストし、もう䞀方では-亀差点にいる人々をリストしたす。リストに加えお、信号機ず亀差点の名前ず座暙を含むいく぀かのテキストフィヌルドを衚瀺するスむッチのセットが画面に衚瀺されたす。









たたは、亀差点を人にずっおより䟿利な方法で衚瀺できたす。実際のモデルに芋えるように亀差点を描き、車や人を眮き、信号機を描きたす。角のどこかに、亀差点の䜍眮を瀺すアむコンずずもに、郜垂のミニマップを衚瀺したす。明らかに、2番目のケヌスでは、状態の認識がはるかに䟿利で高速になりたす。どちらの堎合でも、画面には同じデヌタが衚瀺されたす。









プログラムの残りの郚分でも同じです-デヌタを画面に衚瀺するだけでなく、できるだけ䟿利で理解しやすいものにするこずが非垞に重芁です。



そしお、Microsoft HoloLensのようなものを䜿甚する堎合、䞀般的に、仮想郜垂を珟実のように衚瀺したり、さらに䟿利にしたりできたす。



状態保存



, , .

— – .

— – .

. . — , – . , 





もちろん、私たちの䞖界は完璧ずはほど遠いものであり、コンピュヌタヌは継続的に動䜜するこずはできたせん。さらに、コンピュヌタヌのRAMは、モデルのすべおの状態をメモリに保持するのに十分ではない堎合がありたす。したがっお、コンピュヌタヌのシャットダりンに耐えられるように状態を維持するこずは、ほずんどのプログラムの重芁な芁玠です。たた、モデルのすべおのオブゞェクトが同時に倉曎されるこずはないため、通垞は垞に保存状態を維持し、小さな郚分で保存状態から埩元しお、必芁な倉曎を衚瀺たたは倉曎できたす。その埌、新しい状態を安党に保存できたす。



状態を保存するには、さたざたな方法がありたす。䜕らかの圢匏でファむルを保存したり、ディスクたたはUSBフラッシュドラむブに曞き蟌んだり、特別なストレヌゞシステムを䜿甚したりできたす。珟時点で最も䞀般的な方法は、このためにデヌタベヌスを䜿甚するこずです。珟圚最も人気のあるのはリレヌショナルデヌタベヌスです。



ホむヌルを再発明せず、RDBMSを䜿甚しおモデルの状態を維持する問題を解決したせん。デヌタの保存ず取埗の利䟿性に加えお、さたざたな制限を䜿甚しお実装されるデヌタ敎合性制埡などの远加の䟿利な機胜を提䟛したす。たた、デヌタベヌスは保存時のさたざたな障害から保護し、倉曎された状態を郚分的にしか蚘録できないため、砎損状態になりたす。



デヌタベヌスでは、すべおの情報はテヌブルに保存されたす。原則ずしお、オブゞェクトの各タむプには独自のテヌブルがありたす。たた、この衚のオブゞェクトの各プロパティには列がありたす。そのため、あるタむプのむンスタンスを保存するには、適切な列セットを䜿甚しお、そのむンスタンスに適したテヌブルを䜜成する必芁がありたす。



テヌブルの必芁な構造をすべお説明したので、安党性を心配しないように、最終的にデヌタベヌスに状態を保存できたす。ただし、このためには、これらのテヌブルを䜿甚しお状態を保存およびロヌドするこずをアプリケヌションに教える必芁がありたす。これを行うために、完成したツヌルをORMの圢匏で取埗し、デヌタベヌス内のタむプずテヌブル間のマッピングを説明したす。タむプがそれほど倚くない堎合、たたはサヌドパヌティのツヌルを䜿甚したくない堎合、たたは䜿甚できない堎合は、他の 方法がありたす。



保存する別の興味深い方法は、モデル自䜓の状態を保存するのではなく、この状態を倉曎したアクションを蚘述するこずです。䞀連の動きずしお、デヌタベヌス内のやり盎しログたたはチェスの詊合の蚘録に䌌おいたす。このアプロヌチは、むベント゜ヌシングず呌ばれたす。



-聞いお。デヌタを保存するための構造を䜜成し、それらに制限、トリガヌ、テヌブル間の関係などを远加するこずがわかりたした。アプリケヌションサヌバヌ䞊のモデルに既に存圚するビゞネス䞊の制玄を耇補したすか

-そのようになりたす。

-耇補が悪いこずを知るたびに、それが耇補されたこずが刀明したした。うヌん...




階局化



プログラムを慎重に䜜成し、異なるアクションを混圚させないようにしたため、最終的に、いく぀かの異なるロゞックレむダヌがありたした。



ビゞネスロゞック


これは、モデルの状態を倉曎するプログラムロゞックの䞀郚です。倉曎を行うために満たさなければならない条件ず、倉曎自䜓に぀いお説明したす。圌女はモデルを知っおおり、利甚可胜です。



プレれンテヌションロゞック


これは、モデルの状態ず䜿甚可胜なアクションをナヌザヌに衚瀺するプログラムのロゞックです。圌女は、衚瀺する必芁があるモデルず呌び出すこずができるビゞネスロゞックを知っおいたす。



デヌタアクセスロゞック


これは、モデルの状態を保存およびロヌドする方法を知っおいるプログラムのロゞックです。圌女はモデルず、デヌタベヌスからのデヌタをどのように取り蟌むこずができるかを知っおいたす。



アプリケヌションロゞック


これは、接着剀のようにすべおを結び付けるロゞックです。圌女はビゞネスロゞック、デヌタアクセスロゞック、およびプレれンテヌションロゞックに぀いお知っおいたす。圌女はそれらを結び぀け、助け、お互いの盞互䜜甚を確立したす。



この分離に準拠するず、アプリケヌションの倉曎が簡単になりたす。レむダヌの盞互理解が少なく、ロゞックが盞互に隠されおいるほど、倉曎が容易になりたす。実際、プレれンテヌションロゞックの違いは䜕ですか、モデルの状態はどこにどのように保存されたすかたた、その逆に、デヌタストレヌゞのロゞックずの違いは䜕ですか、このデヌタはむンタヌフェむスでどこでどのように衚瀺されたすか結局のずころ、それらを衚瀺するにはいく぀かの方法があり、それらは互いに倧きく異なる可胜性がありたす。同時に、モデルは、アプリケヌションがその状態を保存する方法や、この状態が画面に衚瀺される方法を気にしたせん。他のレむダヌはプログラムの䞭心郚分であるため、モデルたたはビゞネスロゞックの倉曎のみが他のレむダヌに圱響を䞎えたす。











2段



— ! – . – !

— , , . – .

— 
 – . — , .

— , – . – , .., , .

— ? – . – , , .

.




互いの倉曎を確認するには、ナヌザヌはモデルの同じ状態で䜜業する必芁がありたす。モデルの状態はデヌタベヌスに保存されるため、これはナヌザヌが共通のデヌタベヌスを䜿甚する必芁があるこずを意味したす。原則ずしお、すべおのナヌザヌのプログラムがアクセスできる別のコンピュヌタヌに配眮されたす。



これで、同時に耇数のナヌザヌがモデルの同じ状態を芋お倉曎できたす。しかし、別の問題が登堎したした- 競争アクセスの問題です。さたざたな方法で解決できたす。最も䞀般的な方法は、リ゜ヌスに倉曎を加える前に、リ゜ヌスをロックしおアクセス専甚にするこずです。これを䜿甚したす。これを行うには、プログラム党䜓を泚意深く調べ、ロックを远加する必芁がある堎所を理解する必芁がありたす。



タスクが少数のリ゜ヌスを短時間ロックする必芁がある堎合に適しおいたす。倧量のリ゜ヌスをブロックし、長時間これを行う必芁がある堎合、それは悪いこずです。そのような堎合、別のアプロヌチを詊すこずができたす。



プログラムを2台のコンピュヌタヌに物理的に分割した埌、クラむアントサヌバヌ2局アヌキテクチャを取埗したした。







この物理的な分離は、さらに技術的な問題を远加したす。たず、ネットワヌク接続が切断される可胜性があり、これは远加の障害ポむントになりたす。これは、ネットワヌクの切断たたはサヌバヌのアクセス䞍胜゚ラヌを正しく凊理するために、アプリケヌションを開発する際に考慮する必芁がありたす。



第二に、ネットワヌクを介したデヌタ䌝送にはより倚くの時間が必芁であり、これも考慮する必芁がありたす。䞀方では、デヌタ取埗を高速化するために、デヌタをクラむアントにキャッシュできたす。䞀方、倉曎は継続的に送信されるのではなく、タスクの䞀郚ずしお蓄積され、単䞀のリク゚ストで送信されたす。



Nå±€



-そしお、私がタブレットから街を制埡するのはただ普通です。なぜなら、私が仕事から家に垰る間、圌が䜕かを数える前に眠りに萜ちるような耇雑な蚈算があるからです。 -ナヌザヌの䞀人に尋ねた。

-そしお、すべおのアクションにアクセスできるわけではない新しいナヌザヌが必芁です。 -別のナヌザヌが蚀った。

開発者の目には銎染みのある倖芳が登堎したした...




新しい問題を解決するには、プログラムのビゞネスロゞックをナヌザヌコンピュヌタヌから、この専甚のコンピュヌタヌ通垞はアプリケヌションサヌバヌず呌ばれるに転送する必芁がありたす。



レむダヌぞの論理のきちんずした分割は、私たちの手にかかっおいたす。プレれンテヌションロゞックずビゞネスロゞックは既に完党に分離されおいたため、残されたのはそれらを物理的に分離し、それらの盞互䜜甚のための远加のアプリケヌションロゞックを䜜成するこずだけでした。私たちのシッククラむアント倧幅にビゞネスロゞックを含んで、「シンナヌ」ずなるシンクラむアント。



短所ずしお、クラむアント/サヌバヌアプロヌチの堎合のように、ネットワヌクの問題の可胜性ず、ビゞネスロゞックずプレれンテヌションロゞックの物理的な分離によるアプリケヌションの速床の䜎䞋が远加されたす。さらに、倉曎には倉曎がより困難になるずいう事実が含たれたす。デヌタ転送に必芁なコヌドを含む、より倚くのコヌドに圱響したす アプリケヌションサヌバヌずクラむアントの間。









2ずしお3



実際、䞊蚘の問題を解決するために、3局アヌキテクチャを䜿甚する必芁はありたせん。2局アヌキテクチャでこれらの問題を解決するには、ビゞネスロゞックをデヌタベヌスに移動しお、クラむアントを薄くしたす。このアプロヌチには長所ず短所がありたす。



特筆すべきは、ビゞネスロゞックずモデルの状態が物理的に分離されおおらず、速床ずフォヌルトトレランスの䞡方にプラスの効果があるこずです。マむナスのうち、デヌタベヌスで最も重芁なこずは、ビゞネスロゞックをサポヌトするのではなく、デヌタを保存および取埗できるこずです。したがっお、可胜性の蚀語が、䜿甚したすデヌタベヌスでは、最新の高レベル蚀語よりも機胜が劣っおいたす。たた、倚皮倚様なフレヌムワヌクを䜿甚する通垞の機胜はありたせん。これらはすべお、柔軟なコヌドを曞く胜力ずコストに圱響したす。



もう1぀の欠点は、スケヌリングする胜力です。負荷の高い操䜜に察応するアプリケヌションサヌバヌのスケヌリングは、デヌタベヌスよりも簡単です。これらの偎面を考慮するず、ビゞネスロゞックに個別のリンクをアプリケヌションサヌバヌずしお䜿甚する方が、デヌタベヌスに保持するよりも安䟡であるこずが倚いこずがわかりたす。









サヌビス



— - . – , – , – . – - , ? – .

— – – , ? – .





最初の段階で十分な時間を費やし、察象分野を十分に理解しおいたため、サヌビスのグルヌプを遞び出すこずができたした。たずえば、亀通制埡サヌビス、゚ネルギヌ管理サヌビス、たたは建物管理サヌビスです。これらのサヌビスはすべお仮想郜垂の䞀郚ですが、ほずんど接続されおおらず、ほずんど接続されおいたせん。したがっお、プログラムコヌドは同じ方法で蚘述され、サヌビスごずに分類されおいたす。これを実珟するために、各サヌビスに必芁なパブリックメ゜ッドセットを特定し、他のすべおを隠しおいたす。したがっお、サヌビスを「ブラックボックス」に倉えたした。これは、メ゜ッドアクセス修食子、むンタヌフェむス、抜象クラスなどのさたざたな蚀語ツヌルを䜿甚しお簡単に実珟できたした。









接続性が䜎いため、ほずんどの堎合、これらのサヌビスはすべお互いに独立しお倉曎できたす。しかし、なぜなら物理的には、これらのサヌビスはすべお1぀のプログラムであり、そのような倉曎をクラむアントが個別にむンストヌルするこずはできたせん。サヌビスが頻繁に倉曎され、そのような倉曎をできるだけ早くクラむアントにむンストヌルする必芁がある堎合、これはあたり䟿利ではありたせん。他のサヌビスに匷制的に䟝存しおいるため、避けたいず思いたす。



この問題に察凊するために、プログラムを物理的にいく぀かの郚分に分割したした。このような物理的な分離は、さたざたなファむルラむブラリぞのサヌビスの割り圓おです。これにより、プログラムを耇数のファむルメむンの実行可胜ファむルず䞀連のラむブラリに分割できたした。



この物理的な分離により、サヌビスを個別に曎新するこずが可胜になりたす。これは、サヌビスラむブラリの単玔な眮き換えです。サヌビスは物理的に分離されおいるずいう事実にもかかわらず、非垞に䟿利なアプリケヌションの䞀般的なロゞックを匕き続き䜿甚し、同じプロセスに存圚したす。これにより、単䞀のアプリケヌションのすべおの機胜を䜿甚できたす。さらに、この明瀺的な分離により、䞀郚の開発者は特定のサヌビスでのみ䜜業できたす。











プログラム党䜓の「クラッシュ」を回避するために、サヌビスの動䜜䞭に発生するさたざたな゚ラヌを凊理するメカニズムをプログラムに远加したす。これにより、䞀郚のサヌビスが倱敗しおもプログラムは動䜜し続けたす。



ただし、そのような安定性が十分でない堎合は、サヌビスを異なるプロセスに分割できたす。これを行うには、アプリケヌションロゞックを倉曎しお、プロセス間通信を䜕らかの䟿利 な方法でサポヌトする必芁がありたす。



このアプロヌチの利点は、個々のサヌビスごずに独自のテクノロゞヌセットを䜿甚できるこずにも起因したす。もちろん、これは開発者にずっお玠晎らしい逌です。ただし、この堎合、開発者の互換性がなくなり、欠点になる可胜性がありたす。



同様の堎合のように、このアプロヌチの欠点には、盞互䜜甚の速床の䜎䞋に関連する問題や、プロセス間でのデヌタ転送の䞭断の可胜性が含たれたす。たた、ビゞネスロゞックを分離するず、たずえば分散トランザクションを䜿甚するなど、耇数のサヌビスを同時に含むタスクでデヌタの敎合性を維持する必芁があるずいう圢で、远加の問題が生じるこずもありたす。









-聞いお、なぜ圌らはこれらのマむクロサヌビスでそんなに摩耗しおいるのですか

「開発者は、ビゞネスロゞックを物理的に分離するず、疎結合で簡単に亀換可胜な安定したモゞュヌルを䜜成できるず考えおいたす。

「䜕かが以前にそれらを悩たせおいたかのように...




物理的な分離はいく぀かの技術的な問題を解決したすが、代わりに他の問題をもたらしたす。」もちろん、最初の技術的な問題を解決する必芁がありたすが、それらを解決する利点が新しい問題の出珟の欠点を超えるかどうかを垞に怜蚎する䟡倀がありたす。



プログラム郚分の物理的な分離が発生するたびに、この分離を隠すむンフラストラクチャ局を実装する必芁がありたす。はい、技術的な芳点から蚀うず、このようなむンフラストラクチャの䜜成はもちろん、玔粋に技術的な興味深い䜜業であるため、プログラマは喜んでそれを匕き受けたす。しかし、これで問題が実際に解決されない堎合、利益をもたらすこずなく、プログラムのコストず耇雑さを増加させるだけです。



ツヌル



-そしお、なぜ、デヌタベヌスに通垞のク゚リを䜜成する代わりに、䞡方のテヌブルをアプリケヌションサヌバヌにプルし、それらを英雄的に結合し、結果をフィルタリングしお必芁なデヌタを取埗したすか

-手にハンマヌしか持っおいない堎合、すべおのタスクは釘のように芋えたす。




蚀語、ラむブラリ、フレヌムワヌク、ナヌティリティ-これは、開発者が䜜業の過皋で䜿甚するものすべおです。これはすべお、技術的な問題を解決するコストを最小限に抑えるために必芁であり、プロゞェクトに固有のビゞネス䞊の問題を解決するための時間をより倚く残したす。したがっお、劎働生産性に盎接圱響するため、ツヌルの正しい遞択が重芁です。倧ざっぱに蚀えば、あなたはのこぎりで半日の間䜕かを切るこずができたす、たたは、あなたは電気ゞグ゜ヌをずるこずができたす-匷打しお、あなたは終わりたした



ツヌルはさたざたであり、さたざたな目的に合わせお蚭蚈されおいるため、それらの正しいアプリケヌションも同様に重芁です。もちろん、クロヌバヌで釘を打぀こずは可胜ですそしお、これは拳よりも䟿利ですが、それでも、ハンマヌほど簡単で䟿利ではありたせん。



しかし、開発者の間では、「ここで発明されおいない」ずいう非垞に悪いシンドロヌムがありたす。その意味は、特定の範囲のタスクを解決するための既補のツヌルを䜿甚する代わりに、開発者が独自の発明を開始するずいうこずです。これは、独自のプラットフォヌムを䜜成したいずいう芁望に最も匷く珟れたす。



このようなツヌルの䜜成は玔粋に技術的なタスクであり、ビゞネスの䞻題分野を理解する必芁がないため、開発者はこれを行うのが倧奜きです。しかし、開発者がビゞネス䞊の問題を解決するこずを目的ずする堎合、逆に、サヌドパヌティのツヌルを䜿甚するこずで、圌の人生は楜に簡玠化されたす。



理論ず実践



理論的には、理論ず実践はたったく同じです。実際には、ありたせん。



理論的には、もちろん、すべおが矎しいですが、実際には、すべおが完党に間違っおいたす。技術的知識、ドメむン知識、時間、たたは人の䞍足-これらはすべお、コヌドに望たしくない問題が珟れ、プログラムの品質に圱響を䞎えたす。



実際には、開発者はしばしば品質ず速床の劥協に盎面したす。顧客を満足させ、玍期を守ろうずするず、急いですべおを行うこずになりたす。これは、最終的には逆の効果をもたらしたす。急いで問題を解決するず、悪い解決策を䜜成せざるを埗なくなり、最終的には倧きな雪だるたのように蓄積しお、プロゞェクト党䜓をあなたの䞋に埋めようずしたす。そのため、サポヌトず修正のコストはさらに高くなり、特に同じ倉曎のコストが高くなった理由を顧客に説明する際に、問題を悪化させるだけです。



このような悪い決定はどのプロゞェクトでもほずんど避けられないため、リファクタリングの時間を芋぀けるこずが非垞に重芁です。







たずめ



結局、すべおはお金に垰着し​​たす。開発ずサポヌトのコストが安いほど、プログラムを䜜成するこずの収益性は高くなりたす。したがっお、すべおのアプロヌチ/ツヌル/テンプレヌト/パラダむムなど 開発ずサポヌトプロセスのコストを削枛するずいう1぀のこずに焊点を圓おおいたす。



しかし、開発も創造的なプロセスです。信じられないほど倚数のパスが同じ問題を解決するこずになり、それぞれに長所ず短所がありたす。



そしお、開発者だけがこのパスがどれほど良いかを刀断したす。したがっお、゜フトりェア開発では、人が最も重芁なリ゜ヌスです。



All Articles