ООП Дизайн - необходимо подготовить каждый вызов метода и очистить после - PullRequest
1 голос
/ 29 ноября 2011

Моя задача - создать класс, который позволял бы безопасно использовать объект (контейнер настроек или просто контейнер).У меня есть более 10 методов, где мне приходится повторять одни и те же действия: сохранять состояние контейнера, изменять состояние, выполнять какую-то работу, восстанавливать состояние, возвращать результаты.Пример:

public List<String> childKeys() {
    //saving state (repeated many time in other methods)
    final String clientGroup = clientSettings.group();
    //changing state  (repeated many time in other methods)
    clientSettings.endAllGroups();
    clientSettings.beginGroup(currentGroup);
    //doing job (exclusive for each method)
    final List<String> childKeys = clientSettings.childKeys();
    //restoring state  (repeated many time in other methods)
    clientSettings.endAllGroups();
    clientSettings.beginGroup(clientGroup);

    return childKeys;
}

Мне нужно сделать это, чтобы пользователь не изменил настройки системы и не хотел писать один и тот же код много раз.
Видите ли вы какой-либо способ изменить код, чтобы вызовы методов моглибыть подготовленным и убранным автоматически?

Ответы [ 5 ]

2 голосов
/ 29 ноября 2011

Создайте класс abstract, который имеет базовый поток и использует методы abstract, которые должен реализовать конкретный класс.

2 голосов
/ 29 ноября 2011

Если я вас хорошо понимаю, вы хотите убедиться, что определенный код вызывается до и / или после определенного набора методов?

Рассматривали ли вы AOP ?Это был бы хороший способ добавить один и тот же код в группу вызовов методов, не загрязняя ваш код суперклассами / дополнительными вызовами повсюду.

Spring-AOP - хорошийреализация этого, которая использует AspectJ под капотом.Посмотри.

1 голос
/ 29 ноября 2011

Есть несколько вариантов, один из которых - применить шаблон команды. Это может не иметь смысла, если различные функции (методы) отличаются только на несколько строк, в этом случае лучшим решением может быть решение AOP - как описано @ Guillaume.

Пример:

public abstract class Command<T> {

    public final T execute() {

        /* do common stuff... */
        clientSettings.endAllGroups();
        clientSettings.beginGroup(currentGroup);

        /* do the concrete stuff... */
        T t = this.performConcrete();

        /* do common stuff... */
        clientSettings.endAllGroups();
        clientSettings.beginGroup(clientGroup);

        return t;
    }

    protected abstract T performConcrete();
}

И конкретная реализация:

public class ChildKeysCommand<List<String>> extends Command {

    protected List<String> performConcrete() {
        return clientSettings.childKeys();
    }

}

И звонящий:

ChildKeysCommand c = new ChildKeysCommand();
List<String> keys = c.execute();
0 голосов
/ 29 ноября 2011

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

Если вы по какой-либо причине не можете использовать его или хотите сделать это с минимальными изменениями в кодовой базе, вы можете достичь той же функциональности, создав прокси-класс с помощью java.lang.reflect.Proxy. Вам нужно только очень хорошо документировать это ...

0 голосов
/ 29 ноября 2011

Может быть, вы можете создать атомарный метод, который создает два метода (endAllGroups и beginGroup), метод с именем changeState (Group group) ... и в этом случае метод будет изменен или изменен в любое время ...

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