Могу ли я получить конкретный пример "класса облигаций" (с веб-сайта anti-if-campain)? - PullRequest
1 голос
/ 18 августа 2010

Существует веб-сайт (называемый кампанией Anti-if), в котором говорится о том, как заменить большие вложенные операторы if чем-то более удобным (с помощью «класса облигаций» см. пример ).Я понимаю концепцию, но не знаю, как ее реализовать (даже с примером ).

Вопрос: Могу ли я получить конкретный пример того, какреализовать это (т. е. класс облигаций)?- это беспокоило меня уже некоторое время.Я предпочитаю Java, но любые примеры приветствуются.

note Я нашел еще одну статью по этому вопросу в переполнении стека здесь

Ответы [ 2 ]

6 голосов
/ 18 августа 2010

Если я что-то упустил, я не уверен, что эта идея даже заслуживает собственного веб-сайта.

Это просто читается как полиморфизм, который является фундаментальной частью хорошего, нет любого , ОО дизайна.

Чтобы украсть ссылку из другого вашего вопроса:

Заменить условие на полиморфизм

Бонд - это просто пример, который они использовали для демонстрации. Он представляет собой финансовую облигацию, а не какую-либо ОО-концепцию или модель.

2 голосов
/ 18 августа 2010

Эта специальная техника, позволяющая избежать конструкций if-else-if, подобных показанным в примере на веб-сайте этих кампаний, можно найти в Чистый код Роберта С. Мартина .Если вы следуете его основным советам, вам не нужно вступать в кампанию;)

Пример на странице, на которую ссылаются, выглядит впечатляюще, главным образом потому, что код плохо отформатирован.Вот как это должно выглядеть:

// Bond class
double calculateValue() {
  if(_type == BTP)  { 
    return calculateBTPValue();
  } else if(_type == BOT) { 
    return calculateBOTValue();    
  } else {
    return calculateEUBValue();
  }
}

Рекомендуется заменить условие полиморфизмом, что даже не лучшая идея.Лучшим дизайном является использование композиции:

public interface BondType {
  public double calculate();
}

public class BOT implements BondType { 
  //...
}

public class Bond {
  private BondType type;
  public Bond(BondType type) {
    this.type = type;
  }
  public doublce calculateValue() {
    return type.calculate();
  }
}

Здесь мы избавились от условий и делегировали вычисления новому классу типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...