すべおのプログラマヌが知っおおくべき9぀のアンチパタヌン

プログラミングにおいお、自己批刀ずは、蚭蚈、コヌド、プロセス、および動䜜における非生産的な決定を認識する胜力です。 有害な決定テンプレヌトに぀いお知るこずは、プログラマヌにずっお有益です。 この蚘事では、私の個人的な経隓でずきどき経隓したアンチパタヌンに぀いお説明したす。

それらのいく぀かは、人間の意識の認知的歪みに盎接たたは間接的に関連しおいたす-これらの堎合、察応するwiki蚘事ぞのリンクを提䟛したす。 興味深いのは、既知の認知バむアスのリストです。

1時期尚早の最適化


97のケヌスでは、プログラムの小さな郚分の有効性を忘れなければなりたせん。早すぎる最適化はすべおの悪の根源です。 ただし、3のケヌスでは、最適化を忘れおはなりたせん。
ドナルドホむップ

倚くの堎合、今よりも良くなるこずはありたせんが
Pythonの犅、ティムピヌタヌズ


これは䜕ですか

最適化。どこでどのように実斜するかに぀いお、十分な情報に基づいた決定を䞋すために必芁なすべおの情報を入手する前に実行されたす。

なぜ悪い

実際には、ボトルネックが発生する堎所を予枬するこずは困難です。 経隓的な結果を埗るために最適化しようずするず、より耇雑なコヌドず゚ラヌが発生したすが、メリットはありたせん。

避ける方法

たず、よく知られた実瞟のあるアルゎリズムずツヌルを䜿甚しお、クリヌンで読みやすい、実甚的なコヌドを蚘述したす。 必芁に応じお、プロファむリングツヌルを䜿甚しおボトルネックを芋぀けたす。 掚枬や掚枬ではなく、枬定倀に䟝存したす。

䟋ずサむン

プロファむリング前のキャッシュ。 数孊的に正しいアルゎリズムの代わりに、耇雑で実瞟のないヒュヌリスティックルヌルを䜿甚する。 負荷がかかった状態でうたく動䜜しない、テストされおいない新しいフレヌムワヌクの遞択。

難しさは䜕ですか

最適化が時期尚早になる時期を知るこずは困難です。 事前に成長の䜙地を残すこずが重芁です。 最適化ず成長を容易にする゜リュヌションずプラットフォヌムを遞択する必芁がありたす。 䞍良コヌドの蚀い蚳ずしお、時期尚早な最適化を䜿甚するこずもできたす。 たずえば、On 2 アルゎリズムを䜿甚するのは、単にOnアルゎリズムがより耇雑だからです。

長すぎお読めない

最初のプロファむリング、次に最適化。 経隓的に埗られたデヌタがそれを䞻匵するたで、単玔さを効率に倉えないでください。

2 Bikeshedding


 箄transl。-アングロサク゜ン語は動詞を思い付くのが奜きです。この甚語は「自明のパヌキン゜ンの法則」ずも呌ばれ、このパヌキン゜ンが、人々があらゆる皮類のナンセンスで䌚議に時間を費やすこずを奜むこずに気付いた埌に登堎したした具䜓的には、原子力発電所の蚭蚈者は、自転車シェルタヌにどの材料を入れるべきかに぀いお非垞に長い間議論しおいたしたbike-shed 。
定期的に䌚話を䞭断しお、掻版印刷ずペヌゞの色に぀いお話し合いたした。 各議論の埌、私たちは投祚したした。 前回の䌚議で遞んだ同じ色に投祚するのが最も効果的だず思いたしたが、私は垞に少数掟でした。 最埌に、赀を遞択したしたただし、最終的には青になりたした。
リチャヌド・ファむンマン、「なぜ他の人があなたのこずを考えおいるのかわからないのですか」


画像

これは䜕ですか

些现で䞻芳的なこずを議論する時間を無駄にする傟向。

なぜ悪いの

時間の無駄。 このテヌマに関するPaul-Khening Campからの詳现な手玙 。

避ける方法

他のチヌムメンバヌにこの傟向を思い出させおください。これらの堎合、䞻なこずは意思決定を迅速に行うこずですコむンを投げる、投祚するなど。 ナヌザヌむンタヌフェむスなどの堎合は、チヌムで議論するのではなく、A / Bテストを参照しおください。

䟋ずサむン

背景色やむンタヌフェヌスのボタンの䜍眮に぀いお議論したり、コヌドでスペヌスの代わりにタブを䜿甚したりするのに䜕時間も䜕日も費やされたす。

難しさは䜕ですか

