• 締切済み

クラスの行数は?

クラスの行数の目安・・・というのは変かもしれませんが、どれくらいなんですか? 汎用性を求めるほど、小さくなるとは思うのですが、それでいいのでしょうか? 私は、書籍をみると最初に『歩くクラス』『自動車クラス』、とか書かれているので、大きなものと思っていました。 しかし、今日立ち読んだ本には、数行のクラスも多いとか。 私は、これは違和感があります。 一つは、クラスを作る際にメモリーを使うので負荷がかかるのでは? と、クラスの変数名を考えるのが面倒(クラスを呼び出すのも手間がかかるし。)・・・、の2点。 最近のPCの性能と、名前付けは慣れなんでしょうが・・・。 本当は、『歩くクラス』ではなくて、間接の角度を変えるクラスを拡張させていけばいいって感じなのでしょうか? もっと言えば、「超ベリー」って何度も使うから、『チョベリ・クラス』で。って感じでいいのでしょうか? 『超ベリークラス』を読み込んで、 超ベリー(喜) // => 超ベリーグッド 超ベリー(悲) // => 超ベリーバッド こういうのは、汎用性は高まっても、処理の無駄だと思うのですが・・、。 実際は、どうなんでしょうか?

みんなの回答

回答No.3

>クラスの行数の目安・・・というのは変かもしれませんが、どれくらいなんですか? 決定的な基準はありませんね。 ただ、これは作る側の都合に近いのですか、1メソッドは、エディタ一画面に収まる ぐらいにするというのはあるかも知れません。 そのくらいが人間の把握力だということです。 クラスは、メンバ変数とメソッドの集合体ですから、結果として行数の目安はなくなって しまいます。 >汎用性を求めるほど、小さくなるとは思うのですが、それでいいのでしょうか? 一概にそうとも言えないですね。 クラスの記述=プログラムの動く世界の登場人物の記述だと(わたしは)捉えています。 仮に人間というクラスを設計して、汎用性を持たせようとすると、人間の様々な動きを 記述したメソッド(おそらく仮想関数ばっかりで定義だけで実装はからっぽでしょうけど) を沢山書くことになります。 従って、行数は増えます。 ただ、実装をする側のクラスと較べれば行数は少ないかも知れないとは言えます。 だから、汎用性を求めると「単純に」小さくなるとまでは言えないと思います。 それと、Javaでfunctionerクラスというものを作る事があります。クラスというより 汎用(雑用?)メソッドの集合体みたいなもので、Cでいうライブラリに近いものです。 これは、汎用性を求めた結果、いろいろなメソッドが実装を伴って、組み込まれすから 行数的には膨大になります。 >一つは、クラスを作る際にメモリーを使うので負荷がかかるのでは? いや、手続き指向で記述できるものを、オブジェクト指向で記述したからといって、 オブジェクト指向固有のメモリ負荷(使用メモリ量の増大)がかかるということはありません。 手続き指向もオブジェクト指向も果たそうとしている事はプログラムを動かす事ですから 手続き指向で必要だったものは、やはりオブジェクト指向でも必要なのです。 そこに、差異がない限りメモリ負荷がかかるというのは適切でないと思います。 但し、これはコンパイラの実装とかによりますが、オブジェクト指向固有の機能、継承や 多相性(多態性)やカプセル化を実装するコードを生成するため、その点のオーバー ヘッドがあるかも知れないとは思います。 また、javaに顕著ですが、javaはガーベッジコレクションといって、使わなくなった クラスというかインスタンスを自動的にメモリ上から開放します。 また、クラスは使用された段階でメモリにロードします。 その点ではメモリ使用効率はいいと言えます。 一方、手続き指向のプログラムだと、実行ファイルを最初に一括ロードするか、OSに 頼ってページング等でメモリ効率を図るしかありません。 この点では、手続き指向の方がメモリ負荷は大きいです。 >クラスの変数名を考えるのが面倒(クラスを呼び出すのも手間がかかるし。) いや、クラスの変数に対応するものは、手続き指向で書いてもやはり必要になるものです。 変数の命名はプログラムを書く上では避けられない事です。 クラス呼び出しの手間というのはあまり正確ではないと思います。クラスは属性として インスタンスの宣言文に入るだけですから、呼び出す手間というのはないです。 >本当は、『歩くクラス』ではなくて、間接の角度を変えるクラスを拡張させていけば >いいって感じなのでしょうか? >もっと言えば、「超ベリー」って何度も使うから、『チョベリ・クラス』で。って感じ >でいいのでしょうか? 「歩くクラス」というのは、オブジェクト指向的には変です。「歩くもの」クラスで、その メソッドとして「歩く」があるというのが正しいように思います。 「間接の角度を変えるクラス」についても同じで、「歩くもの」クラスのメソッドとして 「関節の確度を変える」メソッドがあるが正しいように思います。 「チョベリ・クラス」も、「人間」クラスを継承した「今どきの高校生」クラス(笑)が あって、そのクラス固有のメソッドして「チョベリ」メソッドがあるというのが正しいと 思います。 前述したように「クラス=プログラムの動く世界の登場人物」ですから クラスを考える場合には、ある物が、なにかの一種類になっていないか、逆に何種類かの ものに別れないかという視点で考えます。 例えば、「OKWaveユーザー」クラスは、「ネットユーザー」クラスの一種類です、 そして、「OKWaveユーザー」クラスは、「OKWaveユーザー(教えて!goo)」 クラスと「OKWaveユーザー(日経BP)」クラスなど、その他ポータルサイト毎に 別れる事になります。 そして、メソッドはこれらのクラス=登場人物がなにをするか、なにをやってくれるかの 視点で考える事だと思います。

