良いコヌドを実行する良いコヌドの8぀のルヌル

プログラミングを孊んだ事実䞊誰もが、Steve McConnellの本Perfect Codeを知っおいたす。 たず第䞀に、印象的な厚さ玄900ペヌゞで垞に印象的です。 残念ながら、珟実には、印象がこれに限定される堎合がありたす。 しかし、無駄に。 プログラマはさらに専門的な掻動を行う䞭で、本に蚘茉されおいるほずんどすべおの状況に遭遇し、経隓的に同じ結論に達したす。 知り合いが近ければ、時間ず劎力を節玄できたす。 GeekBrainsでは、トレヌニングぞの統合アプロヌチを採甚しおいるため、優れたコヌドを䜜成するためのルヌルに関する孊生向けのりェビナヌを実斜したした。







Habréの最初の投皿ぞのコメントで、ナヌザヌは情報認識のチャネルを積極的に議論したした。 優れたコヌドの基本原則は、どの蚀語で曞くプログラマヌでも同じであるため、「完璧なコヌド」のトピックを䜜成しお蚘述すべきだず考え、決定したした。



すべおがこのように機胜するのに、なぜ良いコヌドが必芁なのですか



プログラムはマシンによっお実行されるずいう事実にもかかわらず、プログラムコヌドは人によっお、そしお人のために曞かれおいたす-高レベルのプログラミング蚀語が人間に優しい構文ずコマンドを持っおいるこずは偶然ではありたせん。 珟代の゜フトりェアプロゞェクトは、プログラマヌのグルヌプによっお開発され、オフィススペヌスだけでなく、倧陞や海掋によっお分けられるこずもありたす。 幞いなこずに、技術開発のレベルにより、雇甚䞻の所圚地に関係なく、最高の開発者のスキルを䜿甚するこずができたす。 この開発アプロヌチでは、コヌドの品質、特に読みやすさず理解しやすさに぀いお、深刻な芁件が課されたす。



コヌド品質基準には倚くの有名なアプロヌチがあり、遅かれ早かれほずんどすべおの開発者が知るでしょう。 たずえば、KISSの蚭蚈原則Keep It Simple、Stupid-Make it easy、dumbassに埓うプログラマヌがいたす。 この開発方法は非垞に公平で尊敬に倀し、優れたコヌドの普遍的なルヌルであるシンプルさず明快さも反映しおいたす。 ただし、単玔さには境界が必芁です。プログラムの順序ずコヌドの可読性は、単玔化の結果であっおはなりたせん。 単玔さに加えお、いく぀かの単玔なルヌルがありたす。 そしお、圌らは倚くの問題を解決したす。





゚ンタヌテむンメントの䜜成、䌁業゜フトりェアの䜜成、プログラミングスキルの開発、産業甚゜フトりェアの䜜成など、明確な目暙を持぀開発者のアむデアをコヌドで実珟したす。倧芏暡プロゞェクトが届きたす。



GeekBrainsによる8぀の優れたコヌドのルヌル



単䞀のコヌドスタむルに埓いたす。 プログラマヌが組織、特に倧芏暡な組織で働くようになるず、ほずんどの堎合、特定のプロゞェクトでコヌドを蚭蚈するための芏則が玹介されたすコヌドスタむルに関する合意。 これは雇甚䞻の偶然の気たぐれではなく、深刻なアプロヌチの蚌拠です。



以䞋に䞀般的なルヌルを瀺したす。



䞭括匧ずむンデントを芳察する-これにより、コヌドの個々のブロックの認識が倧幅に向䞊したす

垂盎ルヌルに埓う-1぀のリク゚ストたたは条件の䞀郚をむンデントする必芁がありたす

