1

ここに画像の説明を入力してください少し理論的ですので、私の質問は気にしないでください。

先週、私は仕事のために面接をしました。そこで私は割り当てられました、そして後で彼らは質問をしました、そして私のデザインは不完全でした。だから私は仕事を得ることができませんでした。私は自分のデザインを共有しています。それを見て、私がどこが間違っているのか、そしてどのような解決策がそれの良いデザインになるのかを私に提案してください。

問題 これは、プールを建設する建設会社向けのパッケージです。スイミングプールは2つの部分からなるスイミングプール周辺エリアとそれ自体をプールします。両方(プールとその周辺)は長方形または円形(添付の写真を参照)にすることができるため、4つの可能な形状があります。プログラムは、影付きの面積(プールからコンクリートまでの外側の面積)を計算する必要があります。

****長方形の面積を計算する式**は長さ*幅*2 円形の面積を計算する式は2*2.1718

私のデザイン 私は2つのメソッドでIPoolインターフェイスを作成しました(1)CalculateCircularArea(2)CalculateRectangularArea。IPoolインターフェースを実装する2つのクラス(CircularPool、RectangularPool)を作成しました。

質問 長方形と円形以外の形状がある場合はどうなりますか。他に100の形状がある場合、将来の見通しを検討するソリューションは何でしょうか。ここでは、新しい形状が来るたびにインターフェイスを変更する必要があったため、私のデザインは良くありませんでした。

4

3 に答える 3

5

デザインはすでに質問で与えられました:スイミングプールには-周囲とそれがあります-内部プールがあります。このタスクでは、継承ではなく構成が必要です。

その設計により、他のプールの形状や周囲を発明し、それでもプールを維持することができます

public interface SwimmingPool {
  Surrounding getSurrounding();
  Pool getPool();
  double getOuterArea();
}

public interface Surrounding extends Shape{
  // some methods for surroundings
}

public interface Pool extends Shape {
  // some methods for pools
}

public interface Shape {
   double getArea();
}

次に、長方形と円形のプールの具体的なクラスを作成し、周囲はそれらのモジュールを使用してプールを設計します。


次に、具体的なスイミングプールクラスを作成します。

public SwimmingPoolImpl implements SwimmingPool {
 private Surrounding surrounding;
 private Pool pool;
 public SwimmingPoolImpl(Surrounding surrounding, Pool pool) {
   this.surrounding = surrounding;
   this.pool = pool;
 }

 public double getOuterArea() {
   return surrounding.getArea() - pool.getArea();
 }

 public Surrounding getSurrounding() { return surrounding; }
 public Pool getPool() { return pool; }
}

想像してみてください。数十の異なるプールとその周辺のライブラリがあり、カスタムプールを作成したいとします。

SwimmingPool customPool = new SwimmingPoolImpl(new OvalSurrounding(), new StarShapedPool());
double pavementArea =  customPool.getOuterArea();

それでおしまい。これで、さまざまなプールと外側の領域のライブラリを維持し、それらをすぐに使用して、スイミングプールの実装を変更せずにスイミングプールを作成できます。それが作曲のメリットです。

于 2012-02-27T11:42:46.847 に答える
1

サブクラス化の典型的なケース。Shape抽象関数を使用して抽象クラスを設計し、getArea()処理する必要のある可能なフォームごとに具体的なサブクラスを作成します。

Poolまたは、次のようSurroundingAreaに呼び出す必要があります。getArea()

public class SwimmingPool {
   Shape pool;
   Shape surrounding;

   public double geArea() {return pool.getArea() + surrounding.getArea()}
}

public abstract class Shape {
   public abstract double getArea();
}

public class Circle extends Shape {
   public double getArea() {
     // implementation of area calculation of circles
   }
}

public class Square extends Shape {
   public double getArea() {
     // implementation of area calculation of squares
   }
}

...

プールまたは他の形状の周囲の場合は、Shapeの別のサブクラスを設計する必要があります。

于 2012-02-27T11:40:25.850 に答える
1

IShapeより良い設計は、メソッドを公開するインターフェースのようなものを持つことだと思いますgetArea()。(または、さらに良いことに、それをプロパティとして持っています)。

このように、両方の「オブジェクト」がそのようなインターフェースを実装し、の値の差をとるだけで必要な面積を計算できますgetArea()

于 2012-02-27T11:41:36.533 に答える