お世話になっております。
毎回初歩的な質問で申し訳ありません。
プログラムを組んでいて初級者ながら毎回思うのですが、
説明を見ても分からなかったのですが、クラスをインスタンス化した時、
その部分では全く使わない変数領域やメソッドの領域を確保したりチェックしたりして、かなり非効率的なのではないかと思いました。
実際負担とかは、大きいものなのでしょうか?
クラス内のメソッドを、1クラスで1メソッドにしたほうがよいのでは、
などと思ってしまいます。自分のプログラムではですが・・・。
小さなプログラムの中で、クラスに分けるようにしているのですが、
汎用性があるクラスを作るというのが難しいです。
何かアドバイスなど頂けたらありがたいです。
よろしくお願い致します。
No.4ベストアンサー
- 回答日時:
あるクラスにメソッドが多数あっても少なくても、VM内でインスタンスを生成する際の手間は変わりません(インスタンス毎にメソッドテーブルを作るわけではないから)。
クラス内のstaticでないフィールドの数が多い場合は少しはインスタンス生成が遅くなる可能性がありますが、ほぼ無視できる程度でしょう。クラス内のメソッドやフィールドの数を減らすために無理にクラスを細切れにしたほうが性能という点では不利になる場合も考えられます。
インスタンス生成時の速度を気にする前に、デザインパターンなどを学んで(再)利用しやすいクラスを作ることをまずは心がけてください。
この回答への補足
アドバイスありがとうございます。
そうなのですか、
staticは、どこからも呼び出せるので危険というイメージがあり
使うのが怖かったりします。
インスタンス生成が増えてしまったら、それこそ意味ないですよね。
やはり、再利用をかんがえるのが大切なのですね。
速度も無視できる程度という事で安心しました。
ありがとうございました。
No.3
- 回答日時:
プログラミング言語は、効率・実行速度よりも再利用性・保守性・可読性を
優先することによって、進化してきているという歴史があります。
ですから、当然、オブジェクト指向言語は、最適化されたマシン語よりも
効率・実行速度は、明らかに劣ります。
効率が気になるような計算を実行しなければいけない場合は、オブジェクト指向言語を、
その開発言語に選択している時点で正しくないでしょう。
逆に言うと、
>クラス内のメソッドを、1クラスで1メソッドにしたほうがよいのでは、
>などと思ってしまいます。自分のプログラムではですが・・・。
このような考え方は、オブジェクト指向設計の観点から、明らかに間違っています。
オブジェクト指向言語でプログラミングを書く場合に考えることは、
”何を実行するためのクラスか誰にでも簡単に理解できるか”
”自分以外の人も簡単にこのクラスを(再)利用できるか”
を、まず第一義に想定することです。
この回答への補足
アドバイスありがとうございます。
再利用できるのは便利ですね。
自分も、皆さんのプログラムをお手本にして
再利用できるクラスを作りたいと思います。
ありがとうございます。
No.2
- 回答日時:
たぶん最初から「汎用性のあるクラスを作る」というのは難しいと思います. 業務などの「大きなプログラム」なら設計を頑張れば出てくるでしょうが, そうでなければ無駄な労力となる可能性もあります.
それよりも「後で修正する」ことを前提にプログラムを書いた方がいいような気がします.
基本的に「オブジェクト」ってのは「一体となって動くデータとそのデータに対する処理の集まり」なので, 「1クラスで1メソッドにする」というのはクラスの切り分けができていないのだと思います. この辺については #1 もいわれるようにモジュール分割などを抑えておいたほうがよいでしょう.
まあ確かに「非効率的」と言えばそうなんだけど, 「プログラムの見やすさ」という視点は非常に大事です. つ~か, 効率を追求するなら Java なんか使わなければいいのに.
この回答への補足
アドバイスありがとうございます。
簡単になるよう意識したいです。
会社の研修で教わっているものでして。。
それと、使っていると好きになってしまいました。。
とにかく、いろいろと楽しんで出来たらとおもいます。
ありがとうございました。
No.1
- 回答日時:
プログラムのモジュール分割の基礎から勉強されたら
如何でしょうか?
多分、物によってはクラスは無意味になったりすると
思います。
クラス化によって多くの機能を入手しましたが、その
機能を使うことを考えると基本を忘れがちです。
モジュール分割を勉強するとモジュールの性質を学びます。
そして行き着くところは情報的強度を持ったモジュール
なのですが、クラスの概念(オブジェクト指向)が無い時点
で欠陥に行き詰っていました。
オブジェクト指向がこれらの欠陥を解消し今日に至る訳です。
この回答への補足
具体的なアドバイスありがとうございます。
モジュールの性質ですか。
ネットで勉強したいと思います。
おかげさまで、少しですが理解できました。
あと、機能より基本を大切にしたいと思います。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- Windows 10 Windows Updateの更新ができない場合に初期化 3 2023/01/18 20:00
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
【JSF】バッキングビーンから別...
-
用語の意味の違いを教えてくだ...
-
他のモジュールのプロシージャ...
-
コンポーネント指向って、どの...
-
worksheetFunctionクラスのVloo...
-
パソコンへの「Dropbox...
-
VBA シートのボタン名を変更し...
-
実行時エラー 438になった時の...
-
ユーザーフォームを表示中にシ...
-
Hideについて(.NET)
-
「Columns("A:C")」の列文字を...
-
eclipseのデバッグ中に変数の値...
-
VBA(エクセル)で自動的にボタン...
-
ウォッチ式の文字数制限について
-
エクセルエラー13型が一致しま...
-
VBAで既に開いている別アプリケ...
-
ExcelVBAのユーザーフォームの...
-
【C#/Java?】try-catchでcatch...
-
EXCELでactivexコントロールを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
共通モジュールでDBへの接続と...
-
[VBA] Classから他のClassを呼...
-
コンポーネント指向って、どの...
-
他のモジュールのプロシージャ...
-
用語の意味の違いを教えてくだ...
-
Excel vbaで複数のテキストボッ...
-
VB.netで、動的な型変換を行い...
-
VB.NETにて文字列で指定した関...
-
WPFでCanvas の子要素にアクセ...
-
VBAで、Functionを、クラスモジュール...
-
VB ブラウザ
-
バウンドプロパティとは?
-
Form2の変数をForm1に渡す方法...
-
VB6で外部から静的アクセスが可...
-
(初歩)インスタンス化の負担と...
-
VBA オブジェクト追加
-
Python クラスとモジュールの...
-
ExcelVBAでJavaのHashtableのよ...
-
'StructLayout' の仕様について
-
コンストラクタとデリゲートの...
おすすめ情報