駆け出しエンジニアだからこそ知って欲しいこと #5 -コードの書き方②-

f:id:MasayaStripes:20200411125945j:plain

こんにちは。マっさんです。
この記事は以下の記事の連載です。よろしければ、以下の記事から読んでみて下さい。
#1

masatech-note.info

 #一つ前の記事

masatech-note.info

 今回は前回から引き続き、コードの書き方の考え方について、ご紹介していきます。

名前こそ重要

f:id:MasayaStripes:20200610220232j:plain

コーディングでは命名(名前付け)が重要

皆さんは変数名や関数名はどの様につけていますでしょうか?

最初のチュートリアルや初学者には変数名はあまり気にしていないのでは無いのでしょうか?

命名はプログラミングをする上で最も重要な課題です。現役エンジニアでも細心の注意を払って命名をしています。

それではなぜそこまでして、注意を払わないといけないのでしょうか?

名前を付ける行為と名前そのものに両方重要な価値があるから

適切な名前を付けるということは、その要素が適切に理解されているからです。例えば、以下の様な関数があったとしましょう。

func GetPage(url){
    ......
}
もしかすると多くの人が命名したことがある関数名でしょう。
しかし、これだと、以下の様な疑問が出てきます。
  • このメソッドはページをどこから取ってくるのだろう?
  • ローカルキャッシュから?
  • データベースから?
  • インターネットから?

この様に多くの選択肢が出てきます。これでは良い命名ではありません。

もしインターネットから取ってくるのであれば、以下の命名が適切です。

func FetchPage(url){
    ......
}
もしくは次の命名をするでしょう。
func DownloadPage(url){
    ......
}
この様に明確にすることで、インターネットから取得すると考えることができます。
※フェッチという意味については以下を参照して下さい。

e-words.jp

そして名前そのものは、これらのコードを通じてプログラマ同士がコミュニケーションを円滑にすることができます。そのため、名前には最大限の配慮がなされないといけません。

そんなに良い名前を思い浮かべられない!どうすれば良いの?

確かに初学者にとって、適切な命名は経験が無いので難しいです。 では、どうすれば良いでしょうか?

それは、コードを書く前に名前を決めること。です。そしてその際に、常に「使う側」「読む側」の視点に立って命名して下さい。やり方としては以下の手順で命名しても良いでしょう。

  1. 名前を短いコメントだと思って、多くの情報を詰め込む様にして下さい。その際、複数候補を挙げると良いでしょう。
  2. 名前には、「効果」と「目的」を説明する様な名前にして下さい。
    (例 Download:効果、DownloadPage:目的)
  3. 長い名前でも良いですが、長すぎる名前は覚えにくいし、画面を大きく占領してしまうため、気をつけて下さい。以下の様な命名はやめて下さい。
    newNavigationControllerWrappingViewControllerForDataSourceOfClass
  4. 発音可能なものにして下さい。
  5. 検索可能な一般的な単語を使って下さい。
  6. 以上を元に複数候補を挙げた中から、「他の意味と間違えない名前」はどれかを気にして選んでください。

以上の手順を踏むことにより、より良い命名をすることが出来るでしょう。

かなり手間ですが、慣れると命名がパターン化して、早くて良い命名が出来ます。

 
以上が命名の重要性と、名前の付け方でした。
 

SLAP(Single Level of Abstraction Principle)

f:id:MasayaStripes:20200611185957p:plain


 どう意味?

このSingle Level of Abstraction Principle という意味は、抽象化レベルの統一という意味になります。
これは、コードを書く際に、高いレベルの抽象化概念と低いレベルでの抽象化概念を分離しましょう。ということです。
少し難しい説明ですが、簡単に説明すると、

  • ソースコードの機能レベルを同じにしましょう。
  • 同じレベルのソースコードの機能を同じ場所に置きましょう。

という意味です。

簡単なコードの様なものにすると、以下の様な感じになります。

function 高水準 (){ // レベル1の目次
    中水準1();
    中水準2();
}

function 
中水準1 (){  // レベル2の目次 -1  
    低水準1();
    低水準2();

}

function 低水準1 (){ // 本文内容
      // 処理

}

function 低水準2 (){ // 本文内容

   // 処理
}
 

function
中水準2 () { // レベル2の目次-2
         低水準3();
}

function 低水準3 () { // 本部内容
         低水準3();
}


 

なぜこの様にしないといけないのか?

もし機能がまちまちなものが乱雑に書かれていたらどうでしょう?少なくともコードを読みづらくなります。どういった機能があるかを読み解くにも苦労します。

では、上記の様にレベル別に分けたらどうでしょうか?

塊としてコードを読む事ができ、閲覧する事が容易になります。そして理解もしやすくなります。これがレベル別にまとめる利点です。

初学者には難しいですが、最初のやり方としては、

  • 小さな関数を機能別に作る
  • 画面毎や項目毎でクラス化させる

これくらいで幾分読みやすいコードになるでしょう。

まとめ

如何だったでしょうか?メインとしては命名を分かりやすいものにする。そして、ソースコードはレベル別に小さく、そして小さくしたものをまとめる。という風にしていけば、あなたのコーディング能力も上がり、読みやすいコードになると思います。

 

以下が今回紹介した手法が詳しくまとまっている本です。

是非手に取って読んでみて下さい。

(※ここから買っていただくと私のモチベーションも上りますww)