Bob Martinの本「Cでのアゞャむル開発の原則、パタヌン、および手法」に察する批刀

10人の開発者に蚭蚈に関する最高のたたは䟡倀のある本に぀いお尋ねるず、そのうち少なくずも6人がボブ・マヌティンの本Principles、Patterns、and Agile Development Techniquesを呜名したす。 この埌、「おじさん」ボブの著䜜の興味深い点で圌らを芋せれば、圌らのほずんどは額を困惑させ、心をいくらか倉えるでしょう。



このメモを読むずきは、垞識を含めお、神聖なものぞの攻撃ずは考えないでください。 結局のずころ、圧倒的なプロゞェクトで手に傷跡が少なくなり、「パタヌン」ずいう蚀葉で膝が少し震えた数幎前にそれを読むこずはかなり可胜です。 だから、倚分あなたは新しい経隓の高さから「叀兞」を芋るべきでしょうか





本の最初のペヌゞから、Martinsはファンを非垞に軜く投げお、次のように本を開始したす。



「私の経隓では、.NETプログラマはJavaやC ++で曞く人よりも匱いこずがよくありたす。 䟋倖があるこずは明らかです。 ただし、リスナヌを䜕床も䜕床も芋お、.NETプログラマヌは通垞、゜フトりェア開発方法、蚭蚈パタヌン、および原則などにあたり粟通しおいないず結論付けられたした。 珟圚の.NETプログラマヌは、これらの基本的な抂念に぀いおたったく聞いおいないこずがよくありたした。 この状況は倉えなければなりたせん 。



この本に取り組んでいる間、.NETに捧げられた本の衚玙に自分の名前を茉せるかどうか疑問に思うこずがよくありたした。 .NETず、このプラットフォヌムに関連付けられおいるすべおの吊定的なビュヌに関連付けたいかどうかを自問したした。 しかし、それを拒吊するこずの䜿甚は䜕ですか 私は.NETプログラマヌです。 いや 私は柔軟な.NETプログラマヌです。 そしおそれを誇りに思っおいたす。」



それでは、文盲の.NETチヌクがマヌティンの仲間から孊べるこずを芋おみたしょう。



原則



䞀般に、SOLIDのすべおの原則の説明は非垞に曖昧に思えたした。 䞀方では、それらの倚くDIPやOCPなどは非垞に厳密に衚珟されおいたす。DIPは特定の型の倉数の䜿甚を犁止し、OCPは再コンパむルなしの拡匵を意味したす。 䞀方、時には、これらの原則を賢く䜿甚する必芁があるずいう実甚的なメモがすり抜けたす。



興味深い点は次のずおりです。



「柔軟なチヌムはこれらの原則SOLIDを意味するを悪臭の陀去にのみ適甚したす。 悪臭がなければ、原則は圓おはたりたせん。 原則であるずいう理由だけで原則を無条件に守るのは間違いです。 悪臭をなくすための原則がありたす。 これらは、システム党䜓に豊富に氎をたく必芁がある銙氎ではありたせん。 原則を過床に遵守するず、䞍必芁な耇雑さの悪に぀ながりたす。」



䞀方で、これは非垞に実甚的な芳点ですが、䞀方で、埓うべきタむミングず埓わないタむミングに関する远加のルヌルを導入するために、このような厳栌なガむドラむンに埓う必芁があるのはなぜですか



加えお、ここでは原因ず結果が混同されおいるように思えたす。原則は、蚭蚈における「最愛の人」を定矩するためにたず必芁であり、それらを排陀するのにはたったく圹立ちたせん。



以䞋は、単に違反できない原則の説明です。



Lsp


「掟生クラスを䜜成するずきにベヌスクラスを倉曎する必芁がある堎合は、おそらく蚭蚈に欠陥がありたす。」



たたは、別の遞択肢がありたす。私たちは、進化蚭蚈が重芁な開発アプロヌチである珟実の䞖界に䜏んでいたす。



「LSPの原理は、実際のプログラムに応甚できたすか 私が数幎前に取り組んだプロゞェクトから取った䟋を考えおみおください... 1990幎代初頭に ... "

オリゞナルの本は2006幎半ばC2.0ず䞀般化のリリヌス埌にリリヌスされたしたが、ここ数幎前-これは1990幎代の始たりです



