ネーミングアート(clean code読書ノートの1つ)

4245 ワード

本文は「Clean Code」(英語版)第2章の読書ノートです.
第2章では、codingのときに変数、関数、パラメータ、クラス、package、さらにはソースファイル、ソースファイルを含むディレクトリなどに名前を付け続けます.ここでは、これらの名前をよりよく付けるのに役立つ簡単ないくつかの名前ルールです.
1.名実ともに(Intention-REveling)の名前を使う
  • 無意味な名前を定義しないでください
  • magic numbers
  • は使用しないでください.
  • 例:
      //      
      public List getThem() {
          List list1 = new ArrayList(); 
          for (int[] x : theList)
              if (x[0] == 4) list1.add(x);
          return list1; 
      }
    
      //       
      public List getFlaggedCells() {
          List flaggedCells = new ArrayList();
          for (int[] cell : gameBoard)
              if (cell[STATUS_VALUE] == FLAGGED) 
                  flaggedCells.add(cell);
          return flaggedCells;
      }
    
      //   
      public List getFlaggedCells() {
          List flaggedCells = new ArrayList();
          for (Cell cell : gameBoard) 
              if (cell.isFlagged())
                  flaggedCells.add(cell); 
          return flaggedCells;
      }
    
  • 2.間違った意味を伝えない
  • 他の既存のネーミングシステムと同じまたは類似の名前(hp,aix,scoなど)
  • などの曖昧な名前の使用を避ける
  • は、言語特性に関連する語、例えばaccountListの使用を避ける.もしそれが本当にいくつかの言語のリスト構造であれば、そうでなければbunchOfAccountsまたは直接accountsを使用したほうがいい.
  • は、微妙な違いしかないネーミングを異なる場所で使用することを避けます.2つの変数を区別するのにどのくらいかかりますか?
      XYZControllerForEfficientHandlingOfStrings
      XYZControllerForEfficientStorageOfStrings
    
  • は、類似の概念を表すために類似の命名を使用する.この1本は前の1本と衝突しないで、似たような概念は似ているが明らかな区別度のある命名を使って表現しなければならない.
  • 外形上誤解を招きやすい命名を避ける:例えば大文字のoと小文字のLは、0と1に特に似ており、区別しにくい.

  • 3.ネーミングとネーミングの間に意味のある違いを使う
  • 例えば、1つのコードで2つの類似概念の変数を使用する必要がある場合は、a 1、a 2などの変数の命名を避けるために、できるだけ意味のある方法で区別します.
  • 不要な「ノイズワード」の使用を避ける.ProductというクラスはProductInfoやProductDataなどというよりずっといいです.
  • 冗長な「ノイズワード」の使用を避ける.変数名に単語variableを含めるべきではありません.テーブル名にはtableは永遠に含まれないでください.
  • ここではエラーの例であり、この3つの関数の命名はまったく意味のない
      getActiveAccount(); 
      getActiveAccounts(); 
      getActiveAccountInfo();
    
  • である.
    4.音声読み取り可能なネーミングを使用
  • 良いネーミングは読み取り可能であるべきであり、読み取り可能なネーミングはコードをよりよく理解し、これらのコードを議論しやすくするのに役立ちます.
  • genymdhms(generationdate,year,month,打野,後人,minute,and second)のように読みにくいネーミングはできるだけ避け、generationTimeStamp
  • を使用する
    5.検索しやすいネーミングを使う
  • これはやはり意味のある名前を使うということです.例えば、変数MAX_CLASSES_PER_STUDENTが7なので、この変数の名前をSEVENと定義しないで、プログラムの読者が検索しやすいようにします.
  • 著者はここで、単一アルファベットの変数名(i,j,kなど)は短い方法の内部変数としてしか使用できないべきだと書いている.
  • 6.新しい符号化方式による命名を避ける
  • ハンガリー命名法:現代言語は命名の長さに制限がないため、ハンガリー命名法のような命名を二次符号化する方法は
  • をできるだけ避けるべきである.
  • 接頭辞:接頭辞m_を使用する言語が多いこの変数がメンバー変数であることを識別するには意味がなく、プログラムの読者はあなたの接頭辞を無視して後の内容だけに注目することが多い.また、クラスとメソッドの定義範囲は十分に小さく、この接頭辞
      public class Part {
          private String m_dsc; // The textual description void setName(String name) {
              m_dsc = name; 
          }
      } 
    
      public class Part {
          String description;
          void setDescription(String description) {
              this.description = description; 
          }
      }
    
  • を使用する必要がありません.
  • インタフェースとインプリメンテーションのネーミング:著者らは、インタフェース名にIShapeFactoryをインタフェースとし、ShapeFactoryをインプリメンテーションクラスとして使用しないことを推奨する.このインタフェースの使用者に使用されているインタフェースを見せるのを避けるべきだ.

  • 7.脳補を避ける
  • は、rという変数をどこかで定義し、コードを書いた人だけがurlの小文字を表していることを知っているなど、難解な名前を書くことを避けます.
  • クラス名:クラス名は動詞
  • ではなく名詞または名詞フレーズであるべきである.
  • 方法名:方法名は動詞のフレーズであるべきである.コンストラクタがリロードする必要がある場合は、リロードされた異なるパラメータのコンストラクタではなく、できるだけ異なる名前のファクトリメソッドを使用します(この点は保留中です).
  • 8.かわいいネーミングは使わない
    9.同じ概念で同じ単語を使う
  • は、1つのプロジェクトでfetch、get、retrieveなどの似たような単語を使用して同じ意味を表現することを避ける.
  • と同じで、よく使われるマネージャー、コントローラ、Driverなどもあります.

  • 10.双関語の使用を避ける
  • 同じ単語が2つの異なるシーンで使用されると、特にこの2つのシーンでは意味が異なると誤解されることが多い.

  • 11.プログラマーがよく知っている固有名詞を使う
  • アルゴリズム、設計モード、数学名詞など、独自のコンピュータ名詞を使用することを恐れないでください.

  • 12.問題を記述するネーミングの使用
  • あなたの方法や変数を説明するコンピュータの専門名詞がなければ、できるだけあなたの名前があなたの問題を明確に説明できることを保証します.

  • 13.意味のあるコンテキストの追加
  • プログラムを書くのは文章を書くようなもので、それぞれの方法やクラスは段落のようなもので、いくつかの命名自体には明らかな意味がありません.それでは、アドレスクラスAddressのような意味のあるコンテキストに置く必要があります.中にはstateという属性があります.明らかに州を識別する意味ですが、他のコンテキストでは異なる意味がある可能性があります.

  • 14.無意味なコンテキストを追加しない
  • 著者はできるだけ短い名前(その意味をはっきり表現できる前提で)
  • を使うことを提案した.
  • 著者らがここで挙げた無意味なコンテキストの例としては、「Gas Station Deluxe」というプログラムでは、すべてのクラスにGSDの接頭辞が付けられており、このようなコンテキストは無意味である(ここではObjective-CのGCDを思い浮かべる)
  • 私のブログ