skillup

技術ブログ

プログラミング全般

オブジェクト指向について その3

投稿日:

今回は場合分けによる変更コストとオブジェクト指向のメリットについてです。

例えば給付金が発生して、その金額を死亡時、退職時、通常時で場合分けするとき、if-elseで書けば下記のようになります。

この場合、早期リターンで書くと実はelseを書く必要はありません。

「死亡した時」はただちに「死亡時の金額」を返す、「退職した時」はただちに「退職時の金額」を返す、それ以外は「通常の金額」を返す。

金額が確定したらすぐにreturnをする場合のコードは下記のようになります。

これだけでもずいぶんすっきりしたコードになりましたが、さらにelse句を取り除くと、下記のように書けます。

特殊な場合をreturnで返し、else句を使わずに早期リターンするこの書き方をガード節といいます。

処理の独立性

ガード節と早期リターンを適用した最後の書き方は非常にコードがすっきりとわかりやすくなりました。

if節の中にさらにif節を書いていくような構造は非常にわかりにくくなります。単文を並べたコードのほうが見やすい処理となるでしょう。

また単文のほうが処理の独立性も高くなっています。

ここに離婚した時を加えても下記のように追加してあげればいいだけです。

この場合、3つの文はどこに入れてあげても処理が問題がありません。このように同じ場合分けでも、プログラムの影響度が低い単結合にすることがオブジェクト指向のアイディアです。

オブジェクト指向らしい場合分け

さらにオブジェクト指向を使った場合分けでは、場合ごとのロジック、それぞれ独立した別のクラスにすることが可能です。たとえば死亡時の金額を返すクラスDeadAmountクラスをつくってしまうのです。

この場合DeadAmountクラスを修正しても、他のクラスに影響がでません。場合ごとの処理が完全に独立されており、影響度が限定されるのです。

ただし、場合ごとにクラスを分けると複数のクラスを使い分けるのは大変になります。そこで3つの場合ごとのクラスの違いを意識せずに仕組みがインターフェイス宣言です。

給付金額を知りたいクライアントクラスは下記のようになります。

クラス図で書くと下記の通りです。

クラスクライアントはPayAmountという型を意識しているだけで死亡時、退職時、通常時の場合分けは意識していません。

しかしPayAmount型で参照する実装クラスのオブジェクトを静止するときに、ifかswitchが必要になります。Javaの場合はenumという便利な仕組みがあるため、ifなしで下記のように記述することができます。

-プログラミング全般

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

オブジェクト指向 アプリケーション間連携(主にWebAPI)

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日はプレゼンテーション層、いわゆるMVCのViewにあたる部分。 Contents1 アプリケーション間連携(主にWEBAPIに関 …

no image

コードの見た目について

リーダブルコード4章。コードの見た目について。 自分は結構注意されますね。多いパターンとしては空白の位置などがいい加減だったり、今はありませんが、以前はコードの末尾にスペースを空けてセミコロンをうつ変 …

no image

短いコードを書く

私が普段コードを書くときに考えていることは常にいかに短くかけるか、ということといかにバグを生み出さないかということです。 基本的にはできるだけ、短くシンプルに書くようにしています。 そうすることであと …

no image

コーディングルール 前半まとめ

リーダブルコードを3分の2ぐらいよんだので現時点でのまとめを。 Contents1 いいコードの定義2 具体的な手法2.1 変数の名称2.2 コード自体の見た目2.3 コメント2.4 制御フロー2.5 …

no image

コレクションの頻出処理に関して

PHPでコレクションを使っていますが、慣れると本当に便利ですね・・・まあforeachとかでグリグリやってもいいのですが、無駄にコードが長くなります。 自分がコレクションでよく使う再頻出のメソッドなど …