inferu_noz
質問者

お礼

今まで、書籍で読んだなかでも、みなさんの回答は分かりやすいものだと思います。 オブジェクト指向の細かな用語はわかったものの、全体像がやはり見えていないのかもしれません。 その辺は、PHPのようにソースがあふれていればいいのですが。^^; ありがとうございます。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

こんにちは。 私はオブジェクト指向の概念がわかるようになるまで、3年かかりました。仮想関数という概念が大きな壁でしたね。 さて、クラスの行数の目安ですが、目安はありません。 > 汎用性を求めるほど、小さくなるとは思うのですが、それでいいのでしょうか? これは正しいと思います。特に、Javaでいうところの Interface はメソッド(メンバ関数)の仕様だけがあって中身が空っぽです。中身の実装はInterfaceを継承したクラスの中で行います。そうすると何が嬉しいのか、自動車のエンジンを例にとって説明します。 まず「アクセルを吹かす」というメソッド(メンバ関数)の定義だけを持つ中身が空っぽの「エンジンクラス」があるとします。このエンジンクラスを継承したクラスに「ガソリンエンジンクラス」「ディーゼルエンジンクラス」「ハイブリッドエンジンクラス」があって、それぞれ「アクセルを吹かす」メソッドの中身を実装しているとします。 エンジンを利用したい人は、とにかく「アクセルを吹かす」ことさえ知っていれば、実装がどうなっていようと気にしなくてよいのです。「エンジンクラス」を継承したクラスであれば「アクセルを吹かす」というまったく同じ使い方なので、ガソリンエンジンを改造して可変バルブタイミングにしたり、燃料直噴にしたりしても、エンジンを利用する人には変更の影響が及ばずに済みます。このように「仕様」と「実装」を切り離すことで拡張性、保守性が高まります。 「仕様」を定義した「エンジンクラス」は中身が空っぽですから当然小さなクラスです。『汎用性を求めると小さなクラスになる』ことが正しいと書いた理由はそこにあります。 >『歩くクラス』ではなくて、間接の角度を変えるクラスを拡張させていけばいいって感じなのでしょうか? 「歩く」は動作ですのでクラス(オブジェクト)として切り出すのは不適切です。自動車クラス、電車クラスなどと同じように扱うのであれば「自分の足クラス」が適切でしょう。これらの抽象クラスは「乗り物クラス」でメソッドには「移動する」がありそうですね。 そうすると、「乗り物クラス」を継承した「自分の足クラス」「自転車クラス」「自動車クラス」「電車クラス」「飛行機クラス」が考えられます。これらは全て、「移動する」というまったく同じメソッドで利用できるわけです。 > 「超ベリー」って何度も使うから、『チョベリ・クラス』で。 同様に、「超ベリー」は形容詞(?)ですからクラス(オブジェクト)として切り出すのは不適切です。 クラスとして切り出す対象は 『こいつに頼むと何か仕事をしてくれる』 という基準で選ぶのがコツです。(してくれる仕事がメソッドです。)

