【アプリケーション設計】リファクタしやすいコードを意識する
コードを書いていて辛い時、それは「リファクタ」です。
- 工数が余計に必要になること
- バグを踏む可能性があること
- 最終commiterが自分だったとき
などなど、辛いポイントがたくさんあります。
そんな辛い出来事をこれ以上増やさないためにできることは、「いまから高品質なコードを書く」だと思います。
少しでも変更しやすいコードを書くことは、将来の事業に対するコスト低減につながります。
気をつけるべきことリスト
わかりやすい変数名、関数名にする
a = 1
こんな変数名じゃ何を表しているのかわかりません。
「よしわかった!じゃあこうしよう!」
txprc = 1
(とくすぷりす...?)
ただ意味を持たせて、長ければ省略するみたいなことも同様に良くありません。
ここで意識すべきは「誰でも理解できる言葉で表現すること」です。
上記のコードはもっとわかりやすく
taxedPrice = 1
みたいな感じでいいはずです。これなら税込価格なんだな、と理解できます。
どうしても長くなる場合は段落、変数に分ける
class incrementCount { count = 1 count = count.next count = count * 100 p final_count }
変数名やクラス名はわかりやすいのですが、処理が少し長いですね。
また、それぞれ役割のまとまりがあるはずです。それを分解していきます。
class incrementCount { count = 1 count = count.next count = count * 100 p count }
幾分か読みやすくなりました。しかし、変数名が全て同じなので、最終的に何がしたいのか?理解しにくいままです。
目的ごとに変数を分ける
ここで、変数自体を目的ごとに分けます。
class incrementCount { first_count = 1 next_count = count.next final_count = count * 100 p final_count }
「最終的に100をかけたcountを出力する」ということが理解できるようになりました。
はじめから抽象化を心がける
このclassではcount.nextに100かけたものを出力しています。では、次にこれと同じようにcount.nextに200かけたいclassが出てきたらどうしましょう?
最悪なケースはこれと同じようなclassをもう一つ作って 100 を 200 にかえることです。
そうならないように、初めからなるべく抽象化するようにコードを書きましょう。
極度の抽象化は悪ではないと思っています。
単一責務(ひとつのクラスはひとつのことに集中!)
そして最後に、これはプログラミングの原則の一つでもある「単一責務」を意識することです。
名前そのままの意味なのですが、関数やClassなどそれぞれ一つの役割「だけ」を持たせるようにしようね、という原則です。
そういう点では先ほどのclassはあまり良いものではありません。class名から推測するに、引数で受けとった値にincrementだけをするclassがあってもいいかもしれません。
今自分が書いている関数、classの役割はなんだろう?というのを考えてみること、そして2,3個の役割があったらそれは「単一責務に反している」と注意してみることで、アンチパターンなコードを減らせると思います。