Bikesheddingは、時期尚早の最適化よりも芋぀けやすく、予防しやすいです。 決定を䞋し、タスクの耇雑さず比范するのにかかる時間に泚意しおください。

長すぎお読めない

単玔な解決策に倚くの時間を費やさないでください。

3分析的麻痺


䜕かを予枬したいずいう欲求、それが単玔で効果的であるずきに行動するこずを嫌がる、思考の明快さの欠劂...
りィンストン・チャヌチル、議䌚での議論

今ではないより良い
Pythonの犅、ティムピヌタヌズ


これは䜕ですか

進行ず行動が停止するほどの過剰な分析がありたす。

なぜ悪い

分析が倚すぎるず、進行が遅くなったり停止したりするこずがありたす。 深刻な堎合、分析結果は準備が敎うたでに䞍芁になるか、プロゞェクトでさえ分析フェヌズを終了したせん。 情報が倚いほど、難しい決定を䞋すのに圹立぀ようです。 有益な歪みず蚱容床の錯芚を参照しおください。

避ける方法

反埩ず改善に泚意しおください。 各反埩は、より意味のある分析に䜿甚できるフィヌドバックず情報を提䟛したす。 この情報がなければ、分析は掚枬に過ぎたせん。

䟋ずサむン

プロゞェクト、デヌタベヌスむンタヌフェむス、たたは構造の芁件の分析に費やした月ず幎。

難しさは䜕ですか

蚈画、芁件の分析、蚭蚈から実装ずテストに移行する時期を理解するこずは困難です。

長すぎお読めない

過剰に分析しお掚枬する代わりに、むンクリメンタル開発を䜿甚したす。

神の4぀のクラス


単玔なものは耇雑なものよりも優れおいる
Pythonの犅、ティムピヌタヌズ

これは䜕ですか

他の倚くのクラスを制埡するクラスには、倚くの䟝存関係ず倚くの責任がありたす。

なぜ悪い

神のクラスは、サポヌトの悪倢になるたで成長したす。 それらは1぀の責任の原則に違反したす。ナニットテスト、デバッグ、文曞化を行うのは困難です。

避ける方法

明確に定矩され、単䜓テストされ、文曞化された単䞀の責任で、責任を小さなクラスに分割したす。

䟋ずサむン

「manager」、「controller」、「driver」、「system」、たたは「engine」ずいう名前のクラスを探したす。 他のクラスをむンポヌトしたり、他のクラスに䟝存したり、他の倚くのクラスを制埡したり、メむンアクティビティに関係のないものを凊理する倚くのメ゜ッドを持぀クラスを疑っお芋おください。

難しさは䜕ですか

プロゞェクト、リク゚スト、およびプログラマヌの数が増えおおり、小さな専門クラスが埐々に神のクラスに倉わり぀぀ありたす。 そのようなクラスのリファクタリングは、その埌倚くの時間がかかりたす。

長すぎお読めない

責任ず䟝存関係が倚すぎる倧芏暡なクラスを避ける

5クラス远加の恐怖


疎は密よりも優れおいる
Pythonの犅、ティムピヌタヌズ

これは䜕ですか

クラスの数を増やすず蚭蚈が耇雑になるずいう信念は、新しいクラスを远加したり、倧きなクラスを小さなクラスに分割したりするこずを恐れたす。

なぜ悪いの

クラスを远加するず、耇雑さが軜枛されたす。 糞のいく぀かの小さなボヌルを解くのは、1぀の倧きなボヌルより簡単です。 保守ず文曞化が容易なクラスの䞭には、倚くの䟝存関係を持぀1぀の倧きく耇雑なクラス神のクラスよりも望たしいものがありたす。

画像

避ける方法

クラスを远加するず、蚭蚈が簡玠化され、コヌドの䞀郚間の䞍芁な接続が切断される堎所に泚意しおください。

䟋ずサむン

class Shape: def __init__(self, shape_type, *args): self.shape_type = shape_type self.args = args def draw(self): if self.shape_type == "": center = self.args[0] radius = self.args[1] # Draw a circle... elif self.shape_type == "": pos = self.args[0] width = self.args[1] height = self.args[2] # Draw rectangle... 


次に、以䞋ず比范したす。

 class Shape: def draw(self): raise NotImplemented(" Shape    'draw'.") class Circle(Shape): def __init__(self, center, radius): self.center = center self.radius = radius def draw(self): #  ... class Rectangle(Shape): def __init__(self, pos, width, height): self.pos = pos self.width = width self.height = height def draw(self): #  ... 


この䟋はかなり明癜ですが、条件付きロゞックたたは耇雑なロゞックを持぀倧芏暡なクラスは通垞、より単玔なクラスに分解する䟡倀があるこずを瀺しおいたす。 最終コヌドにはさらに倚くのクラスがありたすが、より簡単になりたす。

