コードを綺麗に書くために責任範囲を考える

最近、一緒に働いている人に指摘されました。
そのサービスクラス、責任範囲が広すぎじゃね?
なんのことだと思いましたが、話を聞いて理解できました。サービスが操作している対象が大きすぎたため、指摘を食らったのです。

例えばこういうこと。productというドメインcartというドメインがあって、それぞれがサービスクラスを持っていたとします。で、実装しているうちにcartサービスの中でproductの情報を操作するメソッド(割引があったから値段を変える、商品在庫の数を変更する、などなど)ができてしまったとします。ところが、本来ならこういったメソッドはproductのサービスに実装されるべきで、この時のcartサービスはcartという責任範囲を超えてしまっていることになります。

これをやってしまうと良くない点が幾つかあって、一つは保守やメンテが非常にしにくくなること。修正を加える際に、「product関係だからそのサービスだろ?」とか思っても、お目当てのメソッド見つからなかったりします。探すだけでも一苦労です。

次に、例のよう場合だとcartサービスが見にくくなること。cartのサービスなのに何でproductのメソッド書いてんだ!ってなります。全体も長くなるし、所々に責任範囲を超えたメソッドがいると、作業がしにくくなります。

あとは、そのメソッドを他のところで使いまわそうとした時に、関係ないサービスからメソッドを読んでこなきゃならなくなること。productを操作したいのにcartのサービスを読んでこなきゃならない…なんでことになります。

なので、それぞれが受け持つ責任範囲をしっかり考えて、それを超えない、超えそうになったらちゃんとした場所にメソッドを追加するようにしましょう!