Тема: Хорошее MVC
Показать сообщение отдельно
Старый 11.09.2012, 10:17
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 11  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Как лучше протягивать баланс юзера в модельку shopItem?
Я сделал коллекции Condition и ComparisonObject. Первый по сути требования, условия. Второй -- то, что будем сравнивать с условиями. Сравнивать можно любые объекты, поддерживающие IComparator и IComparable.
ShopItem имплементит IComparator, с его методом compare. Метод принимает список ComparisonObject и возвращает Boolean (подошло/не подошло). У каждого магазина, его коллекции ShopItem'ов, самого ShopItem есть ссылка на User. User поддерживает интерфейс IComparable, метод которого getComparisonList(глагол):Vector.<ComparisonObject>, возвращает список доступных для сравнивания ComparisonObject;

getComparisonList извлекает предварительно подготовленные списки ComparisonObject. Их формированием и обновлением занимается сам IComparable, правила для этого находятся в нем.

Сама проверка можно ли купить предмет, с учетом скилов User и количества требуемой валюты сводится к одной строке
Код AS3:
const canBuyItem:Boolean = shopItem.compare( shopItem.user.getComparisonList(покупать) );
Коллекция ShopItem -- ShopItemCollection тоже поддерживает интерфейс IComparator;
Достаточно накидать в нее некоторое количество shopItem, а затем и с ней провести сравнение.
Код AS3:
const canBuyItems:Boolean = shopItemCollection.compare( shopItemCollection.user.getComparisonList(покупать) );
При этом будет учитываться количество, например денег, чтобы хватило на покупку всех айтемов. MoneyComprasionObject -> ChangeableComparisonObject -> ComparisonObject будет последовательно, с каждой проверкой уменьшать value. А вот, например, CharacteristicComparisonObject -> ComparisonObject и поэтому сравниваемая характеристика есть константа. Метода похожа на шаблон посетитель.

Итак, можно сравнивать все и вся, лишь бы была коллекция условий и то, с чем сравниваем. Можно померяться скилами UserData с коллекцией UserCollection.

Код AS3:
userCollection.compare( userCollection.user.getComparisonList(меряться_скилами) );
Вот как-то так я это сделал.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.