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

f:id:MasayaStripes:20200411125945j:plain

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

masatech-note.info

#一つ前の記事

masatech-note.info

今回はプログラムを書く上での原則、つまり基礎となる書き方を紹介していきます。

この原則は、大変重要なコードを書く上での考え方なので、覚えておいて下さい。

今回は2つご紹介します。

 

 KISS(Keep It Short, and Simple)

f:id:MasayaStripes:20200610220619j:plain

コードはシンプルに、短く保つ

Keep It Short, and Simple と言う意味は、「短く、シンプルに保つ」と言う意味です。

つまり、コードを書く時、最優先に「単純性」「簡潔性」を考えなければなりません。

これは、新規でコードを書く場合だけでなく、機能の修正、拡張する場合も常に考えなければなりません。 

 

何故シンプルにしないといけないのか?

今まで一度でもコードを書いていった方はわかると思いますが、初心者の頃、一つのファイルで全てのプログラムを書いていた経験があると思います。
そして、現在駆け出しエンジニアの方もその様な経験はあると思います。

この様に、コードを自分の思い思いに、自然に任せてコードを書いていくと煩雑になります。煩雑になると、どうなるでしょうか?

  • コードが読みにくくなる
  • 修正しにくくなる
  • 無理に修正すると、バグが増える

 一番ここで問題になるのは、「バグが増える」です。品質が悪くなると、自分が作った製品への信頼性が落ちます。

そして信頼性が落ちると、ユーザーが離れていき、丹生込めて作った製品を結果的に継続が不可能にしたりします。 

シンプルなコードは、各要素が最小限に抑えられています。そして他の要素同士の関連もシンプルです。よって、シンプルなコードは、

  • 読みやすい
  • 理解しやすい
  • 修正が容易
  • テストも容易

 また、コードを通じたプログラマとのコミュニケーションが楽にもなり、コミュニケーションのコストも節約できます。良いことずくしですね。

 

そしたらどうやったらシンプルなコードが書けるの?

 まず、プログラミングの羅針盤を「シンプル」としましょう。コードから余計なこと、過剰なことを可能な限り排除しましょう。

そのために、常に頭の中で「動作させるため、もっとシンプルなものは何か?」と問いかけましょう。

次に、以下のことを注意しながら、コーディングしていきましょう。

  • 新しく覚えた技術を使いたい 
    新しい技術を覚えたら使用したいがため、不要にトリッキーなコードを書いてしまうことがあります。しかし、コードは頭の良さをアピールする場所ではありません。ユーザーに価値を提供するものです。
    愚直にコードがシンプルであり続ける事に取り組んでください。

  • 将来の必要に備えたい
    今不要であるコードは、今書くべきではありません。
    ほとんどの場合いりません。必要になった時、必要になった分だけコードを書きましょう。

  • 勝手に要件を加えてしまう
    ユーザーに必要だと勝手に思い、勝手に余計なコードを追加してはいけません。要件を決めるのはユーザーです。
    要件にない余分なコードを書かないことが、シンプルに保つ秘訣です。

まとめ

如何でしたでしょうか?常にコードを書くときは、シンプルに保つためにどうしたら良いか頭の中に持っておきましょう。

 

DRY(Don't Repeat Yourself)

f:id:MasayaStripes:20200530193541p:plain

コードのコピペはダメ!

Don't Repeat Yourself の意味は、「繰り返してはいけない」と言う意味です。

つまり、同じコードを重複して書いてはいけません。

ここでは3つの例を挙げます。

 1つめとして、コード重複で最も多いのは、ひとまとまりのロジックを、安易に別の部分にコピペして使用した場合です。以下の疑似コードがその例です。

func A(){
   Proc 1
   Proc 2
   Proc 3
}
 
func B(){
   Proc 4
   Proc 2
   Proc 5
}

ここではProc 2が複数箇所にばら撒かれてますね。

2つめに、if文などの、同じ制御文が様々な場所に重複していてもダメです。例えば以下がその例です。 

func C(){
  if(a){
     xxx
   } else if (b) {
     xxx
   } else if (c) {
      xxx
   }
}
 
func D(){
   if(a){
     xxx
   } else if (b) {
     xxx
   } else if (c) {
      xxx
   }
}

同じ条件のif文が違う関数同士に組み込まれてますね。

3つめに、定数を直接コードに埋め込んであるのも、コードの重複にあたります。

func E(){
    if ( 値 < 16) {
     xxx
   }

   if ( 値 < 16) {
    xxx
   }
}
}

 以上の様な重複するコードは避けてコーディングを行いましょう。


どうして重複したコードは避けないといけないのか?

重複したコードがあると、コードを改善したり、修正することが困難になります。困難の具体例として以下が挙げられます。

  • コードを読む作業が難しくなる
    同じ様なこどが複数あると、量的により多く読まなくてはなりません。また、複雑にもなり、単純にコードを読む作業が難しくなります。
  • コードを修正する作業が難しくなる
    同じなコードが複数あると、その複数箇所を正確に修正しなければ生合成が取りません。もしかしたら、修正が必要ない箇所もあるかもしれません。そうした修正の要・不要を個別に判断していく必要があります。
    さらに、重複するコードに軽微な違いがあった場合、さらにコードを読み込まないといけません。それにより、難易度はかなり高くなります。最悪、プログラムが解読不能で修正不能になる可能性もあります。

そしたらどうしたら防ぐことができるのか?

それは、コードを抽象化することです。 それにより、重複は防げます。

具体的には、処理のまとまりに名前を付けて、

  • 関数化
  • モジュール化

させます。データであれば、データに名前をつけて定数を定義させます。

これにより、コード量が減り、より読みやすいコードになります。

また、抽象化させる事により、新しい機能追加時に、同じ機能部分を再利用することも可能です。

 

まとめ

如何でしたでしょうか?コードを抽象化させ、より読みやすいコードにしましょう。

まとめ

これら2つの考え方を、常に頭に置いてコーディングをしていきましょう。

この文章は以下の本を参考にしています。
より詳しく知りたいと言う方は、参考にしてみては如何でしょうか?

 

 以上です。