Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите С Выбором Паттерна 
:(
    Опции темы
zasaz63
Дата 30.5.2013, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.5.2013

Репутация: нет
Всего: нет



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

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

Причём упорядоченный набор выбирается в зависимости от некоторых условий.
Например
    если у пользователя статус "Одиночка", то выполняется 3->4
    если у пользователя статус "Свободный", то выполняется 4
    если денег > 10000 то 3->1->4
    
И вообще, есть ли смысл применять какие-то паттерны?
PM MAIL   Вверх
Arantir
Дата 30.5.2013, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



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

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


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
zasaz63
Дата 30.5.2013, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.5.2013

Репутация: нет
Всего: нет



Во-первых не хочется смешивать общую логику с логикой делёжки денег.
Во-вторых хочется как то вынести указание этих условий и операций в конфигурационный файл, чтобы было проще редачить.
Хотя думаю второе усложнит код...
PM MAIL   Вверх
Arantir
Дата 30.5.2013, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



Цитата(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);
        }
    }
    // ...
}


Это похоже на паттерн стратегии. Контекстом выступает класс бухгалтера, а стратегией соответствующий ИИ.

Это сообщение отредактировал(а) Arantir - 30.5.2013, 18:31


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
zasaz63
Дата 30.5.2013, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.5.2013

Репутация: нет
Всего: нет



Спасибо! Это похоже на то, что надо)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.