• ベストアンサー

(初歩)インスタンス化の負担とクラス作成

お世話になっております。 毎回初歩的な質問で申し訳ありません。 プログラムを組んでいて初級者ながら毎回思うのですが、 説明を見ても分からなかったのですが、クラスをインスタンス化した時、 その部分では全く使わない変数領域やメソッドの領域を確保したりチェックしたりして、かなり非効率的なのではないかと思いました。 実際負担とかは、大きいものなのでしょうか? クラス内のメソッドを、1クラスで1メソッドにしたほうがよいのでは、 などと思ってしまいます。自分のプログラムではですが・・・。 小さなプログラムの中で、クラスに分けるようにしているのですが、 汎用性があるクラスを作るというのが難しいです。 何かアドバイスなど頂けたらありがたいです。 よろしくお願い致します。

  • Java
  • 回答数4
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.4

あるクラスにメソッドが多数あっても少なくても、VM内でインスタンスを生成する際の手間は変わりません(インスタンス毎にメソッドテーブルを作るわけではないから)。クラス内のstaticでないフィールドの数が多い場合は少しはインスタンス生成が遅くなる可能性がありますが、ほぼ無視できる程度でしょう。 クラス内のメソッドやフィールドの数を減らすために無理にクラスを細切れにしたほうが性能という点では不利になる場合も考えられます。 インスタンス生成時の速度を気にする前に、デザインパターンなどを学んで(再)利用しやすいクラスを作ることをまずは心がけてください。

qqtaka
質問者

補足

アドバイスありがとうございます。 そうなのですか、 staticは、どこからも呼び出せるので危険というイメージがあり 使うのが怖かったりします。 インスタンス生成が増えてしまったら、それこそ意味ないですよね。 やはり、再利用をかんがえるのが大切なのですね。 速度も無視できる程度という事で安心しました。 ありがとうございました。

その他の回答 (3)

  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.3

プログラミング言語は、効率・実行速度よりも再利用性・保守性・可読性を 優先することによって、進化してきているという歴史があります。 ですから、当然、オブジェクト指向言語は、最適化されたマシン語よりも 効率・実行速度は、明らかに劣ります。 効率が気になるような計算を実行しなければいけない場合は、オブジェクト指向言語を、 その開発言語に選択している時点で正しくないでしょう。 逆に言うと、  >クラス内のメソッドを、1クラスで1メソッドにしたほうがよいのでは、  >などと思ってしまいます。自分のプログラムではですが・・・。 このような考え方は、オブジェクト指向設計の観点から、明らかに間違っています。 オブジェクト指向言語でプログラミングを書く場合に考えることは、  ”何を実行するためのクラスか誰にでも簡単に理解できるか”  ”自分以外の人も簡単にこのクラスを(再)利用できるか” を、まず第一義に想定することです。

qqtaka
質問者

補足

アドバイスありがとうございます。 再利用できるのは便利ですね。 自分も、皆さんのプログラムをお手本にして 再利用できるクラスを作りたいと思います。 ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

たぶん最初から「汎用性のあるクラスを作る」というのは難しいと思います. 業務などの「大きなプログラム」なら設計を頑張れば出てくるでしょうが, そうでなければ無駄な労力となる可能性もあります. それよりも「後で修正する」ことを前提にプログラムを書いた方がいいような気がします. 基本的に「オブジェクト」ってのは「一体となって動くデータとそのデータに対する処理の集まり」なので, 「1クラスで1メソッドにする」というのはクラスの切り分けができていないのだと思います. この辺については #1 もいわれるようにモジュール分割などを抑えておいたほうがよいでしょう. まあ確かに「非効率的」と言えばそうなんだけど, 「プログラムの見やすさ」という視点は非常に大事です. つ~か, 効率を追求するなら Java なんか使わなければいいのに.

qqtaka
質問者

補足

アドバイスありがとうございます。 簡単になるよう意識したいです。 会社の研修で教わっているものでして。。 それと、使っていると好きになってしまいました。。 とにかく、いろいろと楽しんで出来たらとおもいます。 ありがとうございました。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

プログラムのモジュール分割の基礎から勉強されたら 如何でしょうか? 多分、物によってはクラスは無意味になったりすると 思います。 クラス化によって多くの機能を入手しましたが、その 機能を使うことを考えると基本を忘れがちです。 モジュール分割を勉強するとモジュールの性質を学びます。 そして行き着くところは情報的強度を持ったモジュール なのですが、クラスの概念(オブジェクト指向)が無い時点 で欠陥に行き詰っていました。 オブジェクト指向がこれらの欠陥を解消し今日に至る訳です。

