Модуляция добавления новых строк -> вызовы методов - PullRequest
1 голос
/ 20 февраля 2011

Если у меня есть программа, которая делает следующее:

if(input=='abc'){do x}
if(input=='def'){do y}

В будущем я, возможно, захочу добавить еще один фрагмент кода, например:

if(input=='ghy'){do x}

Как видите, я добавляю новый оператор if для другого условного НО, используя ту же функцию X. Код в будущем может иметь множество различных операторов IF (или переключателей), каждый из которых сравнивает строку со строкой и затем выполняет функцию. Учитывая будущее расширение, мне было интересно, существует ли возможный «аккуратный», «модульный» способ достижения тех же результатов.

Жаль, что я не могу объединить String с вызовом метода в хеш-таблице (String, метод) в Java. Таким образом, я мог бы просто сохранить любые новые процедуры внутри хеш-таблицы и получить соответствующий метод для этой строки.

Есть идеи?

Спасибо

РЕДАКТИРОВАТЬ: Спасибо за все решения. Я был удивлен количеством и качеством ответов, которые я получил за такое короткое время.

Ответы [ 4 ]

4 голосов
/ 20 февраля 2011

Может быть, вы можете использовать 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();

Приветствия!

1 голос
/ 20 февраля 2011

Вы должны взглянуть на шаблон команды. Существует несколько способов его реализации, и такие фреймворки, как Spring, могут помочь вам сделать это простым способом.

Но простым способом вот что вы могли бы сделать:

1-Создайте интерфейс Command с методом, который ваша программа должна будет вызывать для выполнения задачи, скажем, doTask ()

2-Создание классов для команд X и Y, реализующих интерфейс Command.

3-Создайте Map<String, Command>, который сопоставит ваши команды (X и Y) с логическими именами

4-Создайте файл конфигурации по вашему выбору, например, файл .properties, который сопоставит ваш ввод с именами ваших команд: abc = X, def = Y, ghi = X

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

1 голос
/ 20 февраля 2011

Полагаю, вы всегда можете использовать Map и сопоставлять анонимным реализациям Runnable:

myMap.put("abc", new Runnable() { public void run() { do x } });

...

myMap.get(input).run();
0 голосов
/ 20 февраля 2011

Многие 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);
}

Базовый класс:

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 {...}
...