inferu_noz
質問者

お礼

今まで、PHPで動くサンプルが腐るほどあったのに、コンパイル言語だといいサンプルがなくって。 しかも、人気のなくなったdelphiですし。^^; クラス・オブジェクト指向のことは、表面はわかったのですが、UMLのことは、さっぱりで。 1をしって10を知る・・・ではなく、私は100を知ってやっと10の便利さがわかるくらいでして。^^; ありがとうございます。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

ゲーム開発に携わっているものです。 基本的にオブジェクト指向と呼ばれるものは、そうでないものと比べると 実行コードが肥大化します。またオブジェクトコードで無いものより 遅くなる事はあっても速くなる事はありません。 おっしゃられるとおりオブジェクト指向というのは 汎用性を高める為のものです。 >クラスの行数の目安・・・というのは変かもしれませんが、どれくらいなんですか? クラスによってぴんきりです。 2万行を超えるものから ヘッダのみ(数行)のクラスもあります。 >一つは、クラスを作る際にメモリーを使うので負荷がかかるのでは? C++を例にしていうと 処理的な無駄はほとんど発生しません。 クラスというのは頭の部分に自分がどのクラスかを判別するようなVテーブルと呼ばれる 名札があってそれを元に分岐します。 つまり、どんなにクラスを継承しようが分岐は一回で済むという仕組みです。 勿論クラスには自分が何者であるかの情報があるので、その分メモリは食いますが それは微々たるものです。それは後者も同じです。 >クラスの変数名を考えるのが面倒(クラスを呼び出すのも手間がかかるし。)・・・、の2点。 クラスの持っている必要な情報というのは クラスを使わない手法であっても必要な情報なのです。 ですから変数名を考える手間は同じです。 >超ベリー(喜) // => 超ベリーグッド >超ベリー(悲) // => 超ベリーバッド クラスというのは共通の部分を部品化するというものですが 「超ベリー」ぐらいであればそのクラスのメンバに 超ベリーかどうかのフラグを持たせるだけです。 バッドとグッドも普通は別のクラスにはしません。 この場合バッドかグッドかと、「超ベリー」かそうでないかのフラグを持つ 「コンディションクラス」といった感じになります。 ゲーム的の例でいうと 物=>キャラクター=>敵            =>味方 といった感じで派生させます。 クラスの有効性を実感するには オブジェクト指向と呼ばれる言語を 実際に自分で使ってみるのが一番だと思います。 特にコードが大きくなればなるほど有効性が出てきます。

inferu_noz
質問者

お礼

今のところ、Perl、PHPときて、DelphiなのでJAVAのようにクラス化が必須ではないので、小さいプログラムを作っていくのなら、まぁ、関数でもいいのかな?と。^^; JAVAの本も一通りよんだので、クラス・オブジェクト指向の表面的な意味はわかったのですが、実際にどうやって使うのかがピンとこなくって。 日曜プログラマで、一人作業ですし。 それでも少しずつ、クラス化のアイディアも出てきました。 ありがとうございます。

