- 締切済み
クラスの行数は?
クラスの行数の目安・・・というのは変かもしれませんが、どれくらいなんですか? 汎用性を求めるほど、小さくなるとは思うのですが、それでいいのでしょうか? 私は、書籍をみると最初に『歩くクラス』『自動車クラス』、とか書かれているので、大きなものと思っていました。 しかし、今日立ち読んだ本には、数行のクラスも多いとか。 私は、これは違和感があります。 一つは、クラスを作る際にメモリーを使うので負荷がかかるのでは? と、クラスの変数名を考えるのが面倒(クラスを呼び出すのも手間がかかるし。)・・・、の2点。 最近のPCの性能と、名前付けは慣れなんでしょうが・・・。 本当は、『歩くクラス』ではなくて、間接の角度を変えるクラスを拡張させていけばいいって感じなのでしょうか? もっと言えば、「超ベリー」って何度も使うから、『チョベリ・クラス』で。って感じでいいのでしょうか? 『超ベリークラス』を読み込んで、 超ベリー(喜) // => 超ベリーグッド 超ベリー(悲) // => 超ベリーバッド こういうのは、汎用性は高まっても、処理の無駄だと思うのですが・・、。 実際は、どうなんでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- dennou2000
- ベストアンサー率62% (18/29)
>クラスの行数の目安・・・というのは変かもしれませんが、どれくらいなんですか? 決定的な基準はありませんね。 ただ、これは作る側の都合に近いのですか、1メソッドは、エディタ一画面に収まる ぐらいにするというのはあるかも知れません。 そのくらいが人間の把握力だということです。 クラスは、メンバ変数とメソッドの集合体ですから、結果として行数の目安はなくなって しまいます。 >汎用性を求めるほど、小さくなるとは思うのですが、それでいいのでしょうか? 一概にそうとも言えないですね。 クラスの記述=プログラムの動く世界の登場人物の記述だと(わたしは)捉えています。 仮に人間というクラスを設計して、汎用性を持たせようとすると、人間の様々な動きを 記述したメソッド(おそらく仮想関数ばっかりで定義だけで実装はからっぽでしょうけど) を沢山書くことになります。 従って、行数は増えます。 ただ、実装をする側のクラスと較べれば行数は少ないかも知れないとは言えます。 だから、汎用性を求めると「単純に」小さくなるとまでは言えないと思います。 それと、Javaでfunctionerクラスというものを作る事があります。クラスというより 汎用(雑用?)メソッドの集合体みたいなもので、Cでいうライブラリに近いものです。 これは、汎用性を求めた結果、いろいろなメソッドが実装を伴って、組み込まれすから 行数的には膨大になります。 >一つは、クラスを作る際にメモリーを使うので負荷がかかるのでは? いや、手続き指向で記述できるものを、オブジェクト指向で記述したからといって、 オブジェクト指向固有のメモリ負荷(使用メモリ量の増大)がかかるということはありません。 手続き指向もオブジェクト指向も果たそうとしている事はプログラムを動かす事ですから 手続き指向で必要だったものは、やはりオブジェクト指向でも必要なのです。 そこに、差異がない限りメモリ負荷がかかるというのは適切でないと思います。 但し、これはコンパイラの実装とかによりますが、オブジェクト指向固有の機能、継承や 多相性(多態性)やカプセル化を実装するコードを生成するため、その点のオーバー ヘッドがあるかも知れないとは思います。 また、javaに顕著ですが、javaはガーベッジコレクションといって、使わなくなった クラスというかインスタンスを自動的にメモリ上から開放します。 また、クラスは使用された段階でメモリにロードします。 その点ではメモリ使用効率はいいと言えます。 一方、手続き指向のプログラムだと、実行ファイルを最初に一括ロードするか、OSに 頼ってページング等でメモリ効率を図るしかありません。 この点では、手続き指向の方がメモリ負荷は大きいです。 >クラスの変数名を考えるのが面倒(クラスを呼び出すのも手間がかかるし。) いや、クラスの変数に対応するものは、手続き指向で書いてもやはり必要になるものです。 変数の命名はプログラムを書く上では避けられない事です。 クラス呼び出しの手間というのはあまり正確ではないと思います。クラスは属性として インスタンスの宣言文に入るだけですから、呼び出す手間というのはないです。 >本当は、『歩くクラス』ではなくて、間接の角度を変えるクラスを拡張させていけば >いいって感じなのでしょうか? >もっと言えば、「超ベリー」って何度も使うから、『チョベリ・クラス』で。って感じ >でいいのでしょうか? 「歩くクラス」というのは、オブジェクト指向的には変です。「歩くもの」クラスで、その メソッドとして「歩く」があるというのが正しいように思います。 「間接の角度を変えるクラス」についても同じで、「歩くもの」クラスのメソッドとして 「関節の確度を変える」メソッドがあるが正しいように思います。 「チョベリ・クラス」も、「人間」クラスを継承した「今どきの高校生」クラス(笑)が あって、そのクラス固有のメソッドして「チョベリ」メソッドがあるというのが正しいと 思います。 前述したように「クラス=プログラムの動く世界の登場人物」ですから クラスを考える場合には、ある物が、なにかの一種類になっていないか、逆に何種類かの ものに別れないかという視点で考えます。 例えば、「OKWaveユーザー」クラスは、「ネットユーザー」クラスの一種類です、 そして、「OKWaveユーザー」クラスは、「OKWaveユーザー(教えて!goo)」 クラスと「OKWaveユーザー(日経BP)」クラスなど、その他ポータルサイト毎に 別れる事になります。 そして、メソッドはこれらのクラス=登場人物がなにをするか、なにをやってくれるかの 視点で考える事だと思います。
- Interest
- ベストアンサー率31% (207/659)
こんにちは。 私はオブジェクト指向の概念がわかるようになるまで、3年かかりました。仮想関数という概念が大きな壁でしたね。 さて、クラスの行数の目安ですが、目安はありません。 > 汎用性を求めるほど、小さくなるとは思うのですが、それでいいのでしょうか? これは正しいと思います。特に、Javaでいうところの Interface はメソッド(メンバ関数)の仕様だけがあって中身が空っぽです。中身の実装はInterfaceを継承したクラスの中で行います。そうすると何が嬉しいのか、自動車のエンジンを例にとって説明します。 まず「アクセルを吹かす」というメソッド(メンバ関数)の定義だけを持つ中身が空っぽの「エンジンクラス」があるとします。このエンジンクラスを継承したクラスに「ガソリンエンジンクラス」「ディーゼルエンジンクラス」「ハイブリッドエンジンクラス」があって、それぞれ「アクセルを吹かす」メソッドの中身を実装しているとします。 エンジンを利用したい人は、とにかく「アクセルを吹かす」ことさえ知っていれば、実装がどうなっていようと気にしなくてよいのです。「エンジンクラス」を継承したクラスであれば「アクセルを吹かす」というまったく同じ使い方なので、ガソリンエンジンを改造して可変バルブタイミングにしたり、燃料直噴にしたりしても、エンジンを利用する人には変更の影響が及ばずに済みます。このように「仕様」と「実装」を切り離すことで拡張性、保守性が高まります。 「仕様」を定義した「エンジンクラス」は中身が空っぽですから当然小さなクラスです。『汎用性を求めると小さなクラスになる』ことが正しいと書いた理由はそこにあります。 >『歩くクラス』ではなくて、間接の角度を変えるクラスを拡張させていけばいいって感じなのでしょうか? 「歩く」は動作ですのでクラス(オブジェクト)として切り出すのは不適切です。自動車クラス、電車クラスなどと同じように扱うのであれば「自分の足クラス」が適切でしょう。これらの抽象クラスは「乗り物クラス」でメソッドには「移動する」がありそうですね。 そうすると、「乗り物クラス」を継承した「自分の足クラス」「自転車クラス」「自動車クラス」「電車クラス」「飛行機クラス」が考えられます。これらは全て、「移動する」というまったく同じメソッドで利用できるわけです。 > 「超ベリー」って何度も使うから、『チョベリ・クラス』で。 同様に、「超ベリー」は形容詞(?)ですからクラス(オブジェクト)として切り出すのは不適切です。 クラスとして切り出す対象は 『こいつに頼むと何か仕事をしてくれる』 という基準で選ぶのがコツです。(してくれる仕事がメソッドです。)
お礼
今まで、PHPで動くサンプルが腐るほどあったのに、コンパイル言語だといいサンプルがなくって。 しかも、人気のなくなったdelphiですし。^^; クラス・オブジェクト指向のことは、表面はわかったのですが、UMLのことは、さっぱりで。 1をしって10を知る・・・ではなく、私は100を知ってやっと10の便利さがわかるくらいでして。^^; ありがとうございます。
- sha-girl
- ベストアンサー率52% (430/816)
ゲーム開発に携わっているものです。 基本的にオブジェクト指向と呼ばれるものは、そうでないものと比べると 実行コードが肥大化します。またオブジェクトコードで無いものより 遅くなる事はあっても速くなる事はありません。 おっしゃられるとおりオブジェクト指向というのは 汎用性を高める為のものです。 >クラスの行数の目安・・・というのは変かもしれませんが、どれくらいなんですか? クラスによってぴんきりです。 2万行を超えるものから ヘッダのみ(数行)のクラスもあります。 >一つは、クラスを作る際にメモリーを使うので負荷がかかるのでは? C++を例にしていうと 処理的な無駄はほとんど発生しません。 クラスというのは頭の部分に自分がどのクラスかを判別するようなVテーブルと呼ばれる 名札があってそれを元に分岐します。 つまり、どんなにクラスを継承しようが分岐は一回で済むという仕組みです。 勿論クラスには自分が何者であるかの情報があるので、その分メモリは食いますが それは微々たるものです。それは後者も同じです。 >クラスの変数名を考えるのが面倒(クラスを呼び出すのも手間がかかるし。)・・・、の2点。 クラスの持っている必要な情報というのは クラスを使わない手法であっても必要な情報なのです。 ですから変数名を考える手間は同じです。 >超ベリー(喜) // => 超ベリーグッド >超ベリー(悲) // => 超ベリーバッド クラスというのは共通の部分を部品化するというものですが 「超ベリー」ぐらいであればそのクラスのメンバに 超ベリーかどうかのフラグを持たせるだけです。 バッドとグッドも普通は別のクラスにはしません。 この場合バッドかグッドかと、「超ベリー」かそうでないかのフラグを持つ 「コンディションクラス」といった感じになります。 ゲーム的の例でいうと 物=>キャラクター=>敵 =>味方 といった感じで派生させます。 クラスの有効性を実感するには オブジェクト指向と呼ばれる言語を 実際に自分で使ってみるのが一番だと思います。 特にコードが大きくなればなるほど有効性が出てきます。
お礼
今のところ、Perl、PHPときて、DelphiなのでJAVAのようにクラス化が必須ではないので、小さいプログラムを作っていくのなら、まぁ、関数でもいいのかな?と。^^; JAVAの本も一通りよんだので、クラス・オブジェクト指向の表面的な意味はわかったのですが、実際にどうやって使うのかがピンとこなくって。 日曜プログラマで、一人作業ですし。 それでも少しずつ、クラス化のアイディアも出てきました。 ありがとうございます。
お礼
今まで、書籍で読んだなかでも、みなさんの回答は分かりやすいものだと思います。 オブジェクト指向の細かな用語はわかったものの、全体像がやはり見えていないのかもしれません。 その辺は、PHPのようにソースがあふれていればいいのですが。^^; ありがとうございます。