Лучший ОО способ справиться с "кнопкой отмены" - PullRequest
3 голосов
/ 23 мая 2011

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

Дело в том, что этот способ делает код грязным, имея много «отмененных проверок» между логикойэто имеет значение.

Я всегда получаю что-то вроде этого:

void doLogic()
{
     checkIfIsCancelled();
     callOtherFunction();

     checkIfIsCancelled();
     callAnotherFunction();

     checkIfIsCancelled();
     callAnotherFunction();

     checkIfIsCancelled();
     callAnotherFunction();
}

Надеюсь, я был достаточно ясен.Я просто хочу аккуратный способ сделать это:)

Ответы [ 4 ]

1 голос
/ 24 мая 2011

Правильный способ справиться с этим - шаблон стратегии , где у вас есть стратегия по умолчанию, в которой вы выполняете обычную обработку, и у вас есть стратегия отмены.

Отмена изменяет стратегию на cancelledStrategy, которая не делает ничего, кроме некоторой очистки. Следующий вызов перейдет на отмененную стратегию.

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

Другим возможным решением (но очень зависящим от вашей ситуации) будет шаблон состояния, но если вам нужно только его отменить, это создает много накладных расходов.

0 голосов
/ 01 июня 2011

Вы можете использовать шаблон команды вместе со стеком для реализации многоуровневой поддержки отмены.

0 голосов
/ 23 мая 2011

1-й, что приходит на ум, это http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern, но я не уверен, что здесь хорошо.

0 голосов
/ 23 мая 2011

ДЕЙСТВИТЕЛЬНО помогло бы узнать какой комплект GUI вы используете здесь. Просто из этого невозможно узнать, имеете ли вы дело с Windows, Linux или Mac. Добавьте к этому, я не могу придумать ни одного графического интерфейса, который бы работал таким образом.

Большинство графических интерфейсов работают с шаблоном «обратного вызова». Виджеты (кнопки, меню, списки и т. Д.) Создаются, и ваш код присоединяет «обратный вызов», фрагмент кода или объект и метод, который выполняется при выполнении действия над виджетом.

В Java, например:

Button b = JButton("Push") ;
listener = new ActionListener()_ {
    public void actionPerformed(ActionEvent e) {
        System.out.println("I was pushed!") ;
    }
} ;
b.addActionListener(listener)

Организует сообщение "Меня толкнули!" быть напечатанным при нажатии кнопки. Конечно, в этих тонких примерах пропущена вся работа, необходимая для настройки окна, заполнения этого виджета и т. Д.

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