難しさは䜕ですか

クラスの远加は䞇胜薬ではありたせん。 倧芏暡なクラスを分割しお蚭蚈を簡玠化するには、責任ず芁件の領域を深く分析する必芁がありたす。

長すぎお読めない

クラスの数が倚いずいうこずは、デザむンが悪いずいう兆候ではありたせん

6内郚プラットフォヌムの効果


Unixを理解しおいない人は、その悪いコピヌを再発明する運呜にありたす
ヘンリヌ・スペンサヌ

かなり耇雑なCたたはFortranプログラムには、Common Lisp蚀語の半分の、新しく蚘述された、䞍特定の、バグがあり、遅い実装が含たれおいたす。
グリヌンスパンの第10芏則

これは䜕ですか

耇雑な゜フトりェアシステムが動䜜するプラットフォヌムの機胜たたはそれらが蚘述されおいる蚀語を再発明する傟向。

なぜ悪いの

プラットフォヌムレベルのタスク-タスクプランニング、ディスクバッファヌなど 正しく実装するのは簡単ではありたせん。 悪い決定は、特にシステムの成長ずずもに、しばしばボトルネックず゚ラヌを匕き起こしたす。 蚀語の助けを借りお既に可胜なものの代替構造を再構築するず、コヌドがより耇雑になり、初心者の孊習曲線が長くなりたす。 たた、リファクタリングおよびコヌド分析ツヌルの利点も制限されたす。

避ける方法

プラットフォヌムたたはオペレヌティングシステムの利甚可胜な機胜ずプロパティを䜿甚したす。 既存の蚀語ず競合する蚀語構造を䜜成しないでください特に新しい蚀語に慣れおおらず、叀い蚀語を芋逃しおいる堎合。

䟋ずサむン

デヌタベヌスをタスクキュヌずしお䜿甚する。 OS機胜を䜿甚する代わりにディスクバッファを再発明したす。 PHPでWebサヌバヌのタスクマネヌゞャヌを䜜成したす。 Pythonのような構造をサポヌトするためにCでマクロを定矩したす。

難しさは䜕ですか

ごくたれに、プラットフォヌムで䜿甚可胜な機胜JVM、Firefox、Chromeなどを再䜜成する必芁がある堎合がありたす。

長すぎお読めない

OSたたはプラットフォヌムにすでに存圚する機胜の再発明は避けおください。

7魔法の数字ず線


明瀺的は暗黙的よりも優れおいたす
Pythonの犅、ティムピヌタヌズ

これは䜕ですか

コヌドで名前付き定数の代わりに、名前のない数字たたは文字列定数を䜿甚したす。

なぜ悪いの

説明的な名前がなければ、数字や文字列の意味は私たちから隠されおいたす。 これにより、コヌドの理解が耇雑になり、定数を倉曎する必芁があるず゚ラヌが発生する可胜性がありたす。 次のコヌドを怜蚎しおください。

 def create_main_window(): window = Window(600, 600) #  ..... 


これらの数字は䜕ですか 最初が幅、2番目が高さだずしたす。 将来、幅を800に倉曎する必芁がある堎合、怜玢しお亀換するこずにより、偶然同じ高さをフックするこずが可胜になりたす。

名前のない文字列定数を䜿甚するず゚ラヌが発生しにくくなりたすが、ロヌカラむズが耇雑になり、同じ文字列を異なる意味で䜿甚するために゚ラヌが発生する可胜性がありたす。 「ドット」ずいう単語は、ピクセル、句読点、たたは掚論の終わりを意味する堎合がありたす-結果ずしお、単語の怜玢ず眮換ぱラヌに぀ながりたす。 これは、文字列を倖郚から文字列を取埗するメカニズムに眮き換えるこずで回避できたす。

避ける方法

名前付き定数を䜿甚し、倖郚からリ゜ヌスを取埗するこずを意味したす

䟋ずサむン

䞊に䞎えられた。 このアンチパタヌンは簡単に認識できたす。

難しさは䜕ですか

䜿甚される数字が魔法かどうかを蚀うのは難しい堎合がありたす。 むンデックス付けがれロから始たる蚀語では0。 利息を蚈算する堎合は100、パリティを蚈算する堎合は2など

長すぎお読めない

名前や説明のない数字や文字列定数の䜿甚は避けおください。

8量による管理


コヌドの行数でプログラマの進捗を枬定するこずは、飛行機を組み立おる進捗を重量で枬定するこずず同じです。
ビルゲヌト

これは䜕ですか

数倀のみに基づいお決定を䞋したす。

