分かりやすいプログラムを書くために意識する事8選！！

・ "分かりやすいプログラム"とはどんなの？
・ 何に気を付けて書けば"分かりやすいプログラム"になるのだろう？

プログラミングを進めていくと"分かりやすいプログラムが重要だよ！"と言われることがあると思いますが、最初はいまいちピンとこないですよね。
今回は「勉強会に参加して学んだ事」や「オリジナルアプリをレビューしてもらった際に学んだこと」を元に、自身も日々意識すべき内容として分かりやすいプログラムについて気を付けるPoint8選としてまとめていこうと思います。

---

## 分かりやすいプログラムとは

###### 結論： コードを読む人を意識する


数ヶ月前の自分のコードを見た時に「読みにくいな..誰がこんなコード書いたんだ？！」とならないようにしたいですね。
そして、チーム開発する場合においても読みにくいコードだとチームのメンバーにも迷惑をかけたり、開発する上で誤解が生じやすくなります。
常に読み手を意識してコードを書く習慣をつけておくのは大切だと思います。

ここからは、具体的に何を学んで、何を意識するべきか書き出していこうと思います。
（基本的な内容もありますが過去の自分で感じた事は、他の方の参考にもなると思って載せます）


## Point1： ファイルの分割

```ruby:main.rb
require "./messages"
require "./controller"

class Game
  def initialize(style, count, data)
    @style = style
    @count = count
    @data = data
  end

end

```
**注目箇所：**
ファイルが`main.rb`にも関わらず`Gameクラス`が入っていますね。

このままだと、`main.rb`を見たときに「ん？？mainファイルにGameクラス？これには何か意味があるのかな？」と疑問に思ってしまいます。

main.rb内でGameクラスを定義しなくてはいけない理由も無く、Gameクラスだけで使用することを考えるとファイルを分けた方が分かりやすいですよね。


## Point2： コメントとして書くべき内容

```ruby:main.rb
# コントローラーを生成
controller = Controller.new

```
**注目箇所：**
`controller = Controller.new`のコメントが「コントローラーを生成」
..そのままです。

無駄なコメントはもちろんですが、コメントの多すぎもよくありません。

人によってはコメント肯定派と否定派がいるようですが、書くべき状況とすれば
**そのコードがどういう事を意図しているかなど、コードだけでは読み取れない内容に対して書く**ことを意識してみるといいと思います。



## Point3： 分かりやすいメソッド名にする

分かりやすいメソッド名というのは、**英語を読むかの如く命名する**ことが大切です。
下記が参考例です。

```ruby:game.rb
require "./messages"
require "./controller"

class Game
  def initialize(style, count, data)

  end

  def question_style
    # 各問題に対する処理
  end

end

```

前提条件：`game.question_style`を行うと、クイズの問題定義の形式を振り分けた上で**ゲームの処理が開始する**状況の場合です。
**注目箇所：**

ゲームプログラムにおいて`question_style`というメソッド名を見た時、皆さんは何の処理をしているメソッドだと思いますか？

質問の様式を決めている？..質問の様式を選択してる？..
少なくともメソッド名を見ただけでは、"**各問題に対する処理が入っている**"とはわからないですよね。

つまり、
中のコードを読んだ時に初めて何の処理を行うメソッドなのかがわかるメソッド名＝"分かりにくメソッド名"になってしまいます。

メソッド名が`question_style`だと、**コードを書いた側目線！**
"問題定義の形式を決めて回答処理を切り替えるようにした"という実装の都合になってしまいます。

今回の例でいうと、メソッド名は`start`や`play`などを使うとどうでしょう？
ゲームプログラムにおいて`start`というメソッド名は"ゲームをスタートするメソッド"なんだな。と分かりますね！

メソッド名で表現するのが難しい場合もあると思います。
どうしても必要なメソッドで名前だけでは分かり難い場合は、コメントをうまく使うのも有りだと思いますが可能な限り**メソッドの中で何が行われるのかをメソッド名とパラメータを使って読み手が分かるようにしていきましょう。**

