静vs非staticメソッドのための不変なクラス
-
24-09-2019 - |
質問
さらにクラス定義します。どうつくるかどうかは、スタブの方法は静的または非静?
class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
// Should the methods add(), subtract() and inverseOf() be non-static ...
public Point add(Point point) {
}
public Point subtract(Point point) {
}
public Point inverseOf() {
}
// Or static?
public static Point add(Point point1, Point point2) {
}
public static Point subtract(Point point1, Point point2) {
}
public static Point inverseOf(Point point) {
}
}
解決
私は、インスタンスメソッドのために行くだろう。その後、intefaceを法の一部を作る能力を持っており、それらを上書きします。あなたは、2Dまたは3Dのポイントポイントに対処し、本当に気にしない、いくつかのクライアントコードを持っている必要があり、ちょうどインターフェイスを実装するポイントに対して操作を実行する必要があるときは、利益を得るでしょう。
他のヒント
私はそれはあなたが達成しようとしているかに依存だと思います。あなたが一緒に任意の2点を追加する方法を提供しているなら、あなたは、静的メソッドをしたいです。あなたが与えられたPointインスタンスにポイントを追加する方法をしたい場合しかし、あなたは非静的メソッドをしたいです。
あなたは、あなたが別のユーティリティクラスのみの静的メソッドが含まれています(PointCalculator)への静的メソッドを置くことを検討可能性の静的メソッドを使用する場合。これは、Mathクラスに似ています。
私はあなたのPoint
が不変であったとしても、指向より多くのオブジェクト(はい、あまりにも多くの静的メソッドを使用してポリモーフィズム、継承などのオブジェクトの利点を壊す...)されている非静的メソッドのために行くと思います。そして実際に、これはBigDecimal
またはBigInteger
のようなクラスが設計されている方法と一致するであろう。その上で、静的メソッドは、クラスが難しくテストするに私はそれが理にかなっている場合は特に、可能であればそれらの使用を避けることを好むので。
は意味的に、静的なアプローチは、もう少し理にかなっているようです。コースワークの意志が、非静的アプローチの両方は、他の上に一点に優先順位を与え、さらにそのPOINT1(ADDが上で呼び出されたメソッド)が呼び出しの結果として変更されてもよい意味している。
私が見た場合は、あなたのクラスを使用して開発者として、以下:
Point p1 = new Point(1,2);
Point p2 = new Point(2,3);
p1.Add(p2);
や..
Point p1 = new Point(1,2);
Point p2 = new Point(2,3);
Point.Add(p1, p2);
私の自然な傾向は、より明らかだ、非静的バージョンの修正でadd()メソッドは、静的なアプローチでポイント2の結果を追加するPOINT1と仮定するだろう(保証されていないが!)メソッドがあること純粋でrepresenative点は変更されていない。
の使用方法の本体はいずれかの特定のインスタンスに依存しない静的メソッド
一例として、あなたのadd(Point, Point)
方法を見て。あなたは、引数として関数に渡された2つのPoint
sを一緒に加えること、および他のPoint
を戻ってきています。これは実際にいくつかのthis
に内部Point
リファレンスを必要としていますか?
一方、メソッドのadd(Point)
を持っています。おそらくこれは、インスタンスへの関数の引数が追加されます - 。その場合、あなたは両方のPoint
sを持っているように、このインスタンスメソッドを作成する必要があります。
編集:私はもともと、誤解だと思います。振り返ってみると、あなたは、静的および非静的な実装の両方のための正しい署名を持っています。この時点で、私はあなたの両方が正常に動作します知っているように、それは、スタイルの問題だと思います。どのようにあなたのポイントクラスが使用されるようにしたいですか?それはPoint a = Point.add(b, c)
またはPoint a = b.add(c)
を言うために、コードをより直感的になりますかどうかを考えます。それは私に語ったよう個人的に、私はかつてのように、オペランドのどちらが変更されようとしていること。
、そして文体、私はあなたがオブジェクトとデータのカプセル化の最大の使用を作ってみるべきだと思います。私には、手段はそれに対処するために別のメソッドに渡すことが(Pointクラスに)あるデータを残さないこと。あなたのオブジェクトがあなたのために働くしてください。ただゲッターとセッターを持っていません。実際には、あなたがすべてでゲッターを必要とする避けることができるかについて難しいと思います。
不変クラスの新しいインスタンスを返す不変クラスに)追加(のようなメソッドを持っている)と(減算することは完全に一般的です。これは良いFP-のようなプログラミングのスタイルと、このようなクラスのために完全に合理的です。 (。良い例を参照のBigIntegerやBigDecimalのが悪い壊れた怖い例については、日付やカレンダーが表示されません:。)
クラスのメソッドを維持するあなたは、必要に応じてこれらのクラスは、実装デコレーターやアダプターパターンを使用し、テストなどの特定の種類を記述するかもしれないとのインタフェースを定義することができます。
してしまいがちなの規範をこのものは妥当と思われる。
- の方法は明らかにするとポイントの方法で扱う具体的にはポイント
- のための方法を利用し、あっことを示唆する必要な情報は一つのポイントの...いての上にポップアップしているインスタンスの方法である非静会員です。
のための言語のようにJavaなったと思い静方法、具体的には、この二点です。のための言語とオペレーターの過負荷などRuby),いて、インスタンスメソッドを活用しています。
これは、これらの関数は非静的である必要があることを当然です。あなたがGRASPを参照してください疑う場合でも、彼らはこのようなものを記述します。
情報専門の GRASPによると、これらの機能は、静的であってはなりません。
は、静的メソッドについての直接的な情報が存在しないという事実にもかかわらず、
がありますあなたのメソッドの静的を作る場合は、情報専門家は、に私たちをリードします とクラスで責任を置きます に必要なほとんどの情報 それを果たしています。
あなたは、実際のデータから、さらにあなたのロジックを移動し、メソッドにデータを渡す必要があります。
近いそれが使用するデータへのロジックを置く静的を削除します。
それらの静的を作るも、ユニットテスト彼らにそれが難しくなります!これを扱うことができ.NETで私が知っ唯一のモックフレームワークはTypeMockです。
意図は、新しいポイントが任意のアクセサ内のオブジェクトを返すことになるよりも、このクラスの不変を作ることである場合は、、それらの静的を作るので、呼び出しは、ここであまり意味がありません。
これらの方法は、静的であるべきです。この手段は、あなたがポイントを作成しますが、今後、そのデータを操作することはできません。追加/ Substractの/ etc方法が使用されるポイントのインスタンスを必要とすべきではないのユーティリティメソッドです。
あなたのケースでは、それはあなたがpublic static Point add(Point point1, Point point2)
に署名を変更しない限り、非静的である必要があります。
編集:私は降り投票。それはいいです。私は前の方法で静的を置くような些細な示唆を与えるしようとしていませんでした。この場合、インスタンスメソッドは良いですが、焦がす答えは本当にありません。それはちょうどあなたの好みに依存します。