「リスク代替原理は、OCP原理を実装するための䞻芁なツヌルの1぀です。」

OCPを達成するためのオプションの1぀はポリモヌフィズムであり、LSPはポリモヌフィズムが期埅どおりに機胜するず蚀いたす。 たずえば、コヌルバック関数に基づいお、OCPを達成するためのその他のオプションがありたす。



すでにLSP原則の圢匏化に぀いお話しおいる堎合は、コントラクトに぀いお、継承の正しい実装のためのそれらの圹割に぀いお話し合う必芁がありたす。 契玄は本で蚀及されおいたすが、文字通り通り過ぎたす。



ディップ


この原則に぀いおのより詳现な批刀は、蚘事「䟝存関係の逆転の原則に関する批刀的な芋方」に蚘茉されおいたす。



しかし、これは非垞に喜ばれた非垞に感情的な結論です



「実際、このような䟝存関係の逆転は、オブゞェクト指向蚭蚈の倧きな兆候です。 プログラムがどの蚀語で曞かれおいるかは関係ありたせん。 䟝存関係が逆になっおいる堎合、オブゞェクト指向蚭蚈になりたす。 それ以倖の堎合、蚭蚈は手続き型です。」

非垞に物議を醞す声明、同意したす



Opc


Open-Closed原則の著者がBob Martinではなく、Bertrand Meyerの著曞 " Object-Oriented Design of Software Systems"にあるこずを知っおいる人はあたりいたせん。 同時に、ボブ・マヌティンが圌自身の方法でこの原則を解釈するこずに泚意を払う人はさらに少なくなりたした。



Bob Martinからの定矩  ゜フトりェア゚ンティティクラス、モゞュヌル、関数などは拡匵のために開かれおいる必芁がありたすが、倉曎のために閉じられおいる必芁がありたす。



したがっお、モゞュヌルには2぀の䞻芁な特性がありたす。







Bertrand Meyerからの定矩  モゞュヌルはオヌプンずクロヌズの䞡方が可胜でなければなりたせん。

さらに、 オヌプンネスずクロヌズネスの抂念は次のように定矩されおいたす。







蚀い換えるず、Meyerはモゞュヌルのオヌプン/クロヌズドむンタヌフェむスに぀いお語り、Martinはむンタヌフェヌスず実装を含むモゞュヌル党䜓をオヌプン/クロヌズドしたす。



再コンパむルせずにモゞュヌルの動䜜を拡匵する可胜性は、モゞュヌルの芁件に蚘茉する必芁があり、原則に基づくものではありたせん。



同時に、Open-Closed原則の䟋ずしお、 Drawメ゜ッドを備えたShapeクラスがただ䞎えられおいるこずは面癜いです。これは、構造蚭蚈の゜リュヌションず比范しお、Open-Closed原則に察応しおいたす。 しかし同時に、新しいタむプのFigureたたは新しい操䜜を基本クラスShapeに远加する堎合、この゜リュヌションを展開甚に開いお倉曎甚に閉じる方法に぀いおは沈黙しおいたす。



ISP


本を読んでいる間、私は本がれロから曞かれたのではなく、第2版であり、その䟋がCに翻蚳されおいるず繰り返し思いたした。 さらに、この本は「額に沿っお」やり盎されおおり、.NETプラットフォヌムのむディオムを䜿甚しお凊理されたせん。



このプロパティの最も優れた衚珟の1぀は、むンタヌフェむス分離の原則の説明に蚘茉されおいる䟋です。



むンタヌフェむスの分離の原理は、2぀の䟋で怜蚎されたす。1぀は、 Door DoorのクラスずTimedDoorのサブクラスを持぀セキュリティシステムで、ドアがしばらく閉じられない堎合に可聎信号を発するものです。 この問題を解決するためのオプションの1぀は、「委任による分離」セクションで説明されおおり、著者によれば、ISPを満たしたす。







著者はこれに぀いお次のように曞いおいたす。 「この゜リュヌションはISPの原則ず䞀臎しおおり、DoorクラむアントずTimerクラスの間に接続を䜜成したせん。 ...しかし、それはあたりにも゚レガントではありたせん。 タむムアりトを登録するたびに、新しいオブゞェクトを䜜成する必芁がありたす。



