Вы можете избавиться от if с помощью двух комбинированных шаблонов.Я также думаю, что if в первом блоке несколько не на том же уровне абстракции, что и код вокруг него.Другая проблема заключается в том, что это не следует принципу открытого закрытия.Допустим, вам нужен другой тип параметра поиска, например, регистрационный номер -R или любой другой.Вам нужно дотронуться до оператора if, и если он становится все больше и больше, вы можете что-то сломать.
, поэтому давайте посмотрим, как может выглядеть хороший код без if
args.put("-T", "Tom Sawyer");
args.put("-I", "1112223334");
Book book = libraryService.findBook(args);
Ноэто, очевидно, не работает как это из коробки.Но вы можете сделать что-то подобное с шаблоном стратегии.
IBookFindStrategy {
Book findBook(string param)
}
class IsbnFindStrategy : IBookFindStrategy {
Book findBook(string param) {
// your repocall
}
}
class NameFindStrategy : IBookFindStrategy {
Book findBook(string param) {
// your repocall
}
}
Теперь вам просто нужно преобразовать параметры в другом месте и инициализировать правильную стратегию на фабрике.Фабрика может хранить параметры в Hashmap и вызывать их с параметром -T
, который даст вам NameFindStrategy
.Примерно так
class StrategyFactory {
Hashtable<String, IBookFindStrategy > strategies;
public StrategyFactory() {
strategies = new HashMap<String, IBookFindStrategy >();
strategies.put("-T", new NameFindStrategy());
strategies.put("-I", new NameIsbnFindStrategy());
}
public IBookFindStrategy GetStrategy(string param) {
return strategies.get(param);
}
}
И, наконец, ваш main будет выглядеть примерно так:
StrategyFactory factory = new StrategyFactory();
IBookFindStrategy bookFinder = factory.getStrategy(args);
Book book = bookFinder.findBook(args);
Я не на dev-машине, а моя java немного ржавая, поэтому ямне немного лень записывать все, но я надеюсь, что вы поняли концепцию.