qqtaka
質問者

補足

具体的なアドバイスありがとうございます。 モジュールの性質ですか。 ネットで勉強したいと思います。 おかげさまで、少しですが理解できました。 あと、機能より基本を大切にしたいと思います。 ありがとうございます。

関連するQ&A

  • インスタンスとオブジェクト

    こんばんは。 変数について教えて下さい。 プログラム自体が初めてなので 「たのしい Ruby 第3版」を読んでいます。 ずっとインスタンスとオブジェクトの違いが曖昧なままです。 その本の「クラスとモジュール」という章にて クラスを定義する構文。 インスタンス変数とローカル変数の違いですが、 以下の説明で一部理解できずにつまずいています。 ―――――――――――― @ で始まる変数は インスタンス変数 といいます。 ローカル変数はメソッドごとに異なる変数として扱われますが、 インスタンス変数は同じインスタンス内であれば、 メソッド定義を超えてその値を参照したり、変更したりできます。 なお、初期化されていないインスタンス変数を参照すると nil が得られます。 インスタンス変数は、インスタンスごとに違う値を持つことができます。 またインスタンス変数は、 インスタンスがある間は値を保持しておいて 何度でも利用することができます。 一方、ローカル変数はメソッド呼び出しごとに新しく割り当てられるため、 メソッドから抜けると値を忘れてしまいます。 ―――――――――――― ここで分からないのは、 ・ローカル変数が "メソッドごと" に異なる変数として扱われる ・インスタンス変数は同じ "インスタンス内" であれば、 メソッド定義を超えてその値を参照したり、変更したりできます の部分です。 Webで検索してますが、 プログラミング経験ありを前提で書かれているような。 他の言語も知らないので分からない、そんなページが多いです。 人に聞くからには 自分でも頑張って理解できるように考えますので、 どうか回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Java 静的メソッドとインスタンスメソッド

    静的メソッドとインスタンスメソッドの使い分けがよくわかりません。 私の認識は 静的メソッド:インスタンスメンバ変数を参照する必要がない処理 インスタンスメソッド:インスタンスメンバ変数を参照して行う処理 と思っています。 よって、例えばDAOを作成する場合、select、update、insertを実行するメソッドを作成しますが、これらはクラスのインスタンスメンバ変数を参照する必要がないので静的メソッドにするべきだと思っています。 しかし、本やネットのDAOのサンプルプログラムはインスタンスメソッドで作成されています。 これらは、private static String の変数(SQL文が記述されている)を参照していますが、インスタンスメンバ変数は参照していません。 なぜselect、update、insertのメソッドをインスタンスメソッドにする必要があるのかわかりません。 静的メソッドとインスタンスメソッドの使い分けの基準を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 子クラスのインスタンスから親クラスのインスタンス変数の内容を表示する親クラスのメソッドを叩きたい

    お世話になっております。 rubyのコーディングで疑問が発生しましたので、質問させてください。 以下の様にクラスを定義してあるとします クラスA 体裁を整えて標準出力するクラス  ・インスタンス変数@Aを持つ  ・@Aを元に整形して標準出力する振る舞いを持つ クラスB Aの子クラスで、標準出力する内容を細かく設定するクラス  ・独自のインスタンス変数は持たない  ・親クラスのインスタンス変数@Aを編集する振る舞いを持つ 上記の実装である時、クラスBの振る舞いでクラスAのインスタンス変数@Aを編集しようとした際にエラーが発生します。 尚、レシーバはsuperです。 エラー内容 ./clsb.rb:49:in `edt_dsp': super: no superclass method `edt_dsp' (NoMethodE rror) エラー文中に出てる'edt_dsp'というメソッドが親クラスのインスタンス変数を編集するメソッドです。 尚、子クラスには独自の変数は無いのでinitializeメソッドは定義していません。 なぜこのようなエラーが発生してしまうのかわからず困っています。 現在自分でも色々とサイトを回って調べていますが、解決には至っていません。 ご回答いただければ幸いです。 以上です。よろしくお願いします。

    • ベストアンサー
    • Ruby
  • オブジェクト指向コンパイラのインスタンスの構造について

    インタプリタやコンパイラの中身について興味があり勉強しています。といってもまだ簡単な字句解析や構文解析のレベルです。 読んだ本にはオブジェクト指向言語については書かれていませんでした、そこで一つ疑問に思ったこと点について質問させてください。 簡単な言語の場合、使用する変数が宣言されると、その領域がスタックやヒープ空間に確保されるという風に理解しました。 一方オブジェクト指向言語にて、あるクラスのインスタンスを生成した場合を考えます。インスタンスには変数の他に関数やメソッドといった処理手続きが含まれていますよね。その手続きをコンパイルしたコードは何処に置かれているのでしょうか? 手続きのコードもヒープ空間に確保された各インスタンスの領域にコピー(?)されて実行されるのでしょうか。それとも処理手続きの実体は実行プログラムに含まれていて全インスタンスで共通で利用するようになっているのでしょうか。 初心者の素朴な疑問です、ご回答いただければ幸いです。

  • アンドロイドで、別のクラスのインスタンスを呼ぶ方法

    アンドロイドの場合、別のクラスのインスタンスを呼び出すにはどうしたら良いですか? どうしてもわからずとても困っています。どうかご教授下さい。 例えば、Activityを継承しているクラスAがImageViewを継承しているクラスIのインスタンスを呼び出したいとします。 通用ならクラスA内で、 ExtendsImageView myExtendsImageView = new ExtendsImageView(); なんてインスタンス変数もたせて、 myExtendsImageViewから変数なりメソッドなり呼び出せれば済む話なんですが、 アンドロイドの場合、 アプリの起動時に自動的にActivity継承クラスとImageView継承クラスのインスタンスが生成されるようです。 そしてそのインスタンスがどこにあるかわからないので、呼び出すことができません。 無理やり、 ExtendsImageView myExtendsImageView = new ExtendsImageView(); と新しくインスタンスをつくるのも変な気がします・・・。 どのようにすれば別のクラスのインスタンスを呼び出すことができるでしょうか?どうかご教授下さい。。

  • objective-cで分かりにくい所教えて下さい

    (1)NSIntegerとintの違い intでもNSIntegerどちらも使ってプログラムが動くのですが、 実際どのように違うのでしょうか? (2)インスタンス変数 ローカル変数 私の勝手な解釈ですが、 インタンス変数は、1つのクラス内のどのメソッドでも共通で使える変数、 ローカル変数は、宣言したメソッド内でしか使えない変数、 という事でよろしいのでしょうか? 検索しましたが、あいまいな為、質問させていただきました。 初級的な質問で申し訳ないのですが、どうかよろしくお願いいたします。

  • クラスのインスタンスって何者?

    データ用クラスのインスタンスなのですが、以前 「クラス名 利用名;」 で使うと毎回別のインスタンスを呼び出すらしく値が空になるトラブルが起き 「static クラス名 利用名;」 とすれば常に同じインスタンスになるからそれを使いなさいと教えられました。 以後ずっとこれを使ってきたのですが、 ヘッダーファイルAに記述したデータクラスを ソースファイルAで「static クラス名 利用名;」 ソースファイルBで「static クラス名 利用名;」 と利用名を完全に同じにしてもエラーが出ず(ソースのヘッダ領域なのに) ソースファイルAでそのデータクラスに入れたデータは ソースファイルBでは利用できず空になっていました。 極当たり前の何かを私はわかってないから こういうトラブルが起きているんだと思うのですが、 クラスのインスタンスって何者なんでしょうか? どうすれば複数のソースから1つのデータクラスを作り上げ 全体で利用できるように出来るのでしょうか?

  • クラス、インスタンスメソッドについて

    JAVA初心者です。 現在、先人が作ったプログラムの修正作業を行っておりますが、 以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。) あるクラスが以下の様になっております。 public class Sample { private static Sample s = new Sample(); private Sample() { } /** クラスメンバに存在するインスタンス取得 * @return Sampleクラスの唯一のインスタンス */ public static Sample getInstance(){ return s; } public static void methodA(){ ... } } でこのmethodAを使用するには、以下の様にします。 Sample.getInstance().methodA() これはこれで納得で、うまく動作しますが、これは 結局の所、クラスメソッドにしたかったという事ではないのかな?と 疑問に感じています。つまり、単純に Sample.methodA と呼び出せばうまくいきます。 ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり getInstanceというものが存在し、現在日時を取得するのに Calendar.getInstance().getTime() の様に呼び出すと書いてありました。 Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが) のこれらのgetInstanceの効用とはなんなんでしょうか? ・クラスの外でnewでインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう