【アプリケーション設計】リファクタしやすいコードを意識する

コードを書いていて辛い時、それは「リファクタ」です。

  • 工数が余計に必要になること
  • バグを踏む可能性があること
  • 最終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個の役割があったらそれは「単一責務に反している」と注意してみることで、アンチパターンなコードを減らせると思います。