web-dev-qa-db-ja.com

状態のないインスタンス化可能なクラスが非常に多いのはなぜですか?

C++とJava状態のない世界には、インスタンス化可能なクラスがたくさんあります。

私はなぜ人々がそれをするのか本当に理解できません、彼らはC++の無料の関数の名前空間、またはJavaのプライベートコンストラクターと静的メソッドのみを持つクラスを使用することができました。

私が考えることができる唯一の利点は、特定の状況で別の実装が必要になると後で決めた場合、ほとんどのコードを変更する必要がないことです。しかし、それは時期尚早のデザインのケースではないでしょうか?後で適切になったときに、クラスに変えることができます。

私はこれを間違っているのですか? OOP =すべてをオブジェクト(つまり、インスタンス化されたクラス)に入れない場合)では、C++とJavaの標準ライブラリに非常に多くのユーティリティ名前空間とクラスがあるのはなぜですか?

pdate:これまでの仕事で確かに多くの例を見てきましたが、オープンソースの例を見つけるのに苦労しているので、結局それほど一般的ではないかもしれません。それでも、なぜ人々がそれをするのか、そしてそれがどれほど一般的であるのか疑問に思っています。

18
futlib

C++とJava状態のない世界では、インスタンス化可能なクラスがたくさんあります。

独自のivarなしでクラスを作成するいくつかの理由:

  • 状態はスーパークラスに含まれるか、含まれる可能性があります。

  • クラスはいくつかのインターフェースを実装していますであり、インスタンスを他のオブジェクトに渡すことができるようにインスタンス化できる必要があります。

  • クラスはサブクラス化されることを意図しています。

  • 関連する関数をグループ化する便利な方法(はい、同じことを行うためのより良い方法や異なる方法があるかもしれません。)

これは間違っていますか? OOP私がすべてをオブジェクト(つまり、インスタンス化されたクラス)に入れない場合)ではないですか?

OOPはパラダイムであり、自然の法則ではありません。 everythingがオブジェクトである言語がいくつかあるので、本当に選択肢はありません。他の言語(Cなど)は、OOPをまったくサポートしていませんが、オブジェクト指向のスタイルでプログラミングすることはできます。OOPクラスですべてを行わない場合... lessOOPその場合。

22
Caleb

CalebとRobert Harveyは、ユーティリティクラスとは何か、「データのない」クラスを持つ正当な理由をすでに指摘しています。これらの説明は適切ですが、肯定的な側面を扱います。

ユーティリティクラスのabuseは間違いなく[〜#〜] oo [〜#〜]アンチパターン( c2wikiの説明 を参照)。この引用はそれをうまくまとめています:

このようなクラスが多数ある場合(特に、メソッドが1つしかないクラス)は、設計者が逆さまに考えていることを示します。オブジェクトによって実行できることではなく、オブジェクトに対して実行できることを考えます。

オブジェクト指向の設計を実践していると主張しているが、コードベースがほぼ完全にユーティリティクラスで構成されている場合、間違いを犯していると思います。そうは言っても、機能的アプローチには同じように多くのメリットがあり、作業するのにも優れています。片方だけを実装しながら、片方に従っていると主張しないでください。

4
Daniel B

JavaおよびC++のユーティリティクラスは、1つ以上の入力パラメータを受け取り、結果を返すメソッドのライブラリを維持するために使用されます。値を返すだけの場合は、状態を保持する必要はありません。その点で、これらのメソッドは、そのすべての利点(1つには同時実行性の問題がない)を備えた、関数型プログラミングの大まかな形と見なすことができます。

いずれの場合でも、これらのクラスは、関連するメソッドを1つのコンテナにグループ化するためにのみ機能します。これらのメソッドは、適切に機能するためにオブジェクトのインスタンス化を必要としないメソッドです。このようなクラスの例は、SINE関数とCOSINE(およびその他の数学)関数を含むMathクラスです。

2
Robert Harvey

これらのクラスの多くは、明示的に含まれていなくても、データを操作します。そのため、複数の同時インスタンスをアクティブにする必要がある方法で操作する必要があります。例えば。データベースストアドプロシージャとやり取りし、受信データを一部のPL/SQLパッケージに渡し、結果を呼び出し元のアプリケーションに返すステートレスセッションBean。それは複数のインスタンスに存在する必要がありますが、それ自体はデータフィールドを含みません。

2
jwenting

クラスがオブジェクトではないオブジェクト指向言語では、クラスよりもオブジェクトを使って多くのことができます。

オブジェクトをパラメーターとして渡したり、型互換性のあるオブジェクトを代入したり、インターフェースを実装したりできます(クラスがオブジェクトである言語があると思いますが、これらのことのいくつかを行うことができますが、いずれにせよ...) 。これらはすべて非常に重要なので、デフォルトの決定は通常、クラスをインスタンス化可能にすることです。

一部のクラスでは、インスタンス化によって付与される機能が必要になる可能性は低いようです。たとえば、Cosineのある実装を別の実装に交換する必要はおそらくないでしょう。これらの機能を必要としないのは主にユーティリティ関数であるため、インスタンス化できないクラスを持つのは主にユーティリティ関数です。

0
psr