Модуляция добавления новых строк -> вызовы методов
Если у меня есть программа, которая делает следующее:
if(input=='abc'){do x}
if(input=='def'){do y}
В будущем я, возможно, захочу добавить еще один фрагмент кода, например так:
if(input=='ghy'){do x}
Как вы можете видеть, я добавляю новый оператор "if" для другого условного НО, используя ту же функцию X. Код в будущем может иметь множество различных операторов IF (или переключателей), каждый из которых сравнивает строку с строка, а затем выполняет функцию. Учитывая будущее расширение, мне было интересно, есть ли возможный "аккуратный", "модульный" способ достижения тех же результатов.
Жаль, что я не могу объединить String с вызовом метода в хеш-таблице (String, метод) в Java. Таким образом, я мог бы просто сохранить любые новые процедуры внутри хеш-таблицы и получить соответствующий метод для этой строки.
Есть идеи?
Спасибо
РЕДАКТИРОВАТЬ: Спасибо за все решения. Я был удивлен количеством и качеством ответов, которые я получил за такое небольшое количество времени.
4 ответа
Может быть, вы можете использовать enum
, Пример:
public enum InputType
{
abc, def
{
@Override
public void x()
{
System.out.println("Another method");
}
},
ghy;
public void x()
{
System.out.println("One method");
}
}
И далее:
InputType.valueOf("abc").x();
Ура!
Я думаю, вы всегда можете использовать Map
myMap.put("abc", new Runnable() { public void run() { do x } });
...
myMap.get(input).run();
Вы должны взглянуть на шаблон команды. Есть несколько способов его реализации, и фреймворки, такие как Spring, могут помочь вам сделать это простым способом.
Но простым способом вот что вы можете сделать:
1-Создайте интерфейс Command с методом, который ваша программа должна вызывать для выполнения задачи, скажем, doTask ()
2-Создать классы для команд X и Y, реализуя интерфейс Command.
3-Создать Map<String, Command>
который отобразит ваши команды (X и Y) на логические имена
4. Создайте файл конфигурации по вашему выбору, например, файл.properties, который сопоставит ваш ввод с именами ваших команд: abc = X, def = Y, ghi = X
5. Затем ваша программа выполняет поиск в файле конфигурации, чтобы узнать, какую команду выполнить в соответствии с вводом.
Многие ifs всегда говорят нам, что мы могли бы сделать это лучше. В вашем случае лучше использовать шаблон проектирования, например, " Цепочка ответственности". У вас будет хорошая реализация, которую вы можете динамически изменять, и ваш код будет легче обслуживать, чем реализация ifs.
Взгляните на эту цепочку ответственности адаптации к вашему делу:
Главный:
public static void main(String[] args) {
ClassA classA = new ClassA(Arrays.asList("abc", "ghi"));
ClassB classB = new ClassB(Arrays.asList("def"));
classA.setNextInChain(classB); // you can always write Builder to do this
String input = "def";
classA.execute(input);
}
BaseClass:
public abstract class BaseClass {
private Collection<String> patterns = Collections.EMPTY_LIST;
protected BaseClass nextInChain;
protected abstract void doMethod(); // your doA, doB methods
public void execute(String input) {
// this replace many ifs in your previous implementation
if (patterns.contains(input)) {
doMethod();
} else {
nextInChain.execute(input);
}
}
public void setPatterns(Collection<String> patterns) {
this.patterns = patterns;
}
public void setNextInChain(BaseClass nextInChain) {
this.nextInChain = nextInChain;
}
}
Класс в цепочке:
public class ClassA extends BaseClass {
ClassA(Collection<String> patterns) {
setPatterns(patterns);
}
@Override
protected void doMethod() {
// do A
}
}
public class ClassB extends BaseClass {...}