補足ポイント：メソッドを命名する場合は**動詞**を意識しよう！



## Point4： 分かりやすい変数名にする
メソッドの命名と被りますが、
分かりやすい変数名というのは、**英語を読むかの如く命名する**ことが大切です。

変数名は仮の入れ物だと思って適当に命名すると、何の情報が入っているのか全く伝わらなくなってしまいます。
「番号が入っている変数なんだから`number`だろう！」と安易に決めないようにしましょう。
仮に変数名を`number`とした時に何の番号なのか？が分かりません。
データの番号？ ユーザーの番号？ 配列内の要素の数かも？

変数名を見た瞬間に何の情報が入っているのか分かる名前をつけることは難しいです。
現場のエンジニアの方の対談で聞いた際も、「メソッド名や変数名には悩む時もある。」とおっしゃっていました。
それほど、命名は重要だということですね。

補足ポイント：変数を命名する場合は**名詞**を意識しよう！



**スコープを意識しよう。**
ここではスコープに関しても詳しく書くことはしませんが他の方の記事を載せておきますね！
スコープに関しての参考記事： [Qiita](https://qiita.com/Haya4Taka/items/652f7b9147f5b1750f1d)

スコープは簡単にいうと**変数の有効範囲**になります。その範囲を超えるとその変数は使えません。

有効範囲を理解してコードを書かないとバグや不具合にも直結してしまいます。



「変数名の大切さはわかった..
とは言え、どうしても良い変数名が思いつかない場合はどうしたらいいでしょうか？」

そんな時は、変数にしたい内容を日本語で表現して、それを変数名に変換してくれるサイトがあるのでそちらを使ってみるのも良いかもしれません。
それが**プログラマーのためのネーミング辞書 codic**です。
参考サイト： [codicへ](https://codic.jp/)



## Point5： メソッドや変数の命名の際、単語数は2単語..程度
フワッっとした回答になってしまい申し訳ないのですが..

前提：**言語によって違いがあるようです。**
iPhoneのアプリ開発だと補完してくれたりするので長くなるようです。
今回はRubyの場合で説明します。
注意： 以下、状況にもよると思いますので参考にして下さい。

・ 単語は極力短い方が読みやすい(短くて伝わらなければ本末転倒ですが..)
・ 命名したその変数を使う箇所が近く(メソッド内や次の行で使うもの)であれば短くても良い
・ ローマ字にならないように

2単語の例：
`game_data` みたいな形です。


## Point6： コードを書く！！！
体系的な感じになりますが、やっぱり自分で書きまくる！かと思います。
人のコードを読めるようにするためにも、自分が書きまくる！
もう..書くしかないです。


## Point7： 人のコードを読む！！！
Githubに公開されているものもたくさんあります。
正直なにがなんだかわからないことも多いですが、自分の制作しているものに似ている物もあると思うので、検索してみましょう！
私自身が色々見て学びたいけど、公開されているコードなんてどうやって探すんだ？という時期があったので載せておきますね！

Githubでコードを探す： [Github search](https://github.com/search)

こんな書き方あるんだ！　この省略の仕方いいな！　こっちの書き方の方が見やすいな！
など発見があると思います！


## Point8： コードのレビューをしてもらう！！！

知り合いやスクール、オンラインサロン。レビューしてもらえる環境があれば最高です！
他の方にレビューしてもらうのは恥ずかしい気持ちも無くはないですが、環境があればお願いしてみましょう！

自分は独学だし、知り合いにエンジニアいないし..

そんな方は、GitHubを活用しましょう！
自分のコードを公開すると、他人がコメントやフォークを行うことができますよ！

チームで開発することは必ずあると思います。
その際、GitHubは必要になってくるツールなのでこれを機にやってみるのもいいと思います。

Github： [Github](https://github.com/)



## あとがき
少しでも参考になれば嬉しいです！！

プログラミングは苦しいこともたくさんありますが..汗
やっていて本当に楽しいですね！
楽しんで頑張って継続しましょうね！！