このセクションを読んだ埌、私は若いマヌティン.NETの息子がそれを読んだ埌に蚀うべきこずを想像したした。



「Pa、聞いおください、このデザむンオプションは最新のものではないこずを理解しおいたす。あなたず私は䞀から本を曞いおいるわけではありたせんが、それでも...

結局のずころ、2぀の䜙分なクラスがありたすが、 timeoutIdを受け入れるTimedDoorクラスのDoorTimeoutメ゜ッドに぀いおは、トリックがたったく匕き裂かれたす 結局のずころ、.NETには最初からタむマヌがあり、それらの「オブザヌバヌ」は、むンタヌフェむスではなくむベントに基づいお構築されたす。 したがっお、 TimerClientずDoorTimerAdapterを砎棄し 、 DoorTimeoutメ゜ッドを閉じるこずができたすさらに、このtimeoutIdを砎棄するこずもできたす。

したがっお、蚭蚈の芳点からは、コヌドはよりクリヌンになり、実装の芳点からも同様になりたす。 したがっお、この䟋を捚おお、Cのむディオムのために章を完党に凊理する必芁がありたす。そうしないず、コミュニティはそのような創造性を認めないかもしれたせん



しかし、明らかにそのような䌚話はありたせんでした したがっお、この章では、通垞のCアプリケヌションでは芋぀けるこずができない非垞に悪い䟋を瀺したす。



UML



「静的ダむアグラムは、プログラムの䞍倉の論理構造、぀たり芁玠、぀たりクラス、 オブゞェクト 、デヌタ構造、およびそれらの間の関係を蚘述したす。」



オブゞェクトは「プログラムの䞍倉の論理構造」の䞀郚ではありたせん。



「関連付けは単玔な関係であり、あるオブゞェクトが別のオブゞェクトぞのリンクを保持し、別のオブゞェクトのメ゜ッドを呌び出すずいう事実から成りたす。」



関連付けは、リンクの保存を意味するものではありたせん。 クラスAがシングルトンを盎接䜿甚する堎合、リンクはありたせんが、関連付けがありたす。



「構成は、集蚈の特殊なケヌスです。 繰り返したすが、実装は䞀般的な関連付けず区別できないこずに泚意しおください。 今回は、この関係はC  プログラムでほずんど䜿甚されないためです。



ここで、制埡蚀語では、党䜓がコンポヌネントの寿呜を厳密に制埡しおいる堎合、玔粋な構成を達成するこずは䞍可胜であるず蚀わなければなりたせん。 しかし、論理的な芳点から話すず、開発者が䟝存関係の逆転の原則を乱甚しない堎合、Cでの合成が非垞に頻繁に䜿甚されたす。



パタヌン



本が原則ずパタヌンを説明しおいるのは非垞に興味深いですが、䞀郚の説明は他の説明にほずんど䟝存したせん。 したがっお、DIPパタヌンで説明されおいる問題の倚くは、オブザヌバヌ、戊略、およびメディ゚ヌタヌによっお正垞に解決されおいたすが、この原則を説明する際にパタヌンは実際には蚀及されおいたせん。 たたは、 Singletonの問題を説明するずき、すべおのナヌザヌがDIPに違反し、テスト容易性に問題があるず蚀わなければなりたせんが、これらの類䌌点は描かれおいたせん。

今、少し特異性。



ファサヌドずメディ゚ヌタヌ


「この章で説明するパタヌンには、1぀の目暙がありたす。オブゞェクトのグルヌプに䜕らかのポリシヌを課すこずです。 ファサヌドは䞊からポリシヌを課し、メディ゚ヌタヌは䞋からポリシヌを課したす。 ファサヌドは衚瀺され、制限が課されたす。メディ゚ヌタヌは衚瀺されず、䜕も制限したせん。



トロヌル80巊レベル したがっお、2぀の抂念の間に共通の基盀を芋぀けるこずができ、それらが存圚しない堎合でも、それらの違いのおかげでそれらを1か所にたずめるこずができたす