関連するQ&A

  • C,C++,Javaの変数の種類

    クラス、構造体の変数の中で外部からアクセスできないという設定があります。アクセスできないというのは、 0.値を見ることができるが変更はできない(定数のような感じ? 消費税率とか?) 1.値を見ることはできないが変更することはできる(銀行預金額面風?) 2.値を見ることも変更することもできない (どう利用するのでしょうか?) にわかれるように思います。もし2ならば、その変数は構造体、クラスの外部に影響を与えないように思います。すなわちそのような変数の使用が何を目的としているか不明になるように思いますが。 例えば、Xを2の意味で隠蔽していたとします。 Yを与えて、Z=Y*Xを計算し、Zの値を取り出すと、Xの値が間接的にわかることになります。これだと変数を隠蔽したことならないのでこのような使い方もエラーになるだろうと思いますが。 すなわち、アクセスできないとはどういう意味になるのでしょうか。 C,C++,Javaを同時に見ており、private, staticなどいろいろあって混乱してしまいました。 変数のアクセス制限・隠蔽についてどのように整理すればよろしいでしょうか。 よろしくお願いします。

  • 行数について

    MySQLバージョン4.1.16を使用しています。 例えば、1ユーザごとに平均1000行を持たせるテーブルがあったとしたら それは良くない構造なのでしょうか? 1ユーザで1000なので、仮に1万ユーザ居たとしたらそれだけで 1万×1000=1000万行なので、恐らく駄目ですよね・・・(100行ぐらいなら許容範囲なのかな??) そういう場合、プログラム側で工夫するしかないのでしょうか? いきなり1000行を1行に纏めるは難しいと思いますが、 1つのカラムに('aaaa',11,'ああああ')と「,(カンマ)」で区切って入れるやり方や、 それともカラムの数を増やすやり方とか、どのような方法が良いのでしょうか?

  • 行数が揃わない

    こんにちは。 ワード2000で回答一覧表を作成しています(2行) 左に質問一覧、右に回答一覧を作成しているのですが、左右の質問分の行数と回答の行数が合いません。 質問行数が、折り返しで複数行に対して、回答行が、質問と同行ピッチにならずにずれてきます。 質問間は、ブランク(改行)で空けています。 どうしたら、表中の行数が整えられるのでしょか? 急いでいます。

  • 行数を求めたい

    テキストファイルには64この整数がスペースを一つずつあけて並んでいます。それが2行あります。 このテキストの行を数えたいのですが、下のプログラムでは6行と帰ってきます。これはなぜなのでしょうか?よろしくお願いします。また、行数のいい求め方がありましたら教えてください。 char s[64]; int gyouretu=0; FILE* fin=fopen(" "."r"); while( fgets(s,63,fin)!=NULL ){ gyousu++; } 実行結果 gyousu=6

  • ソースの追加行数と変更行数

    手元に、win mergeと、Subversionと、DFがあります。 昨日書いたソースと、今日書いたソースがあるとき、 新規に追加された行数と、変更された行数を知りたいです。 みんなに欲されていそうな機能ですし、どれかしらに、何かしらのメニューがあるんじゃないかと思っているのですが、見つけられずにいます。。 ご存知でしたらご教授下さい。

  • ワード2007 行数を指定をしても、行数が変更できません。

    ワード2007 行数を指定をしても、行数が変更できません。 分かる方教えてください。

  • ワードの行数について

    今回期末試験でレポートを提出するのですが、横40文字、縦30行の指定でやってきてくださいといわれました。そういうことができるのでしょうか。大変困っています。大至急お願いします。

  • タスクバー上の行数

    WIN98 OfficeXP Wordを使っていると、タスクバー上の行数が最初は出ているのですがいつのまにか消えてしまいます(位置や桁数は表示されています) どうしたら表示させられるでしょうか

  • word2002で行数がでない

    Win2000でWord2002を使っています。 ステータスバーに通常なら行数が表示されるはずが表示されないときが多々あります。 再起動するとでたりしますが、気づいたらグレーになって行数が表示されていません。 原因としてどんなことが考えられるでしょうか? よろしくお願いいたします。

  • 行数の取得

    mysql初心者です 行数を取得したいです 処理をすこしでも軽くしたいです このように書くとテーブルの中身は見に行かないらしいのですが SELECT COUNT(*) AS cnt FROM bbs WHEREをつけると中身を見に行きますか? SELECT COUNT(*) AS cnt FROM bbs WHERE sure_id=5 中身を見に行く場合、カラムを指定したほうが早いでしょうか? SELECT COUNT(id) AS cnt FROM bbs WHERE sure_id=5 よろしくお願いします

    • ベストアンサー
    • MySQL

専門家に質問してみよう