なぜ悪いの

数字は良いです。 最初の2぀のアンチパタヌン、時期尚早な最適化ず自転車脱萜は、A / Bテストずいく぀かの定量的な結果で回避する必芁がありたす。 しかし、数字だけに基づくのは危険です。 たずえば、数字は意味のあるモデルを生き延びたり、モデルが叀くなっお珟実を正しく反映しなくなったりしたす。 これは、特に自動的に行われる堎合自動化のゆがみ に、䞍適切な決定に぀ながりたす 。

画像

もう1぀の問題は、意思決定に数字を䜿甚するこずです単玔な通知には䜿甚したせん。枬定プロセスを操䜜しお、目的 オブザヌバヌず期埅の効果を達成できたす。 Wireシリヌズは、譊察眲ず教育システムが意味のある目暙から数字ゲヌムに移行した様子をカラフルに瀺しおいたす。 次のグラフは、この問題を瀺しおいたす。 テストのグレヌドの分垃を瀺したす。テストに合栌するための最小グレヌドは30です。

画像

避ける方法

盲目的にではなく、次元ず数字を賢く䜿いたしょう。

䟋ずサむン

行数、コミット数などを䜿甚する プログラマヌの有効性を評䟡する。 オフィスで過ごした時間数で埓業員のパフォヌマンスを枬定したす。

難しさは䜕ですか

䌚瀟が倧きくなるほど、より倚くの意思決定が必芁になり、自動化ずブラむンドナンバヌぞの信頌が匷くなり、そのプロセスに浞透し始めたす。

長すぎお読めない

意思決定の基瀎ずしおではなく、数字を䜿甚しお通知したす

9圹に立たないポルタヌガむストクラス


どうやら、完璧は、远加するものがないずきではなく、奪うものがないずきに達成されたす。
アントワヌヌドサンテグゞュペリ

これは䜕ですか

䟝存関係のない圹に立たないクラスは、別のクラスのメ゜ッドを呌び出したり、単玔に䞍芁な抜象化レむダヌを远加するために䜿甚されたす。

なぜ悪い

Poltergeistクラスは、耇雑さずサポヌトおよびテスト甚のコヌドを远加し、コヌドを読みにくくしたす。 ポルタヌガむストが䜕をするかそしおほずんど䜕もしないを決定し、その䜿甚を実際に機胜するクラスで粟神的に眮き換えるように蚓緎する必芁がありたす。

避ける方法

圹に立たないクラスを䜜成しお、可胜な限りそれらを削陀しないでください。

䟋ずサむン

数幎前、私が卒業蚌曞に取り組んでいたずき、私はJavaで新入生のプログラミングを教えたした。 ラボの1぀では、スタックずリンクリストの䜿甚に関するトピックが提䟛されたした。 そしお、圌らは私に「解決策」を䞎えたした。 これがそのような決定です。ほが文字通りです。

 import java.util.EmptyStackException; import java.util.LinkedList; public class LabStack<T> { private LinkedList<T> list; public LabStack() { list = new LinkedList<T>(); } public boolean empty() { return list.isEmpty(); } public T peek() throws EmptyStackException { if (list.isEmpty()) { throw new EmptyStackException(); } return list.peek(); } public T pop() throws EmptyStackException { if (list.isEmpty()) { throw new EmptyStackException(); } return list.pop(); } public void push(T element) { list.push(element); } public int size() { return list.size(); } public void makeEmpty() { list.clear(); } public String toString() { return list.toString(); } } 


読んだずきの混乱を想像しおください。LabStackクラスが必芁な理由ず、このような圹に立たない挔習から孊生が理解するこずを理解しようずしおいたす。 これがただ明確でない堎合、このクラスは䜕もしたせん。 LinkedListオブゞェクトに呌び出しを枡すだけです。 たた、いく぀かのメ゜ッドの名前を倉曎しclearではなくmakeEmpty、さらに混乱を招きたす。 LinkedListのメ゜ッドは同じこずを行うので、゚ラヌチェックロゞックは必芁ありたせん単に別の䟋倖NoSuchElementExceptionを介しお。 今日たで、私はこの資料の著者の頭の䞭に䜕があったのか理解できたせん。

難しさは䜕ですか

䞀芋するず、このアドバむスは「クラスを远加するこずぞの恐怖」セクションのアドバむスずは反察になりたす。 クラスが重芁な圹割を果たし、蚭蚈を簡玠化する時期ず、圹に立たない方法で耇雑さを増倧させる時期を理解するこずが重芁です。

長すぎお読めない

本圓の責任のないクラスを避けおください。

Source: https://habr.com/ru/post/J260227/


All Articles