Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Подскажите С Выбором Паттерна


Автор: zasaz63 30.5.2013, 16:14
Народ, подскажите с выбором паттерна.
Есть модель пользователя (User).
У пользователя есть "подельники".
Есть в User метод addMoney().
И вот стратегия добавления немного запутанная.

Есть допустим несколько операций для добавления денег
1. пользователь делится деньгами со своими "подельниками" с некоторым коэффициентом (все получают поровну)
2. пользователь делится деньгами со своими "подельниками" (все получают по-разному)
3. некоторая комиссия идёт администрации
4. деньги просто зачисляются на счёт пользователя
5. деньги вообще не зачисляются

Причём упорядоченный набор выбирается в зависимости от некоторых условий.
Например
    если у пользователя статус "Одиночка", то выполняется 3->4
    если у пользователя статус "Свободный", то выполняется 4
    если денег > 10000 то 3->1->4
    
И вообще, есть ли смысл применять какие-то паттерны?

Автор: Arantir 30.5.2013, 17:25
Обычно вопрос о применении паттерна встает в меру возникновения необходимости в этом.
Разные паттерны решают разные проблемы, ибо у каждого паттерна есть и плюсы и минусы. Паттерн полезен, когда минусы не играют роли на фоне плюсов.

Вы привели лишь один класс и возможность его поведения в зависимости от его состояния. Почему Вы думаете, что Вам нужен какой-то паттерн? Почему, например, не сделать просто через набор if/elseif? Чем этот способ неудобен (личная неприязнь не считается)?

Автор: zasaz63 30.5.2013, 17:40
Во-первых не хочется смешивать общую логику с логикой делёжки денег.
Во-вторых хочется как то вынести указание этих условий и операций в конфигурационный файл, чтобы было проще редачить.
Хотя думаю второе усложнит код...

Автор: Arantir 30.5.2013, 18:21
Цитата(zasaz63 @  30.5.2013,  16:40 Найти цитируемый пост)
Во-первых не хочется смешивать общую логику с логикой делёжки денег.

Создайте отдельный класс (такой себе бухгалтер), который будет в себе эту логику содержать. А в классе пользователя просто вызывайте метод бухгалтера 
Код

class User {
    Accountant accountant;
    // ...
    public void addMoney(double sum) {
        accountant.addMoney(this, sum);
    }
    // ...
}
Можно даже иметь много бухгалтеров с разной логикой и менять при нужде (как статично, так и динамично во время выполнения).

Цитата(zasaz63 @  30.5.2013,  16:40 Найти цитируемый пост)
Во-вторых хочется как то вынести указание этих условий и операций в конфигурационный файл, чтобы было проще редачить.

Ну для конф. файла и сложный условий придется писать некий псевдо-язык, парсить его и т.п... запарно немного.
Java может компилить внешние классы. Так что можно вывести логику условий в отдельный внешний класс и писать условия сразу на Java. Такой себе ИИ поведения для бухгалтера.
Код

class AccountantAI {

    public void canAddMoney(User user) {
        return true;
    }

    public void addMoney(User user, double sum) {
        user.money += sum;
    }

    public double getCoefficient() {
        return 0.05;
    }
}

class Accountant {
    AccountantAI ai;
    // ...
    public void addMoney(User user, double sum) {
        if (ai.canAddMoney(user)) {
            sum *= ai.getCoefficient();
            ai.addMoney(user, sum);
        }
    }
    // ...
}


Это похоже на паттерн http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D1%8F_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F). Контекстом выступает класс бухгалтера, а стратегией соответствующий ИИ.

Автор: zasaz63 30.5.2013, 22:32
Спасибо! Это похоже на то, что надо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)