これらのパタヌンには実際には共通点はなく、さたざたなカテゎリヌファサヌド-構造、メディ゚ヌタヌ-行動に属し、さたざたな抜象化レベルでさたざたな問題を解決するように蚭蚈されおいたす。 本の章は、クラスやモゞュヌルず同じくらいたずたりがあるべきであり、1぀の堎所で異皮の抂念を説明しようずする詊みは疑わしいようです。



デコレヌタ


「デヌタベヌスを操䜜するためにデコレヌタを䜿甚する方法は2぀ありたす。 読み取りおよび曞き蟌みのメ゜ッドを远加しおビゞネスオブゞェクトを装食したり、ビゞネスルヌルを提䟛しお、自身の読み取りおよび曞き蟌み方法を既に知っおいるデヌタオブゞェクトを装食するこずができたす。 埌者のアプロヌチは、オブゞェクト指向デヌタベヌスを操䜜するずきによく䜿甚されたす。



WTF デコレヌタの本質は、装食されたオブゞェクトのむンタヌフェむスを倉曎せずに動䜜を倉曎できるこずです。 「読み取りおよび曞き蟌みメ゜ッドでそれを補充」し、単䞀の仮想メ゜ッドを再定矩しない堎合、結果のクラスは適切なデコレヌタヌになりたせん



はい、正匏には、デコレヌタヌを䜿甚しお操䜜を远加できたすが、基本的に新しい操䜜を远加するのではなく、既存のクラスの機胜を拡匵する必芁がありたす。 それでも、デコレヌタは「顧客の責任をオブゞェクトに動的に動的に远加するために」䜿甚されたす。



蚪問者


「この䟝存サむクルは、蚪問したすべおのサブクラスすべおのモデムタむプをリンクするため、蚪問者を段階的にコンパむルしたり、蚪問した階局に新しいサブクラスを远加したりするこずは困難です。」



明らかに、遞択されたフラグメントは、C ++からCぞの移行埌に曎新されおいたせん。

「さらに悪いこずに、キャスト速床は階局の幅ず深さに䟝存する可胜性があるため、予枬が困難です。」



実装の倚重継承がある環境では、倧きな階局がキャストのパフォヌマンスに圱響を䞎える可胜性がありたすが、.NETのこれらの単語の蚌拠を芋぀けるこずができたせんでした。



状態


第36章では、単玔なベクトル IList型のフィヌルドに基づいお䜜成された倉換テヌブルに぀いお説明したす 。これにより、次のアドバむスが埗られたす。



「この゜リュヌションの欠点は、䞻に生産性が䜎いこずです。 倉換テヌブルでの怜玢には時間がかかりたす。 ステヌトマシンが非垞に倧きい堎合、怜玢時間が顕著になる可胜性がありたす。

遷移衚に基づく状態パタヌンは、開発コスト/効率の点で最も成功した゜リュヌションの1぀であるず垞に考えおいたした。 しかし、もちろん、兞型的な解決策は、O1遷移怜玢の耇雑さを提䟛する蟞曞の䜿甚を䌎いたす。



テンプレヌトの方法ず戊略


「パタヌンテンプレヌトメ゜ッドは実際には䜿いやすいですが、十分な柔軟性がありたせん。 Strategyパタヌンには必芁な柔軟性がありたすが、远加のクラスを導入し、远加のオブゞェクトを䜜成しおシステムに組み蟌む必芁がありたす。したがっお、これらのパタヌンの遞択は、Strategyの柔軟性が必芁か、Templateメ゜ッドのシンプルさを楜しむ準備ができおいるかによっお異なりたす。



パタヌンの柔軟性の欠劂テンプレヌト方匏は欠点ではなく、機胜です。 盞続人による䟿利な拡匵のためのクラスの開発は単玔なタスクではないため、基本クラスは、盞続人が抌し蟌たなければならないフレヌムワヌクを提䟛できたす。



単䜓テスト



ボブ・マヌティンはTDDの有名な支持者ですが、契玄の芳点からデザむンに぀いお考えるこずを奜みたす。 その結果、実装は前提条件や事埌条件ではなくテストによっお「駆動」されたため、本のコヌドにはいく぀かのバグがありたす。 詳现に぀いおは、蚘事「契玄、ステヌタス、ナニットテスト」を参照しおください 。



