さらり

垂れ流す感じ

意味のある名前について

Clean Codeを題材に色々書いた。飛ばしている目次もある。
自分にとって必要なところだけ写経。自分の思いが強いところは自分の言葉で。

■意図が明確な名前にする
その意図が明確な名前をつける、言葉なら簡単に言える。
胸に刻みつけることはたくさんあるが、良い名前をつけることはその後の時間の節約できる。
名前をつける時は注意深く、そして後でより良い名前が浮かんだら変更してください。そうすることで他の人を幸せにできます。
変数、関数、クラス名は大命題に答える必要があります。なぜそれが存在するのか、何をするのか、どのように使用するのか。もし名前に説明が必要なら意図が明確とは言えません。

意図を表現した名前を用いれば、コードはもっと変更しやすいコードになります。いかに例を書いた。

public List<int[]> getTeam(){
  List<int[]> list1 = new ArrayList<>();
  for(int[] x : theList){
    if(x[0] == 10){ list1.add(x); }
    return list1;
  }
} 

難しい記述はないものの、これではしたことが明確には分からない。というか伝わらない。
このコードを見た時、暗黙的に考えてしまうことが
1. theListはなに?
2. 4という値はなにを表すのか
3. 戻り値のlistはなにを指すか
4. theListの[0]はなんだ
上記のような暗黙の問いは、コード以外の場所に存在する。(ドキュメント類)

では、次のように書き換えてみよう。
マインスイーパーのプログラムだとした時、

public List<int[]> getFlaggedCells(){
  List<int[]> flaggedCells = new ArrayList<>();
  for(int[] cells : gameBoard){
    if(cells[STATUS_VALUE] == FLAGGED){ flaggedCells.add(cell); }
    return flaggedCells;
  }
} 

コードの構造は変えずに、値に意味を与えた状態。さっきより読みやすい。だけど条件式などがまだ明確でない。次は、厳密に役割を与えて名前をつけてみよう。

public List<int[]> getFlaggedCells(){
  List<int[]> flaggedCells = new ArrayList<>();
  for(Cell cell : gameBoard){
    if(cell.isFlagged()){ flaggedCells.add(cell); }
    return flaggedCells;
  }
} 

こんな感じで、名前を明確化し、適切な名前をつけるだけでコード上で何が行われているのかが読み取りやすくなります。


■偽情報を避ける
コードの情報を曖昧にしてしまうような、間違った情報をコードに入れるのは避けるべき。その単語の意味が確立されて意味が、我々が意図した意味以外に様々に存在するのであれば、その名前は避けるべき。複数の顧客際に、実際にそれがList でないなら、accountListという名前を使用するのはやめましょう。間違った理解を招く可能性があります。accountGroup、あるいはaccountsのような名前がいいと思う。似た概念に似た綴りを与えるのは1つの情報になります。ですが、ごく一部分のみが異なる名前をつけないように。XYZControllerクラスに、EfficientHandlingOfStringとEfficientStorageOfStringが混在していたら気づくのが遅くなる可能性があります。整合性のない綴りを使用するのは錯乱します。気をつけましょう。

■意味のある対比を行う
get1やget2のような、数字の連続を使用した名前は避けてください。クラスも同様です。これは錯乱というより、無情報です。これらの名前はプログラマの意図を提供しません。

public static void copyChars(char a1[], char a2[]){
  for(int i = 0 i < a1.length; i++){
    a2[i] = a[1];
  }

このメソッドの引数の名前が、source、destinationなら読みやすくなりと思います。ノイズを発するワードにはまた別の無意味さがあります。例えば、Productというクラスがあるとして、ProductDataやProductInfoというクラスがある場合、違う名前をつけても意味は一緒です。InfoやDataは英語のa、an、theのようなものです。意味に明確な違いがあるのであれば、付け加えるのも間違いではないということも注意してください。読み手に違いがわかるような名前をつけてください。
ノイズワードは冗長的です。variableという単語が変数名に含まれてはいけません。tableという単語が表の名前に含まれてはいけません。NameStringのどこがNameよりも優れているというのか。

■発音可能な名前を使用する
オレオレ省略はやめてください。headerの事、getHdrはgetHeaderだとか、DtRcdはDataRecordだとか。例外もあります。例えば、indexはiと略されたり。
名前が長くなっても、オレオレ省略はやめてください。そもそも長くなりすぎる名前には、責務与えすぎという問題も気にしてください。

■メンタルマッピングを避ける
自分がつけた名前を、コードを読む人が心の中で(その人が知っている)名前に変換しなければならないような状況を作ってはいけない。ノイズになります。

■根拠のない文脈を与えない
例えばの話、プレフィックスやサフィックスを「整合性」としてつけるのはやめましょう。それはコードには関係ないので。ソレの役割を適切な名前で使用してください。




以上。
だいぶ要約して書いた。他の人と理解が違っている箇所もあると思うけど、そういう時は指摘してくれると助かります。
それにしても最後らへんの飽きた感w
けどいいや。