Самый эффективный способ программирования на Java - PullRequest
2 голосов
/ 28 сентября 2011

Хорошо, допустим, у вас есть простая программа, которая принимает букву az, и если вы наберете «c», она что-то сделает, например, «e» может добавить 2 случайных числа, «h» отобразит слово «hello»,«х» отображает время и т. д.

Теперь, как я пытаюсь обойти это, имея 26 различных методов, по одному для каждой буквы, а затем основной объем кода, который сканирует для ввода пользователя, а затемвызывает соответствующий метод.

Теперь у них, очевидно, сотни способов обойти это, но два главных вопроса, о которых я думаю, это то, что у вас может быть 26 операторов if или switch (Пример, если (userInput.equals (")a ")), затем вызовите метод a и т. д.).Или другой способ, которым я размышляю, это иметь методы, помеченные как az, а затем, скажем, пользователь вводит «f» вместо проверки того, какая это буква, вместо этого он доверяет пользователю и вызывает именно ту букву, которую он набрал.

например:

-> Пользователь вводит Y

userInput = y;

userInput ();- (что по сути будет вызывать y (), который является именем метода).

Я считаю, что есть способ сделать это, используя «Отражение» из чтения здесь, но я слышал, чтобы избежать преждевременной оптимизации, нов этом случае не будет ли логичнее всего это сделать?

Ответы [ 5 ]

6 голосов
/ 28 сентября 2011

Пути, которые я вижу:

  • 1) установить большое дерево if / else if для проверки ввода пользователя
  • 2) настроить некоторые хлопьевидные, нестабильные и медленные отражающие вещества
  • 3) Используйте карту, где буквой «String» будет буква CmdHandler. будет класс, который имеет функцию для вызова. (Шаблон команды)

# 3 - это немного больше архитектуры для такого простого примера, но она лучше масштабируется.

РЕДАКТИРОВАТЬ: Quick N Dirty Пример

public class Testing {
    public static void main(String[] args) {
    CmdHandler ch = null;

    /* Setup & populate our map */
    HashMap<String, CmdHandler> cmdMap = new HashMap<String,CmdHandler>();

    ch = new AKeyHandler();
    cmdMap.put(ch.getCmd(), ch);

    ch = new BKeyHandler();
    cmdMap.put(ch.getCmd(), ch);
    /* ..etc.. */

    /* Actually use the system now! */
    String input = "";
    input = "a"; /* Get our input from... whereever */

    /* Do any input validation/manipulation here */

    CmdHandler handler = cmdMap.get(input.toUpperCase());
    if (handler != null)
        handler.doWork();
    else
        System.err.println("Egads!  A null!");

    }

public static abstract class CmdHandler {
    private final String cmd;
    public CmdHandler(String cmd) {
        super();
        this.cmd = cmd.toUpperCase();
    }
    public String getCmd(){
        return this.cmd;
    }
    public abstract void doWork();
}
public static class AKeyHandler extends CmdHandler{     
    public AKeyHandler() {
        super("a");
    }
    public void doWork() {
        System.out.println("Executing the A Key cmd doWork()");
    }
}
public static class BKeyHandler extends CmdHandler{     
    public BKeyHandler() {
        super("b");
    }
    public void doWork() {
        System.out.println("Executing the B Key cmd doWork()");
    }
}

/* ...etc... */

}

1 голос
/ 28 сентября 2011

Я бы рассмотрел использование enum.

enum Letter{
    A("a"){
        @Override
        void foo(){
            // do stuff
        }
    }, 
    B("b"){
        @Override
        void foo(){
            // do stuff
        }
    },
    .
    .
    .
    Z("z"){
        @Override
        void foo(){
            // do stuff
        }
    };

    private final String text;
    Letter(final String text){
        this.text = text;
    }

    abstract void foo();
    public static final Letter getInstance(final String s){
        for(Letter l: Letter.values()){
            if(s.equalsIgnoreCase(l.text)){
                return l;
            }
        }

        return null;
    }
}

Таким образом, вы можете просто получить пользовательский ввод, вызвать Letter.getInstance(...), а затем получить соответствующий Letter экземпляр. А затем оттуда вы просто вызываете foo() в экземпляре Letter, который будет делать что-то конкретное для этой буквы.

0 голосов
/ 28 сентября 2011

Отражение может быть вариантом, но вы рискуете, если пользователь введет суффикс функции, который не существует.Если использование базы данных не является вариантом, лучше всего было бы создать экземпляр Map с буквами в качестве ключей и отображать результат в качестве значения и вызвать метод get (Object key) с пользовательским вводом в качестве ключа.Если результат нулевой (пользователь не вводил букву), вы можете обработать его соответствующим образом.

Если значения необходимо вычислять, когда пользователь вводит букву, вы можете заполнить карту объектами, реализующими некоторый интерфейс, с помощью метода «process».Когда вы извлекаете значение, вам просто нужно вызвать метод процесса.Обратите внимание на использование анонимного класса, так как это, вероятно, было бы лучше всего в этой ситуации.

map.put("a", new Processor(){
     @Override
     public String process(){
          return "someString";
     }
}

, где Processor - некоторый созданный вами интерфейс.

0 голосов
/ 28 сентября 2011

Хорошо, во-первых, отражение на самом деле довольно медленное. Требуется, чтобы программа проверила свой собственный код (хотя это не может быть источником медлительности).

Вам действительно нужно 26 разных методов? это пахнет немного странно для меня. Есть ли любой код повторения в этих методах? если да, вы должны найти эту общность и иметь переключатель или набор операторов if для управления буквенно-ориентированным кодом. Это на самом деле будет более эффективным и создаст меньшую площадь для вашего приложения.

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

Если вы действительно нуждаетесь * в 1010 * этих 26 различных методах, ответ Дэйва Ньютона, вероятно, то, что вы хотите.

0 голосов
/ 28 сентября 2011

Это шаблон команды (Правка: удален весь юмор; слава богу, за патруль юмора) .Существует множество способов его реализации, но самый простой - это карта обработчиков команд.

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