5

この質問は少し主観的なものかもしれませんが、私はコードを編成するための最良のプログラミング プラクティスに従おうとしているだけです。

classPolynomialを多く参照するクラスRationalがあり、多くの異なるメソッドでRational、比較のために 1、0、または -1 に相当する値を使用します。

そのため、次の定数を定義しています。

public static final Rational ZERO    = new Rational(0);
public static final Rational ONE     = new Rational(1);
public static final Rational NEG_ONE = new Rational(-1);

ただし、これらの値を意味のある方法でどこに格納するかについては確信が持てません。

一方でPolynomialは、それらを使用するものであるため、それらをクラス内に格納すると、使用される場所にローカライズされます。これは、1 つのクラス内でのみ使用されるようにプライベートに変更できることも意味します。

一方、 の内部で定義されている場合Rational、値へのすべての呼び出しはRational.ZERO, Rational.ONE, Rational.NEG_ONE-- になります。これにより、人間が非常に読みやすくなり、字句的に理解できる方法で編成されます。また、必要に応じて同様の定数を定義する機会も与えPolynomialます。

基本的に、意見はさておき、このような組織で最も一般的な方法は何ですか? どちらの場所についても私の考えは正しいですか、それとも私が考えていなかった別の解決策がありますか?

4

2 に答える 2

9

それらはRational有理数の抽象化であるため、クラスに含まれている必要があります。それらをクラスに移動したい場合は議論の余地がありますがRationalPolynomial、それでも私はそれらを保持するRational方が良いと信じています.

これを行うための大きな要件は、Rationalクラスを不変にすることです。それ以外の場合は、それらをパブリックとして公開しないでください。76 ページの効果的な Java の言及:

不変クラスは、クライアントが可能な限り既存のインスタンスを再利用することを奨励することにより、これを利用する必要があります。これを行う簡単な方法の 1 つは、頻繁に使用される値に public static final 定数を提供することです。たとえば、Complex クラスは次の定数を提供する場合があります。

public static final Complex ZERO = new Complex(0, 0);
public static final Complex ONE = new Complex(1, 0);
public static final Complex I = new Complex(0, 1);
于 2013-11-03T18:56:30.007 に答える
0

別の提案 - Java が Strings で行うのと同様のことを行うことができます。つまり、既存のインスタンスを再利用します。

そのため、Rational のプライベート コンストラクターを指定して、他のクラスがその直接のインスタンスを作成できないようにし、"Rational.get(1)" や "Rational.of(1)" などのパブリックな静的ファクトリ メソッドを導入することができます。

そうすれば、静的フィールドで言及したようないくつかの人気のある数値を保持し、新しいインスタンスを作成する代わりにそれらを返すことができます。より多くの Rational が何度も何度も再利用される場合に備えて、パフォーマンスをさらに向上させる (限定された) プールを保持することも考えられます。

このソリューションの大きな利点は、導入した定数を知らない新しい開発者が誤って "Rational(1)" を使用しないことです。

もちろん、そのアプローチでは、Rational クラスが不変であることも確認する必要があります。

于 2013-12-11T10:14:35.333 に答える