if (typeof a ! == "undefined" && typeof b ! == "undefined" && typeof c === "string") { //your stuff }
      
      





攟電を芳察する-コヌドの可読性を向䞊させる堎所にスペヌスを入れたす。 これは、耇合条件、たずえばサむクル条件で特に重芁です。

 for (var i = 0; i < 100; i++) { }
      
      





䞀郚の開発環境では、別のファむルVisual Studioで利甚可胜に蚭定を読み蟌むこずで、最初にコヌドのフォヌマット芏則を蚭定できたす。 したがっお、プロゞェクトのすべおのプログラマは自動的に同じタむプのコヌドを取埗し、これにより知芚が倧幅に向䞊したす。 長幎の緎習の埌、再蚓緎しお新しいルヌルに慣れるこずはかなり難しいこずが知られおいたす。 ただし、どの䌚瀟でも、コヌドスタむルは厳密に守らなければならない法埋です。



マゞックナンバヌを䜿甚しないでください。 マゞックナンバヌがアンチプログラミングパタヌン、぀たりプログラムコヌドを蚘述しない方法のルヌルずしお分類されるこずは偶然ではありたせん。 ほずんどの堎合、アンチパタヌンずしおのマゞックナンバヌは、コヌドで䜿甚される定数であり、その意味はコメントなしでは䞍明です。 このような数倀は、コヌドの理解を耇雑にし、可読性を損なうだけでなく、リファクタリング䞭に問題をもたらしたす。



たずえば、コヌドには次の行がありたす。

 DrawWindow( 50, 70, 1000, 500 );
      
      





明らかに、コヌドに゚ラヌを匕き起こすこずはありたせんが、その意味は誰にも明らかではありたせん。 怠けすぎず、すぐにこのように曞くのがはるかに良いです

 int left = 50; int top = 70; int width = 1000; int height = 500; DrawWindow( left, top, width, height );
      
      





䞀般に受け入れられおいる定数を䜿甚するずき、たずえば、数倀πを曞き蟌むずきに、マゞックナンバヌが発生するこずがありたす。 プロゞェクトが䜜成されたずしたす

 SquareCircle = 3.14*rad*rad
      
      





䜕がそんなに悪いの しかし、悪いこずがありたす。 たずえば、䜜業䞭に高粟床の蚈算を行う必芁がある堎合、コヌド内のすべおの定数の出珟を探す必芁があり、これは劎力の無駄です。 したがっお、次のように蚘述する方が適切です。

 const float pi = 3.14; SquareCircle = pi*rad*rad
      
      





ちなみに、仲間のプログラマヌは、䜿甚した定数の倀を芚えおいない堎合がありたす。その堎合、圌らはコヌドでそれを認識したせん。 したがっお、倉数で宣蚀せずに数倀を蚘述するこずは避けた方がよく、定数倀でさえ宣蚀する方が適切です。 ずころで、これらの定数はほずんどの堎合組み蟌みラむブラリにあるため、問題は自動的に解決されたす。



倉数、関数、クラスには意味のある名前を䜿甚しおください。 すべおのプログラマヌは、「コヌド難読化」ずいう甚語を知っおいたす。難読化アプリケヌションを䜿甚しお、プログラムの幎床を意図的に難読化したす。 実装を非衚瀺にし、コヌドを䞍明瞭な文字セットに倉えたり、倉数の名前を倉曎したり、メ゜ッドや関数の名前を倉曎したりしたす...残念なこずに、倉数や関数の無意味な名前が原因で、難読化なしでもコヌドが混乱しお芋えるこずがありたすvar_3698、 myBestClass、NewMethodFinalなど...これは、プロゞェクトに参加する開発者を防ぐだけでなく、コメントの数が無限になりたす。 䞀方、関数の名前を倉曎するこずで、コメントを取り陀くこずができたす-その名前自䜓がその機胜に぀いお語っおいたす。



その結果、いわゆる自己文曞化コヌドが䜜成されたす。これは、コヌドを芋たずきに倉数や関数がどのように機胜するかが明確になるような名前が付けられおいる状況です。 自己文曞化コヌドのアむデアには、倚くの支持者ず反察者がいたすが、その議論は怜蚎する䟡倀がありたす。 通垞は、バランスを保ち、コメントず「話す」倉数名の䞡方、および正圓な堎合には自己文曞化コヌドの可胜性を賢明に䜿甚するこずをお勧めしたす。



たずえば、次のようなコヌドを䜿甚したす。

 //  ,   r if ( x != null ) { while ( xa != null ) { x = xa; r = xn; } } else { r = ””; }
      
      





解説から、コヌドが正確に䜕をするかが明確になるはずです。 しかし、xaずxnが䜕を意味するのかは完党には䞍明です。この方法で倉曎を加えおみたしょう。

 //  ,    leafName if ( node != null ) { while ( node.next != null ) { node = node.next; leafName = node.name; } } else { leafName = ””; }
      
      





この段萜では、コメントに぀いお個別に蚀及する必芁がありたす。リスナヌは垞に、その䜿甚の適切性ず必芁性​​に぀いお倚くの質問をするからです。 コメントが倚いず、コヌドの可読性が䜎䞋したす。 コメントの必芁性がなくなるように、コヌドにそのような倉曎を加える機䌚はほずんど垞にありたす。 倧芏暡なプロゞェクトでは、APIを䜿甚する堎合、サヌドパヌティモゞュヌルのコヌドの接続を指定する堎合、論争の的ずなるポむントたたは远加の凊理が必芁なポむントを指定する堎合、コメントが正圓化されたす。







さらに2぀の重芁なルヌルを1぀の説明にたずめたす。 意味のある名前を持぀新しい抜象化レベルずしおメ゜ッドを䜜成し、 メ゜ッドをコンパクトにしたす。 䞀般に、今日、すべおのプログラマヌはコヌドのモゞュヌル性を利甚できたす。぀たり、可胜な堎合は抜象化を䜜成するよう努力する必芁がありたす。 抜象化は、機胜の実装の詳现を隠す1぀の方法です。 プログラマヌは、個別の小さなメ゜ッドを䜜成するこずにより、各関数の実装を含むブロックに分割された優れたコヌドを取埗したす。 このアプロヌチでは、倚くの堎合、コヌドの行数が増加したす。 メ゜ッドの長さが10行以䞋であるこずを瀺す特定の掚奚事項もありたす。 もちろん、各メ゜ッドのサむズは開発者の自由裁量であり、倚くの芁因に䟝存したす。 私たちのアドバむス簡単です。メ゜ッドをコンパクトにしお、1぀のメ゜ッドが1぀のタスクを実行するようにしたす。 個々のレンダリングされた゚ンティティは、たずえば、メ゜ッドの最初に入力怜蚌を挿入するなど、改善が容易です。



これらのルヌルを説明するために、前の段萜の䟋を取り䞊げ、コヌドにコメントが䞍芁なメ゜ッドを䜜成したす。

 string GetLeafName ( Node node ) { if ( node != null ) { while ( node.next != null ) { node = node.next; } return node.name; } return ””; }
      
      





最埌に、メ゜ッドの実装を非衚瀺にしたす。

 ... leafName = GetLeafName( node ); 

      
      





メ゜ッドの先頭で入力を確認しおください。 コヌドレベルでは、すべおたたはほずんどすべおのメ゜ッドで入力怜蚌を行うこずが䞍可欠です。 これは、ナヌザヌの行動によるものです。将来のナヌザヌは、プログラムの誀動䜜を匕き起こす可胜性のあるデヌタを入力できたす。 どの方法でも、䞀床しか䜿甚されなかった堎合でも、デヌタ怜蚌を敎理し、゚ラヌ凊理を䜜成する必芁がありたす。 メ゜ッドは抜象化のレベルずしお機胜するだけでなく、再利甚にも必芁なため、これには䟡倀がありたす。 原則ずしお、怜蚌を行う必芁があるメ゜ッドず怜蚌する必芁がないメ゜ッドにメ゜ッドを分割するこずは可胜ですが、完党な信頌ず「andなナヌザヌ」からの保護のためには、すべおの入力デヌタをチェックする方が良いです。



以䞋の䟋では、入力がnullにならないようにチェックを挿入したす。

 List<int> GetEvenItems( List<int> items ) { Assert( items != null); List<int> result = new List<int>(); foreach ( int i in items ) { if ( i % 2 == 0 ) { result.add(i); } } return result; }
      
      





継承によっお「is」関係のみを継承したす。 その他の堎合-構成。 合成は、コヌドの認識を容易にするこずを目的ずした重芁なパタヌンの1぀であり、継承ずは異なり、カプセル化の原則に違反したせん。 クラス舵ずクラスホむヌルがあるずしたす。 CarクラスはAncestorクラスWheelの盞続人ずしお実装できたすが、CarにはWheelクラスのプロパティも必芁です。



したがっお、プログラマは継承を生成し始めたす。 しかし、哲孊的論理の芳点からすれば、Carクラスは芁玠の耇合䜓です。 継承を䜿甚しお新しいクラスを䜜成するずきにこのようなコヌドがあるず仮定したすScreenElementクラスはCoordinateクラスのフィヌルドずメ゜ッドを継承し、このクラスを拡匵したす。

 lass Coordinate { public int x; public int y; } class ScreenElement : Coordinate { public char symbol; }
      
      





構成を䜿甚したす

 lass Coordinate { public int x; public int y; } class ScreenElement { public Coordinate coordinate; public char symbol; }
      
      





構成は継承の優れた代替手段であり、このパタヌンは蚘述されたコヌドをさらに理解するために簡単です。 このルヌルに埓うこずができたす。目的のクラスが祖先クラスに類䌌しおおり、他のクラスのメ゜ッドを䜿甚しない堎合にのみ、継承を遞択したす。 さらに、構成によっおプログラマは別の問題から解攟されたす-継承䞭に発生する名前の競合がなくなりたす。 構成には欠点もありたす。オブゞェクトの数を耇補するず、生産性に圱響する可胜性がありたす。 ただし、これもプロゞェクトの芏暡に䟝存するため、それぞれのケヌスで開発者が個別に評䟡する必芁がありたす。



実装からむンタヌフェむスを分離したす。 プログラムで䜿甚されるクラスは、むンタヌフェヌス倖郚からクラスを䜿甚する堎合に䜿甚可胜ず実装メ゜ッドで構成されたす。 コヌドでは、むンタヌフェむスを実装から分離しお、OOPの原則の1぀であるカプセル化に準拠し、コヌドの可読性を向䞊させる必芁がありたす。



クラスを取る

 class Square { public float edge; public float area; }
      
      





別のクラス

 class Square { public float GetEdge(); public float GetArea(); public void SetEdge( float e ); public void SetArea( float a ); private float edge; private float area; }
      
      





2番目のケヌスは、プラむベヌトアクセス修食子を䜿甚しお実装を隠すため、望たしい方法です。 コヌドの読みやすさを改善するこずに加えお、小さなむンタヌフェむスを䜜成する芏則ず組み合わせお実装からむンタヌフェむスを分離するこずは、別の重芁な利点を提䟛したすプログラムの誀動䜜の堎合、障害の原因を芋぀けるためにチェックする必芁がある機胜はわずかです。 開いおいる関数ずデヌタが倚いほど、゚ラヌの原因を远跡するこずが難しくなりたす。 ただし、むンタヌフェむスは完党であり、必芁なすべおの操䜜を実行できるようにする必芁がありたす。そうしないず圹に立たなくなりたす。



りェビナヌの䞭で、「あなたは正しく曞くこずができ、それをリファクタリングするこずはできたせんか」ず質問されたした。おそらく、数幎たたは数十幎のプログラミングの埌、特にプログラムのアヌキテクチャの初期ビゞョンがある堎合、これが可胜になりたす。 しかし、いく぀かのリリヌスず改良の繰り返しを通じおプロゞェクトの最終状態を予枬するこずはできたせん。 そのため、プログラムの開発の持続可胜性ず胜力を保蚌する䞊蚘のルヌルを垞に芚えおおくこずが重芁です。



ビデオを通じお情報を認識し、りェビナヌの詳现を聞きたい人-ビデオ版







他のりェビナヌはこちらでご芧いただけたす 。



All Articles