Martin単䜓テストにはいく぀かの問題がありたす。 たず、膚倧な数のテストがデヌタベヌスに送られるため、本質的に統合テストになりたす。 2006幎に2぀の抂念に明確な分離があったかどうかはわかりたせんが、珟圚、これらの抂念の違いは倚かれ少なかれ明らかです。



フォヌルンナニットテストずは、コヌドのバグ、たたは少なくずも意図した動䜜ず実際の動䜜の䞍䞀臎を意味したす。 統合テストの倱敗は、環境問題に起因する可胜性があるため、䜕も意味したせん。 ナニットテストがビルドに萜ちおすべおのビルドで実行され、統合テストは別のアセンブリで実行され、それほど頻繁に実行されないのはそのためです。



第二に、マヌティンは原則に埓っお曞かれたテストが倚すぎるこずを匕甚しおいたすすべおのクラスの割り圓おられたむンタヌフェヌス、テストの䜜成、幞犏。 このアプロヌチは、数か月間この方法で䜜業した埌、カバレッゞは良奜ですが、デザむンが悪いコヌドを取埗するこずを気にしたす。



もちろん、次のように蚀うこずができたす。「たあ、それはただ本の第2版であり、初版のオリゞナルは2002幎にすでに出おいたので、すべおが異なっおいたした」 しかし、2006幎に第2版が発行され、著者は埗られた経隓に基づいお本の内容を曎新する時間がありたした。 しかし、それはポむントでもありたせん。 初版より正確には1幎埌のリリヌス䞭に、゚バンスは曞籍「Domain-Driven Design」を出版したした。これは、蚭蚈、テスト、耇雑さや他の倚くの問題ずの戊いに関するより実甚的な芋解を瀺しおいたす。 Evansは、䞍倉性の利点、ロゞックを単玔なオブゞェクト倀オブゞェクトず呌ばれるに転送するこずに぀いおの考えを既に芋おいたす。ほずんどの堎合、耇雑な耇合オブゞェクトがそのような高レベルのメディ゚ヌタヌになるように蚭蚈を倉えるこずができたす。



その結果、すでに最初の段階で、「むンタヌフェむスずテストを匷調する」代わりに、別のアプロヌチが存圚するこずがわかっおいたした。動䜜を、他のクラスにも倖郚環境にも䟝存しないクラスに分離したす。 次に、実瞟のある䜎レベルクラスに基づいお構築される高レベルクラスを䜜成したす。 その結果、実行時に動䜜を眮き換える機胜がアプリケヌションで必芁な堎合にのみむンタヌフェむスが匷調衚瀺される、匷固な基盀䞊に構築された階局システムが埗られたす。



泚

これに぀いおは、 「テスト枈みデザむンvs. 良いデザむン 。 」



興味深いこずに、同じトピックで、契玄察 ナニットテストでは、MartinずKoplienをフィヌチャヌした興味深いInfoQビデオがありたす CoplienずMartin Debate TDD、CDD、およびプロフェッショナリズム



ひどいテストの良い䟋


たあ、本はあなたがキヌボヌドを遞択する必芁があるテストの䟋を提䟛したす。 それらの1぀を次に瀺したす。



[Test] public void LoadingEmployeeDataCommand() { operation = new LoadEmployeeOperation(123, null); SqlCommand command = operation.LoadEmployeeCommand; Assert.AreEqual("select * from Employee " + "where EmpId=@EmpId", command.CommandText); Assert.AreEqual(123, command.Parameters["@EmpId"].Value); }
      
      







このテストは䜕もチェックしたせん。合栌した堎合、テストずクラスのコヌドは同じであるこずを意味したすが、操䜜が正しく実装されおいるずは蚀いたせん。 それでも、テストはテストされたコヌドず比范しおより抜象的である必芁がありたす。そうでない堎合、それらは圹に立たなくなりたす。



.NET



本を読んでいるずき、これは本の第2版であり、C蚀語にわずかに適合しおいるが、新しいプログラミング蚀語のむディオムを䜿甚しお完党に凊理されおいないように感じたす。 倚くの堎所で、Java呜名のむディオムが䜿甚され小文字のメ゜ッド名CONSTANTS_WRITE_THE_ SOK、 Mainメ゜ッドがドメむンオブゞェクトに远加され、アセンブリの代わりに「パッケヌゞ」の抂念が䜿甚される堎合がありたす。 䟋には暙準の.NETむディオムがありたせん。オブザヌバヌでは、むンタヌフェむスが䜿甚され、むベントは䜿甚されたせん。 readonly修食子は䜿甚されたせん。リ゜ヌスを持぀クラスはIDisposableなどを実装したせん。 䞀般化は䜿甚されたせんが、本が登堎する1幎前に登堎したした。



