2013-08-07 4 views
3

Ну, я видел, что были некоторые вопросы и ответы об этом, но они меня действительно не удовлетворяли.Отражения плохой или хорошей практики для команд

Скажем, например, я запрограммировал консоль. Это хороший JFrame с выходом и входным txtField/Area. Но эта консоль должна использоваться не только для вывода, но и для запуска команд.

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

Консоль имеет один метод для регистрации команд.

console.registerCommand(String command, String methodToInvoke, Object invokeObject); 

С помощью этого метода я могу использовать эту консоль везде, не нуждаясь в изменении или вдыхании.

Всякий раз, когда записывается String command, консоль знает, что это зарегистрированное ключевое слово и выполняет метод с помощью отражения.

Будет ли это хорошей или плохой практикой? По стилю кода и производительности! И что я мог сделать лучше?

Я также нашел довольно аккуратным использование отражений таким образом, чтобы добавить ActionListeners в MenuItems в TrayIcon.

Редактировать

К ниже Ответ:

Ok с командами я бы принять это способ сделать. Но в примере с лотком я написал класс TrayHelper, который создает TrayIcon. Там я хочу добавить MenuItems и их ActionListeners, но без создания каждого объекта сам и добавить их в Лоток. Так что я написал такие методы, как это:

public void addMenuItem(String label, String methodToInvoke, String invokeObject); 

Этот метод не только выполняет метод, когда MenuItem нажата, но и создает MenuItem первый, добавляет ActionListener к нему, который вызывает метод, и добавляет его в TrayIcon ,

Поэтому для того, чтобы использовать эту TrayHelper теперь я могу просто написать:

th.addMenuItem("Exit","exitMethod",this);//executes the exitMethod of 
             //this class after Menuitem Exit 
             //was clicked 

Я не очень понимаю, как я мог бы сделать это без отражения другого, чем писать все объекты себя снова и добавлять их в поднос. Или я слепой :)

Edit 2

Хорошо, я был слеп. Я просто не понимал, как это сделать без отражения, но это так просто.

Особенно с шаблоном команды.

Из анонимных классов я мог бы сделать это таким образом, и мне очень нравится, как писать код таким образом (я всегда делал это с ActionListeners)

th.addMenuItem("Test",new Command(){ 
     public void execute(){ 
      //do stuff 
     } 
}); 

Спасибо :)

+0

У вас есть особая проблема? В противном случае это скорее дискуссия, чем вопрос. Вы в основном придумали архитектуру плагина бедного человека; Я не вижу ничего плохого в этом. –

+0

Я использовал консоль и чувствовал, что это снизит мою производительность. Не только производительность программы, но и компьютера. Эсперантически после выполнения программы чаще (из-за развития, но всегда в одно время) – Loki

+0

Беспокоитесь о производительности, если и когда это действительно становится проблемой. Если вы неоднократно выполняете свои зарегистрированные команды тысячи раз в цикле извне, я не вижу, как производительность будет проблемой. Поэтому просто убедитесь, что все циклы запущены * внутри * invokeObject, и у вас никогда не должно быть проблем с производительностью. –

ответ

3

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

Кроме того, у вас может быть множество разных команд, и они могут быть связаны путем наследования или агрегации или вставляться друг в друга по мере необходимости, И НИКТО НЕ ДОЛЖНО ЗНАТЬ.

Во-первых у вас есть интерфейс:

public interface Command { 
    void execute(); 
} 

Тогда вы код взять один из них:

console.registerCommand(Command command); 

Затем вы пишете различные классы, которые реализуют интерфейс и сделать что-то:

public class OneCommand implements Command { 
    public void execute() { 
     theObject.theMethod(theCommand); // calls what you would have with reflection 
    } 
} 

Это стандартный командный шаблон GOF, и вы можете узнать больше об этом здесь: LINK TO WIKIPEDIA

Обратите внимание, что этот образец, наряду с другими образцами ГОФ, был опубликован в книге в 1994 году. Авторы собрали эти лучшие практики для многих программных проектов. Эта книга находится на 40-й печати (согласно Википедии).

Все это говорит о том, что многие люди нашли множество причин использовать их во многих частях одежды, на протяжении многих лет и во многих языках и системах программирования.

Это не значит, что вам всегда нужно их использовать, но использование проверенного образца поможет избежать невидимых ловушек.

+0

Итак, вы говорите, что 1. Вы не просачиваете детали реализации и 2. Вам больше не нужно размышлять? –

+0

@RobertHarvey Я не вижу отражение как плохое. Если он хочет использовать отражение внутри метода 'execute()', это будет хорошо для меня. Но сохранение когерентного кода имеет много преимуществ. Я думаю, что упростить запись в первую очередь, сокращая время отладки и быстрее, чтобы внести изменения, являются основными. –

Смежные вопросы