skillup

技術ブログ

プログラミング全般

オブジェクト指向 値オブジェクトの活用と場合分けに関して

投稿日:

オブジェクト指向 その1
オブジェクト指向 その2
オブジェクト指向 その3

でオブジェクト指向に触れたんですが、基本から勉強しなおす必要があると思い、まとめ&追記

参考文献

現場で役に立つシステム設計の原則

software designの記事書いた人と同じ人でしたね・・・

まだ5分の1ぐらいしか読んでないですが、オブジェクト指向だけじゃなくて、コーディング全体について気を付けるべき点を書いてくれてますね。

今ある現代的なプログラミング言語はC以外ではほぼオブジェクトだと思うので、必須といえるでしょう。

値オブジェクトに関して

要点

  • 基本的な値を書くときにはint,stringなどではなく値オブジェクトを格納する
  • 値の制約を強くする→不具合などを避けることができる。
  • ループなどで値を何度も変更しない(破壊的代入)→値が違う = 意味が違う場合、別変数を使うべき
  • 同様の意味でインスタンスは一度作ったら値を変更しない。
  • インスタンス変数はコンストラクタで設定し、変更しない。Setterを使わない。
  • 例えばTelephoneクラスだったら電話番号に関するクラスをまとめてここにすべて記述することができる。
  • コレクションをそのまま渡さない。コレクションに変更が加わる場合はドメインオブジェクト内で行う。
  • 業務で扱う関心事(ドメインオブジェクト)とプログラム上のクラスを対応させることができる。

参考リンク

設計パターン 「ファーストクラスコレクション」
http://fukuchiharuki.me/wiki/index.php?%E8%A8%AD%E8%A8%88%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

感想

しょっぱなから知らないことが多かったですね・・・変数名をわかりやすくつけるとかメソッドを意味単位で短く、変数のスコープを小さくするとかはさすがに意識していましたが、値オブジェクトという考えはありませんでしたね。

Javaを学習したときに上司にMapが多いね・・・と注意をうけたことを思い出しました。クラスにしたほうがいいよ。。というのがその時の意図です。このほうが値に対して制約をつけられるからですね。

確かに私の場合、最近のちょっとしたアプリではPHPで日付を文字列で書いたりしてメソッドのたびに条件判定をかいていましたね・・・これはだめなんだろうな・・と思いつつ、改善する方法がなかなか見当たりませんでした。いや普通に日付のクラス使えよって話です。

nullチェックとかも値自体をオブジェクトとして制約を付ければいちいちやる必要がありません。

また値をむやみに書き換えない・・・というのもあまり意識がたりませんでした。とくに参照での代入とか便利なのでよくやるんですが、たしかに繰り返すと値を追うのが大変になります。便利な反面諸刃の剣ですね・・・

オブジェクト=業務で扱う関心事というのは今まで全く意識していなかったです。String telなどと書くことはありますが、stringは文字列であって電話番号ではない!ということですね。

上記のアイデアは徹底しすぎるのは問題ですが、常に心掛けておきたいなと。

ここら辺のソースですがPHPのオープンソースだとECCUBE3が比較的わかりやすいかなと思います。もちろん完全な値オブジェクトを使っているわけではないのですが、のちに出てくるドメインをEntityで捉えているので勉強になります。

場合分けに関して

要点

  • if文ではネストが深くなることをさける
  • 条件式自体をメソッドにしてしまう
  • elseはなるべくつかわない→場合分けが生じる場合はなるべく、オブジェクトで分離することを考える
  • 分岐したクラスに共通性がある場合はインターフェイスを考える
  • コードやステータスなどはenumが使える場合は区分などをこのクラスを使って考える(値の制約をなるべく強くする)→多態をシンプルに記述できる

感想

これまた知らない考えでしたね。ネストが深くなることを避ける・・・というのは当然意識していましたが、区分やステータスの分岐でオブジェクトで分類、という発想はしていませんでした。

ステータスの状態遷移なんかも状態ごとに遷移できる状態を書いておけば間違えることはありません(本書のp65)。

本書ではわかりやすく書いていますが、オブジェクトで分類にしても共通のインターフェースや親クラスをもっている場合、処理を共通させてしまうように、と書かれています。

-プログラミング全般
-

執筆者:


comment

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

関連記事

no image

リーダブルコードまとめ

リーダブルコードほぼ読み切ったのでまとめを。チェックリスト化して、常にこれを見ながらコードは書いたほうがよさげ 前半のまとめや参考リンクでみたものとマージします。 Contents1 変数の名称2 コ …

no image

オブジェクト指向 クラスの設計と業務ロジックの整理

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日は主にクラスの作り方について。 Contents1 クラス設計と業務ロジック1.1 要点1.2 感想 クラス設計と業務ロジック …

no image

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

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

no image

フォームの処理について

本日はフォームの処理に関して。主に一覧検索画面のフォームについてです。 フレームワークでフォームの処理をする場合、変数の初期値やバリデーションなどをあらかじめ読み込むオブジェクトを設定しておき、変数が …

no image

バッチスクリプトで気をつけたい点

実務でバッチ処理を作る際に気をつけるべきと思ったこと。 基本的にエラーをいかに捉えていかにログに吐くかを最初に考える。まずはエラーありき。失敗するもの、想定した値がこない、あるいは値がないを前提として …