オブジェクト指向の言語が、他の言語とわかれる決定的な違いは、カプセル化によるデータの隠蔽と、継承にあル戸思います。
では、そもそも、オブジェクトは、なぜカプセル化できるのか?と考えると、そりゃーあなた、オブジェクトというのは、1つしか存在しない(一意に存在する)、その属性は、そのオブジェクトに閉じている(局所的に存在する)から・・
・・・と、仮に答えてしまうと(多分、これが正解でしょう)、ここで問題が起こります。
もし、クラス内に、まったく関係のない、他のクラスに依存する属性を持たせて、それをインスタンスにしてしまったら、どうなるでしょう・・・オブジェクトは、実在の世界からかけ離れたものができてしまいます。
たとえば、極端な話ですが、顧客クラスに、特売購入フラグというのを作りましょう。
これは、特売を買う人を、いち早く調べたいからという理由で導入したとします。
本来なら、これは受注した(受注明細の)商品に付けるべき属性ですので、受注明細につくようなものです。
(商品という普遍的なものでなく、受注した商品という受注明細の商品関連の属性となる)
そして、受注明細で、特売レコードをあつめ、そこの明細に対応する受注をした顧客をあつめて、
顧客データを取り出すべきものです。
でも、めんどっちいから、顧客クラスに、特売購入フラグというのをいれましょう。
DBにも、いれちゃいましょう。。。
とします。
一見、この修正は手っ取り早くて、うまくいきます。
でも、もし、特売の受注がキャンセルになったら、
特売購入フラグをOFFにしないといけません。
さらに、キャンセルされていても、
他に特売を買っていたらONにしないといけません。
そしてさらに、この場合、特売購入フラグがPublicになっていればいいけど、
privateになっていたら、受注時キャンセルのときに、
特売購入フラグが操作できないかもしれません。
じゃあ、全部publicにすれば・・・っていったら、カプセル化になりません。
つまり、オブジェクト指向で書くのであれば、カプセル化にして、情報を隠蔽するさい、隠蔽しても問題ないように、適切なクラスに属性をいれないといけません。
そして、その「適切なクラス」とは、
そのクラスを実際の実存する(あるいは想像物の)
オブジェクト(これをモデル化してクラスを作ったはず)に
インスタンス化した際、
そのオブジェクトが、対象となる属性を持っていること
(あるいは持っても差し障りない、持つべきもの)
ということになります。
そうしないと、へんなクラスに属性を入れてしまうと、隠蔽化されているので、データ操作ができなかったり、値をセットし忘れたりしてしまいます。
ということは、
(1)ビジネスの実態にあった、クラスを切り出す方法と
(2)そのクラスに対して、適切な属性をふる
→局所化して、隠蔽できるように、属性をふりわける
という技術がないといけません。もし、この技術がなく、てきとうにセンスでえいや!とクラスに属性追加してしまうと、そのときはよくても、データが隠蔽されているので、あとで値を直せなかったり(直すために大幅修正になったり)、気づかなかったり(気づきにくくなっているので)する可能性が大きくなります。
・・そーすると、デスマーチですよね。