дизайн этой маленькой программы? - PullRequest
1 голос
/ 27 февраля 2012

enter image description here Пожалуйста, не возражайте против моего вопроса, так как он немного теоретический.

На прошлой неделе я дал интервью для работы, где мне дали задание, и позже они задают вопрос, и мой дизайн был неисправен. Так что я не мог получить работу. Я делюсь своим дизайном. Пожалуйста, посмотрите на это и предложите мне, где я ошибаюсь, и какое решение будет хорошим для него.

Проблема Это пакет для строительной компании, которая строит бассейны. Плавательный бассейн состоит из 2 частей бассейна и бассейна. Оба (бассейн и прилегающая территория) могут иметь прямоугольную или круглую форму (см. Прилагаемую картинку), поэтому будет 4 возможных формы. Программа должна рассчитать затененную площадь (от внешней поверхности бассейна до бетона).

**** Формула ** для расчета прямоугольной площади ** это Длина * Ширина * 2 Формула для расчета площади круга равна 2 * 2,1718

Мой дизайн Я сделал интерфейс IPool с 2 методами (1) CalculateCircularArea (2) CalculateRectangularArea. Сделано 2 класса (CircularPool, RectangularPool), реализующих интерфейс IPool.

Вопрос Что, если есть больше форм, кроме прямоугольных и круглых. Скажите, если есть еще 100 форм, какое решение будет рассматриваться в будущем проспекте? Здесь мой дизайн не был хорош, так как требовал изменения интерфейса, когда придет новая форма.

Ответы [ 3 ]

5 голосов
/ 27 февраля 2012

Дизайн уже был задан в вопросе: плавательный бассейн имеет окружающее пространство и имеет внутренний бассейн.Задача требует состав , а не наследования.

С этим дизайном мы можем придумывать другие формы и окружение бассейнов и при этом иметь бассейны

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();

Вот и все.Теперь мы можем поддерживать библиотеку различных бассейнов и внешних областей и немедленно использовать их для создания бассейнов без необходимости изменения реализации бассейна.Это преимущество композиции.

1 голос
/ 27 февраля 2012

Я думаю, что лучшим дизайном было бы иметь что-то вроде интерфейса IShape, который предоставляет метод getArea().(Или, что еще лучше, используйте его как свойство).

Таким образом, оба ваших «объекта» реализуют такой интерфейс, и вы можете вычислить нужную область, просто взяв разницу между значениями * 1005.*.

1 голос
/ 27 февраля 2012

Типичный случай для подклассов.Разработайте абстрактный класс 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.

...