オブジェクト指向を学習中の初心者です。クラスとかインスタンスだとか、基本的な概念はそこそこには理解できてるつもりです。
そして、実装にあたってオブジェクト指向のエクササイズの9つのルールなるものを知り、それに関するサイトを色々と見てみました。
そこで、このルールに乗っ取るとたくさんのクラスが生まれ、クライアントから樹木状に伸びていくと思います。そうするとそのプロジェクトを初めて見る人にとっては把握するのがむしろ大変になりませんか?
扱いやすいようにしたとしても中身の細かい仕様を見たいときはあると思いますし、そうしたときにAを理解するにはB1とB2を理解する必要があって、B1にはC1とC2があって...というようでは扱いづらいのではないでしょうか?それとも、この手法は一般的には用いられていないものなのでしょうか?
『オブジェクト指向』タグがあるので、それをつけてみると良いかもです。
あ、本当ですね!英語名で検索してました。ありがとございました!
> そのプロジェクトを初めて見る人にとっては把握するのがむしろ大変になりませんか?
質問者さん自身が書かれているように、あくまで「初めて見る人」にとってであって、長らく付き合う人にとってはそうではない可能性の方が高いです。
同じプロジェクトとずっと付き合っていく場合はまさしくそうだと思いますが、他のプロジェクトに取り組んで、またその後前のプロジェクトに戻って機能を取り付けたいとなったとき、それぞれのクラスの仕様やどのオブジェクトがどのオブジェクトに作用しているかなどを覚えているかっていうと厳しいんじゃないでしょうか?不躾な質問でしたら申し訳ないです
クラス分けしてプログラム作っている人達は分ける事が目的ではないですから、分けない方が良いと思えば分けないですよ。
その点について誤解なく質問されてますか?
確かに言われてみればそうですね。
では例えば、「全てのプリミティブ型と文字列型をラップする」というルールなどがありましたが、これもある程度無視しても良いんですかね?個人の裁量である程度柔軟に取り組んでいく形ですか?
不躾な質問とまでは思いませんが、質問の主旨としてはむしろ「オブジェクト指向で細かくクラス分けすることについて、いずれたくさんクラスが分かれてくると、そのプロジェクトを始めて見た、あるいはあまり理解が及んでいない人にとっては理解しづらくないでしょうか?」と言うアンケート的な質問なのでしょうか。つまり、自然とクラスが分かれてきてそのことによるメリットを享受するか否かは問題ではない、と。
分類してわからなくなる規模なら、分類しないともっとわからないと思います。
ああ、hentaimanさんが既にコメントされていましたね。その通りだと私も思っていて、「オブジェクト指向プログラミングをするにはクラスを分けなければいけない」という発想からだと「なぜ分けなきゃいけないの?」の疑問につながります。そうではなく、自然と考えると対象によっては継承を含んだクラス階層になったり別のクラスに自然に分かれていきます。そこまで考える必要が無いならこだわる必要はないです。「オブジェクト指向のエクササイズの9つのルール」とやらを見てみましたが、どちらかというとコーディング標準に近い指針だと思います。
そういう意図ではなくて、自分のスタンスとしてまず複雑に枝分かれしたプロジェクトは作った本人であっても細部まで記憶することは難しいことではないのかというものがあって、分けてメソッドで記述されることによるコード単体の可読性の向上やテストが行いやすいなどのメリットがあるにしても扱いづらさがどうしても無視できないのではないかという質問です。ただ、y_waiwaiさんもおっしゃっていた通り、単純に慣れれば問題になくなるのであればこの質問は解決にさせていただこうかなという思いです
なるほど、分けることは自然に行われるものであって目的になってしまってはいけないんですね。納得しました
複雑に枝分かれし、多くのクラスが密接に依存しあって、すべて記憶しないと読めないのはただの失敗でしょう。適切にカプセル化できていないだけです。
人に何か話すとき、とりとめなく時系列で話しながらあちこちに話が飛ぶようなやりかただとわかりにくくなります。
しかし話の流れと要点を整理し、まず主題が伝わってから細部を説明する方法をとるとわかりやすくなります。
ソースコードを読む際にも、実行される順にひたすらフローを追わなければならないものと、適切にモジュール化されているものでは読みやすさが違います。細かな部分をすべて隠蔽したまま概観をつかむことができれば、細部の実装を飛ばして読むことができます。
細かくクラス分けされていない場合、隠蔽された部分がそれだけ少ないということなので負担は増えます。
確かにそうですね。基本的な部分を失念していました。非常に納得しました。よろしければZuishinさんに回答をしてもらって、BAを差し上げて終了とさせてもらってもよろしいでしょうか?
dodox86さん、hentaimanさんの意見も非常に参考になりました。長い質問に丁寧に答えてくださって本当に助かりました。ありがとうございました。
できれば全員にBA差し上げたい所ですが、個人的に納得のいったZuishinさんにBA差し上げたいと思います。皆さん本当にお付き合いくださってありがとうございました
ここは質問修正依頼のコメントなので、BAにはできませんよ。
設計上、クラスにする必要があるからクラスで分けているだけで、
それ以外の何物でもないと思いますが。
クラスベースなら、クラス中心の設計にならざるを得ないのもありますし、
言語にもよるかと。
クラス分けすることが目的になってはいけないだけであって、
その設計が必要な要件だったからそうした、という基準が、プログラミングには必要だと思います。
他にも有用な回答がつくと思うので、もう少し待ってみたらどうでしょうか。私のコメントは、クラス分けする利点のほんの一部でしかなく、実際にはテストやポリモーフィズムや依存性注入の観点からクラス分けを考えることが多いのではないかと思います。
miyabi_takatsukさん
確かにそうですね。hentaimanさんも仰っていたとおり、手段と目的を履き違えてしまったようです。貴重な意見ありがとうございました。
Zuishinさん
わかりました。もう少し寝かせてみようと思います。ありがとうございます
> 「全てのプリミティブ型と文字列型をラップする」というルールなどがありましたが、
前提条件無しにそれだけ言われても判断つきませんが、問答無用でそれをルールとしているなら間抜けですね。たまたまそれが有効だった開発を経験をした、時の止まったおじいちゃんプログラマーが決めたルールとか?
> 手段と目的を履き違えてしまったようです。
とは言うものの、先人達の経験によって築き上げられたデザインパターンは基本的に有用なものなので、デザインパターンに沿って作る事を目的としても結果オーライな事がほとんどでしょう。
この辺は疑問を感じて質問するよりも手を動かして経験する方が良いかと。
なるほどです。とりあえず、既存のプロジェクトを細かいクラスにリファクタリングしていこうと思います。いざやってみるとどこまで区切ってクラスで取るかなど色々と難しいですが、自分のできる精一杯デザインパターンを踏襲して経験を積んでいこうと思います。
回答4件
あなたの回答
tips
プレビュー