skillup

技術ブログ

アーキテクト設計全般

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

投稿日:2016年5月27日 更新日:

ちょっと最近、仕事でソースの書き方がいい加減になってきたのでオブジェクト指向について考え方を再確認しようと思います。

参考文献

SoftWareDesign 2015年9月号

何も考えずにプログラムを書いていくと下記のような問題点にぶつかります。

  • 仕様の変更、追加による工程数の増加
  • どこに何が書いてあるかわからない
  • 同じ修正があちこちで必要
  • 変更後の副作用がこわい。変更すると思わぬところで不具合発生

このような問題点を開発するために、オブジェクト指向では下記のような点に注目してこの問題の改善に取り組みます。

関連するデータとロジックは同じクラスに書く

オブジェクト指向ではデータとロジックを1つのクラスにまとめることを重視します。

利点としては下記のような点が挙げられます。

  • データとロジックを別々のクラスに分けるとデータを操作する、ロジックがあちこちで重複する。
  • オブジェクトのインスタンス変数を変える操作は状態を変えることなので、プログラムの動作が不安定になりやすい。
  • データを引数で渡すことを繰り返すと、データを使った判断、加工、計算のロジックがどこに書いてあったかをみつけるのが大変。

外部からデータを変更しインスタンスにいれるのではなく、データとデータを加工計算するロジックを同じクラスに書いておけば、そのクラスだけに注目すればよく、変更コストも最小限で済みます。

メモ

オブジェクト指向以前ではデータをすべてグローバル変数にいれて使っていたようです。これですと当然、値が書き換わる可能性があり、危険です。

その経緯があり、メソッドの中に変数を置くことのできるローカル変数と値渡しが誕生しました(引数の値の渡し方ですが、元々はすべて参照渡しだったようです。)。

これにより、値の影響範囲を抑えることには成功しましたが、逆に値の残存期間が小さくなりすぎる(メソッドを通ったら消えてしまう)という悩みも存在することになりました。そういった難点もオブジェクト指向が生まれた背景の1つのようです。

オブジェクトで作られたインスタンス変数は「値の影響範囲を抑えつつ、なおかつ残存期間が長い変数」ということでローカル変数とグローバル変数の両方のメリットを併せ持っています。

参考文献 オブジェクト指向でなぜつくるのか

データの制約

クラス内に作られるデータはstringやintなどといった各プログラミング言語で用意されているデータ型で定義します。ただし、これらをそのまま使うことには「業務的に正しくないデータが混入しても動いてしまう」というデメリットがあります。

例えば誕生日をいれる処理があった場合、通常の日付型(JavaのLocalDate)で表した場合、未来の数字をいれることも可能ですし、数千年前の数字をいれることも可能です。これらは通常の誕生日としては異常なデータですが、このようなデータの入力も可能になってしまいます。

そこでオブジェクト指向らしい設計は汎用的なデータ型であるLocalDateを使いつつも、独自の誕生日クラスを作ることです。

ソースサンプル例

例えば日付に関して上記のような制約をするだけでも「必須」であり「過去でないとダメ」という条件を加えることができます。

これに対して月や年を出力するというようなメソッドを中にいれておけば、より正確なプログラミングが行えますし、誕生日に関する処理はこのクラスをみるだけですべてがわかります。

-アーキテクト設計全般

執筆者:


  1. […] オブジェクト指向 その1 オブジェクト指向 その2 オブジェクト指向 その3 […]

comment

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

関連記事

no image

オブジェクト指向設計 単一責任のクラスの設計

オブジェクト指向をするうえでの大事なポイントなど Contents1 単一責任のクラス設計1.1 メモ1.2 実際のコーディング上のコツ1.3 感想1.4 参考文献 単一責任のクラス設計 メモ 単一責 …

no image

自動テストをやる上で今まで障害だったこと

自動テストについて、考え方自体は5年以上前から知っていましたが、プロジェクトで実際に使われているのを見たのは今年4月になってからでした・・・ 自動テスト完備なんて昔は夢物語だと思ってたんですけどね・・ …

no image

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

オブジェクト指向 その1 オブジェクト指向 その2 オブジェクト指向 その3 でオブジェクト指向に触れたんですが、基本から勉強しなおす必要があると思い、まとめ&追記 参考文献 現場で役に立つシステム設 …

no image

クリーンアーキテクチャーがらみの話題など

クリーンアーキテクチャに関してメモ。 自分がプログラミングを学習したのは10年ほど前ですが、当時はいわゆるMVC(Model – Controller – View)でアプリケ …

no image

抽象性と可読性のトレードオフに関して

私自身プログラムを書く場合、とにかくコードを書く量を制限したいという思いが強く、多少でも共通化できる箇所がある場合はなるべく共通化するようにしておりましたが、時と場合によっては過剰に共通化したことによ …

アーカイブ