最も重倧な間違いの1぀は、次のサむドバヌ「どこに行きたしたか」に蚘茉されおいたす。

「䞀般的に蚀えば、特にこの抂念が倉わる可胜性がある堎合は、それに盎亀する特定の抂念を名前に含めるべきではありたせん。 たずえば、 ICommandをむンタヌフェむスではなく抜象クラスにしたい堎合はどうでしょうか ICommandぞのすべおの参照を怜玢し、それらをCommandに眮き換えたすか この倉曎の圱響を受けるすべおのアセンブリを再コンパむルしお展開したすか 」



私芋、 あなたのむディオムで別の蚀語に来るよりも、あなた自身のチャヌタヌで倖囜の修道院に来る方が簡単です。 Javaでプログラムする堎合、自分の奜みに関係なくロヌカルの呜名法を䜿甚したす。これは正しいです しかし、このサむドバヌの䜕よりも、私は議論が奜きです。



若いマヌティンは、゚ンティティの名前を倉曎するかどうかに関係なく、むンタヌフェむスから抜象クラスぞの移行が朜圚的な重倧な倉曎であるこずを長老に䌝えなかったようです。いずれにしおも、「この倉曎の圱響を受けるすべおのアセンブリを再コンパむルしおデプロむする」必芁がありたす 同様の倉曎でオンザフラむでアセンブリを亀換しようずするず、アプリケヌションがクラッシュしたす



プラむムゞェネレヌタヌ


Martinsは状態が非垞に奜きであるため、玠数ゞェネレヌタp。80をリファクタリングするずきに、静的フィヌルドが割り圓おられたした。



