1 Востаннє редагувалося Mafia (09.12.2014 17:10:01)

Тема: Архітектура програми. Допомога стуенту

Доброго часу доби, форумчани.
Дали завдання мені, треба придумати архітектуру проекту,
так, щоб логічно працювало. В надії, що тут є люди, які розбираються з архітектурою ПЗ і готові помогти.
Ось текст завдання

Прихований текст
Створити консольну версію інтернет аукціону.
Програма дозволяє купувати товари за фіксовану ціну або на аукціоні між різними користувачами.
Програма має складатися з трьох логічних частин:
backend - для обробки команд і даних,
historyLoader - для завантаження історії команд при запуску програми
userInterface - для консольної взаємодії з користувачем
reports - для створення звітів

backend
Містить класи для представлення товарів, користувачів, ставок (bids) на аукціоні, та мехінізм для їх збереження.
Містить логічний функціонал перевірки вхідних даних при створенні вищеперелічених об'єктів.
Користувач має інформацію про свій тип, логін, пароль, ПІБ, країну, номер кредитної картки, історію покупок та ставок, рейтинг продавця (0-100), відмітку перевіреного продавця (встановлюється адміністратором аукціону), рейтинг покупця (0-100) (очивидно, що підкреслені властивості можуть виникнути тільки всередині аукціону, і не можуть бути завантажені з файлу).
Типи користувачів: адміністратор, користувач.
Адміністратор не може продавати/купувати товари, але може блокувати користувачів, надавати їм відмітку перевіреного продавця, блокувати позиції аукціону (модерація).
Товар має назву, опис, кількість одиниць (наприклад, 5 пар взуття, як одна позиція в аукціоні), ціна, тип продажу (аукціон, фіксована ціна), термін аукціону (1,3,5 днів), мінімальне зростання ставки, доставку в обмежену кількість країн (або у всі можливі), обмеження на рейтинг покупця.
Ставка має інформацію про того хто її зробив, іі значення і час.
При встановленій фіксований ціні товар може бути куплений одразу, якщо термін аукціону це дозволяє. При аукціоні, товар отримується тим користувачем, який зробив найбільшу ставку.

Процес роботи аукціону:
Позиція аукціону має початкову ціну 100, мінімальне зростання 5.
Користувач А робить ставку (для нього ціна 100)
Користувач В робить ставку (для нього ціна 105)
Користувач А робить ставку +15 (нова ціна - 120)
Термін аукціону вичерпався (заборона на нові ставки)
Товар проданий за 120

historyLoader
Містить функціонал для завантаження певного стану інтернет аукціону з файлу. Вміє розрізняти команди у файлі та перевіряти їх на правильність.
команда складається з таких частин: час, тип команди, додаткові дані.
Файл містить команди в порядку зростання часу (вважатимемо, що дві коменди не можуть виконуватися в той самий час, але валідація має бути присутня), при обробці команди внутрішній годинник аукціону оновлюється до вказаного часу і виконуються автоматичнві дії, такі як завершення акціону для товару А, тощо.
Кожна команда може мати свою кількість додаткових даних.
Типи команд користувачів: створити користувача, змінити його дані, створити позицію на аукціоні (товар), зробити ставку
Типи команд адміністраторів: заблокувати користувача, надавати користувачу відмітку перевіреного продавця, блокувати позиції аукціону (модерація)

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

Тексти (такі як опис) мають бути обмеженні у файлі символами " (наприклад "some description for product F").

userInterface
Дозволяє залогуватися в систему за логіном та паролем.
Для адміністратора дає можливість створювати користувачів, блокувати користувачів, надавати їм відмітку перевіреного продавця, блокувати позиції аукціону (модерація).
Звичайний користувач може переглядати всі позиції з застосуванням фільтрів (ціна, назва, тип товару, тощо) та сортувань, робити ставки, переглядати свої товари, історію своїх покупок та продажів, продавати товари.

reports
Дозволяє згенерувати звіт згідно стану системи (завантаженої історії). Звіти зберігаються у зовнішній файл з вказаним з консолі іменем. Типи звітів: завершені аукціони за останні 30/90/180 днів, активні аукціони (сюди входять непродані товари з фіксованою ціною) на даний момент, заблоковані аукціони за останні 30/90/180 днів, доходи продавців за останні 30/90/180 днів.

Програма має запускатися з консолі в трьох режимах:
З інтерфесом, можлитвістю залогуватися, тощо (historyLoader завантажує файл на старті без виводу на консоль)
Режим логу - historyLoader завантажує файл на старті та виводить на консоль повідомлення про невалідні дії (такі як купівля проданого товару)
Режим звітів - створення звітів через консоль з визначенням необхідних параметрів.

Програма має розроблятись у Visual Studio 2013
на мові програмування с++.
Я думав можливо зробити клас сесію, в якій буде вказівник стан перебування користувача(паттерн стан) і вказівник на Ebay(буде представляти бекенд). Користувач буде вводити команди якісь команди. Їх буде парсити якісь один функція і буде видавати об’єкт команда(вона інкапсуює характеристики команди). Який буде хендлетись в обробітнику подій сесії. Там з характеристик команди буде вибиратись чи має право команда передаватись до бекенду(Ebay). В самому бекенді команда буде хендлитись теж і перевіряти валідність команди, на рахунок даних які є. Тут би якось зробити оброблення команди. Може chain of responsibility. Зробити декілька хендлерів котрі по черзі будуть обробляти команду.
Це взагалі то завдання на паттерни. Я так орієнтуюсь в них, а тут практичне завдання в якому треба декілька скомбінувати, і задумався.
Я чув, що для чогось подібного юзається MVC. він тут підходить. Просто я ше його не розгялядав. Варто це робити? Якщо він підходить то, як саме повинен виглядати.
Насправді можу хоч зараз почати писати. В скінченний автомат зажену роботу з юзером. А даватиму йому команди просто вибором циферок і буду їх хендлети. Але то не гарно. І там потім якісь кастилі на пишу. І буде огедний код. Тому і питаюсь людей з досвідом. Може шось порадять.
п.с. Прочитав книгу Head First Design Patterns by Eric T Freeman