どう共通化する?しない?

コードを書いてると「これ、同じようなコードあるから共通化した方がいいな」ということがよくある。

共通化する?

(僕はJava好きなのでJavaを思い浮かべながら書くけど)親クラスにくくりだしたり、ユーティリティクラスをつくったり。

そうすることで、ロジックをひとつの場所にまとめることができて、仕様が変わったときにはそこだけ修正すれば大丈夫。平和。

コードレビューで気づくのも伝えるのもそんなに難しくないし、伝えられた側も「確かに」って対応しやすい。

 

どう共通化する?

ちょっと難しいなと思うのは「同じような処理だけど意味が違う」場合。

例えば、消費税計算で価格の8%を計算して返す処理と、8%の割引をするときに計算して返す処理とは、同じ「8%を計算する」という処理だけど、どう共通化するかはちょっと考えたい。

消費税が10%になったときに、割引も10%にはなって欲しくない(あ、いや、買う方としてはそうなってくれたら嬉しいけど!)。

その場合は「8%を計算する」という処理は共通化することができるけど、「消費税を計算する」と「割引を計算する」は共通化しないってことなんだろう(実際は、僕は「8%を計算する」という処理自体、共通化しないだろうな)。

これをコードレビューで見つけるためには、処理自体だけじゃなくて、意味を考える必要があるし、伝えるときにも意味のディスカッションをすることになる。

共通化しない?

んで、難しいなと思うのは、処理だけじゃなくて意味も同じようなものなんだけど、レイヤーやコンテキストが違う場合。

例えば、DBのデータモデルと、ドメインモデルと、ビューモデルで、同じようなモデルを持ってるんだけど、それを全部共通化して1つのモデルで表現しようとすると、どっかのレイヤーの変更が別のレイヤーにまで影響してしまう。

コンテキストって点だと、複数のアプリで「このロジックは意味が同じだから共通化しよう!」って安易に共通化すると、そのロジックが変更されるときに両方のアプリをリリースしなきゃいけなくなってしまったり。

別のチームに分かれてる場合は分かり易いけど、同じチームで両方見てる場合には、レビューでも伝えるのむずいかなぁ。

 

ここでちからつきた。おはよー。(*´∀`*)ノ

共通化の方法には

  • 同じコードベースで共通化
  • ライブラリとしてくくりだす(別プロジェクトに切り出す)
  • ライブラリとしてくくりだす(mavenリポジトリとかにおく)
  • サービスとしてくくりだす

とかあるね。今日もがんばるー!