「3぀の関数の割り圓おにより、いく぀かのロヌカル倉数をクラスの静的フィヌルドに倉換できたした。 その結果、どの倉数が実際にロヌカルであり、どの倉数がより広いスコヌプを持っおいるかがより明確になりたした。



 class PrimeGenerator { private static bool[] crossedOut; private static int[] result; public static int[] GeneratePrimeNumbers(int maxValue) { return null; } //    crossedOut private static void UncrossIntegersUpTo(int maxValue) { } //  result   crossedOut private static void PutUncrossedIntegersIntoResult() { } }
      
      







私はフィヌルドで䞭間結果を維持するこずの愛を理解しおいたせん。 ロヌカル倉数を非ロヌカル倉数から分離する堎合、メ゜ッドの匕数もこれに適しおいたす。共有状態を䜿甚する必芁はありたせん。



共有状態はコヌドを耇雑にし呌び出しの順序が重芁になりたす、異なるスレッドから䞊行しお玠数を取埗するこずも䞍可胜になりたす。これは、静的クラスメンバヌはスレッドセヌフである必芁があるず述べおいるフレヌムワヌク蚭蚈ガむドラむンの䞀般に受け入れられおいる芏則に違反しおいたす。



コヌドが、この本のリリヌスの1幎前に出おきたむテレヌタブロックを䜿甚しないず蚀っおいるのではありたせん。



SocketServer


このコヌドは251ペヌゞで説明されおおり、本に付属の䟋には含たれおいたせん。 ここに眮きたす 。



 public interface SocketService { void Serve(Socket s); } public class SocketServer { private TcpListener serverSocket = null; private Thread serverThread = null; private bool running = false; private SocketService itsService = null; private ArrayList threads = new ArrayList(); public SocketServer(int port, SocketService service) { itsService = service; IPAddress addr = IPAddress.Parse("127.0.0.1"); serverSocket = new TcpListener(addr, port); serverThread = new Thread(new ThreadStart(Server)); serverThread.Start(); } public void Close() { running = false; serverThread.Interrupt(); serverSocket.Stop(); serverThread.Join(); WaitForServiceThreads(); } private void Server() { serverSocket.Start(); running = true; while (running) { Socket s = serverSocket.AcceptSocket(); StartServiceThread(s); } } //   }
      
      







コヌドには2぀のタむプの問題がありたす第1に、これらは、読み取り専甚の欠劂、 IDisposableむンタヌフェむスの欠劂、オブザヌバヌを実装するためのむベントの代わりのむンタヌフェむスの䜿甚、非同期操䜜が.NET Frameworkの最初のバヌゞョンから利甚可胜な堎合のフロヌの手動操䜜、および䟋倖凊理の欠劂などの些现な問題です。



しかし、最も重芁なこずは、このコヌドは蚭蚈が䞍十分な䟋です。 SocketServer 、 ServiceRunner、およびSocketServiceクラスの圹割は あいたいで わかり にくいです。



たずえば、 SocketServiceむンタヌフェヌスを実装するクラスがありたす。 Serve Socket s メ゜ッドで䜕ができたすか どういうわけか、圌はこのメ゜ッドが別のスレッドで呌び出されるず蚀っおいたすか いや しかし、芪゜ケットが閉じおいるこずず、操䜜を䞭断する必芁があるこずをどのようにしお知るのでしょうか しかし、このメ゜ッドでReceiveタむプのブロッキングメ゜ッドを呌び出すこずが可胜かどうか、たたは独自の無限ルヌプをねじる必芁があるかどうかをどのように理解するのでしょうか



コヌドのテストを曞くこずが䞍可胜な堎合、結果ずしお生じるマヌティンの蚭蚈はひどいものになるこずがわかりたす。 このコヌドは、.NET Frameworkの組み蟌み機胜を効果的に䜿甚しおいたせんが、面癜いのは、機胜しないこずです Closeメ゜ッドを芋お、 runningが そこでfalseに 蚭定され、それからthread .Interrupt が呌び出されたすが、珟圚のサヌバヌスレッドはserverSocket .AcceptSocket メ゜ッドで新しい接続を埅っおハングしおいるため、䜕にも぀ながりたせん。 同様の問題は、 Serverメ゜ッドでs .Receive を呌び出す堎合、すべおのクラむアント゜ケットで発生したす 。このhoroshkaはすべお閉じるこずができたせん。



ツリヌマップ


ここでコヌド党䜓を芋るこずができたす 。



 internal class TreeMapNode { private static readonly int LESS = 0; private static readonly int GREATER = 1; private IComparable key; private object value; private TreeMapNode[] nodes = new TreeMapNode[2]; private int SelectSubNode(IComparable key) { return (key.CompareTo(this.key) < 0) ? LESS : GREATER; } }
      
      







ここではすべおがそれほど臎呜的ではありたせんが、javaスタむルの定数の䜿甚、 キヌおよびノヌドフィヌルドのreadonlyキヌワヌドの䞍圚、ならびに倱敗した定数名 LESSおよびGREATERは 、実際にはサブツリヌのむンデックスを決定したす。



おわりに







この本をgoodreads.comで2点で評䟡した理由を尋ねられたした。 さお、この堎合、私は反察の質問を持っおいたすそれは本圓にもっず䟡倀があるのですか



この本はほずんど叀兞的なものであるこずが非垞に怖いです。しかし、この本には、埓うべき時ずそうでないずきに぀いおの疑わしいルヌルを含む疑わしい原則が含たれおいたす。 この本には、パタヌンの挠然ずした説明がありたすが、これは前述の原則ずはたったく関係ありたせん。 この本には、壊れやすいテストず、クラスの蚭蚈が少なくずも少し前に考えられおいた堎合には発生しなかった゚ラヌを䌎うコヌドを䜿甚しおルヌルをテストする2぀のバケツが含たれおいたす。 この本はCプログラマヌを察象ずしおいたすが、2006幎の暙準でさえ、その䞭のコヌドは䟡倀がありたせん。



この本は、経隓の浅い開発者が読んだ堎合、貚物のカルトの深刻な症状に぀ながる可胜性があり、経隓のある開発者には䜕も䞎えないのではないかず心配しおいたす。 したがっお、この本の䞻な利点は、SOLID-ahや他の原則に぀いおのトロヌリングに適切に参加できるこずですが、それ以䞊のこずはないずいうこずがわかりたす。



All Articles