Design oop model/ru

From JazzTeamWiki
Jump to: navigation, search

Оживление ООП модели

1) Для начала выберите предметную область, с которой вы хорошо знакомы.
2) Распишите текстом определенные ситуации, которые могут возникнуть в вашей предметной области. Эти ситуации вы и будете оживлять. На основе этих ситуаций вы поймете, какие классы и методы вам необходимо добавить.
3) Создайте UML класс-диаграмму, основываясь на знании предметной области и того набора use cases (варианты использования), которые вы написали. Это означает, что вы не обязаны покрыть все возможные классы вашей предметной области, вы должны выбрать только те, которые имеют смысл для use cases. С другой стороны, модель должна получиться логичной и .
  • Вы не должны спешить с тем, чтобы классы имели все возможные поля или методы, хотя если вы действительно понимаете, что определённые поля и методы должны присутствовать, то обозначьте их.
  • В этом пункте важно, чтобы в вашей модели были все виды отношений между классами, а также, чтобы модель демонстрировала принципы полиморфизма (необходимо в дальнейшем для отработки принципов расширяемого программирования, паттернов, возможно, добавления плагинности в вашу модель).
4) Создайте в Java коде классы с полями и методами. Напишите первые простейшие юнит-тесты, которые тестируют элементарные вещи - к примеру, если один объект установить во второй, то соответствующий getter будет возвращать именно его.
5) Рассмотрите детально все use cases, которые вы составили и определите логику взаимодействия классов. Начните оживление модели, вводя необходимые поля и методы.
  • Необходимо очень внимательно отнестись к сигнатурам методов. Подумайте в каждом случае, как вы реализуете взаимодействие объектов. Через передачу ссылки в каждый метод или через заполнение специального поля класса, чтобы не засорять сигнатуры. Каждый метод, его сигнатура, должны быть понятными, логичными, нужными. Изучите статью Примеры типичных ошибок при построении ООП модели, чтобы понять более подробно, о чём идёт речь.
6) Обновите ваш Java код необходимыми изменениями, которые вы только что внесли в модель.
  • Нужно добиться того, что вначале вы меняете модель, и только потом – Java код.
7) Теперь полностью реализуйте нужные use case - то есть добейтесь того, чтобы в методе main (лучше не использовать вообще), или в соответствующем юнит-тесте вы могли с самого начала сконструировать все объекты, установить все отношения между ними, и потом сэмулировать ваш use case, запустить его через какую-то последовательность вызовов методов.
8) Вам необходимо продолжить написание юнит-теста для того, чтобы удостовериться, что результат выполнения метода или последовательности методов соответствует ожидаемому результату. Для этого необходимо использовать ассерты.


При написании руководствовались статьей Обкатка знаний java на реальном ООП примере.


Бонусные пункты

9) Подумайте, где в вашей модели (в каких классах, и в каких use cases) можно применить полиморфизм. Примените его за счёт создания классов, у которых один и тот же метод ведёт себя по-разному. Добавьте в код программы место, где существует список таких объектов, и происходит вызов этого метода для всех объектов списка.
Полиморфизм — это способность объекта использовать методы производного класса. Кратко смысл полиморфизма можно выразить фразой «один интерфейс, множество реализаций».
Приведем пример полиморфизма:
В гостинице имеется различный , который выполняет свою единственную функцию:
  • Повар занимается приготовлением пищи;
  • Горничная убирает в номерах;
  • Плотник чинит мебель;
  • Администратор работает с клиентом.
У всех "сотрудников" гостиницы есть один метод - "работать", определённый в интерфейсе "сотрудник" и переназначенный в классе каждого работника. Теперь, обращаясь к любому объекту "сотрудник", нам не обязательно знать, к какому именно "сотруднику" мы обращаемся и какую именно работу он должен выполнять, достаточно вызвать метод "работать", и каждый "сотрудник" будет выполнять свою "работу".
10) Решите, где в вашей модели можно ввести плагинную систему. Плагины – динамически добавляемые модули программы. Плагинная система позволяет в любой момент времени подгрузить какой-либо модуль, добавляющий определённый функционал. При этом не обязательно останавливать и пересобирать проект. Так же такая система позволяет другим программистам, писать свои плагины для вашего программного продукта, имея доступ к его API. В Java реализация плагинов основана на рефлексии - динамическом получении информации о классах.
11) Вы можете вполне добавить в свою задачу различные другие усложнения, которые помогут вам попрактиковаться с ООП, паттернами и программированием на Java, к примеру:
Сериализация - процесс перевода какой-либо структуры данных в последовательность битов. Это позволило бы сохранять состояние объектов в базу данных, файл или отправить по сети. Обратной к операции сериализации является операция десериализации - восстановление начального состояния структуры данных из битовой последовательности.
Древовидная иерархия наподобие DOM-модели (от англ. Document Object Model — «объектная модель документа»), когда в один объект могут быть вложены другие объекты. Обратимся к простому примеру: имеется строка, которую нужно разбить по скобкам на объекты, тогда DOM-модель будет выглядеть так:
Пример дом модели
В этом примере видно, как, создавая иерархию, можно обращаться к отдельным объектам, вложенным в определенные скобки.


Примеры работ практикантов

Гостиница

Краткое описание:

ООП модель не большой гостиницы (несколько десятков номеров). В штате гостиницы состоят: директор, администратор (на ресепшене), горничная, разнорабочий.

Use cases:

  • Уборщица убирает во всех номерах, где не висит табличка “не беспокоить”.
  • Клиент повесил табличку «не беспокоить».
  • У клиента сломался вентилятор / сантехника, и он вызывает мастера.
  • Клиент вызывает уборку номеров.
  • Администратор рассчитывает клиента и заселяет его.
  • У человека недостаточно денег, чтобы заселить в отель.
  • Человек не может заселиться, так как в гостинице нет свободных номеров.
  • Директор изменил цены на номера.
  • Директор проверяет отчет.

Диаграмма:

ООП модель гостиницы

Комментарии к модели: В начале не до конца продумал бизнес-логику модели, использовал только public методы.


Код

Юнит-тесты


Автопарк

Краткое описание:

Данная ООП модель отражает работу небольшого автопарка. Который предоставляет аренду авто населению. Штат рабочих составляют: , Экономисты, Водители, Механики.

Use cases:

  • Директор хочет просмотреть экономический отчет( он дает указание экономисту, экономист, используя данные о деятельности компании, составляет экономический отчет и возвращает его директору)
  • Директор хочет проконтролировать определенного сотрудника( он дает задание подготовить его досье, отдел контроля за сотрудниками в свою очередь, пользуясь данными о сотрудниках, предоставляет его личное дело).
  • Заказчик хочет арендовать автобус для поездки(он выбирает нужную марку транспорта, которая есть в наличии и не находится на ремонте, оформляет заказ и передает этот заказ , который проверяет правильность заполнения, прилежность заказчика и возвращает ему ответ о его заказе, а также заполняет ведомость о проведенной аренде).
  • Водитель при работе на авто определяет, что авто сломано,он сообщает о поломке авто механику, водитель в свою очередь реагирует на жалобу водителя, определяет серьезность поломки и ремонтирует авто.
  • Человек хочет устроится на работу(он заполняет и подает заявление в организационный отдел, отдел это заявление обрабатывает и возвращает результат - принят или нет)


Диаграмма:

ООП модель автопарка

Комментарии к модели:

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

Код

Юнит-тесты


Офис

Краткое описание:

ООП модель офиса. Содержит в себе находящиеся в офисе и сотрудников.

Use cases:

  • Сотрудник получает зарплату.
  • Сотрудник увольняется.
  • Сотрудник включает .
  • Сотрудник включает монитор.
  • Сотрудник выключает .
  • Сотрудник выключает монитор.
  • Сотрудник идёт на обед.
  • Сис. админ производит ремонт .
  • Сис. админ производит диагностику .
  • Сотрудник печатает документы.
  • Бухгалтер работает с бумагами.
  • Бухгалтер работает за .
  • Сотрудник включает свет в офисе.
  • Сотрудник выключает свет в офисе.
  • Уборщица убирает офис.
  • производит расчеты.
  • Сотрудник закрывает крышку ноутбука.
  • Сотрудник открывает крышку ноутбука.


Диаграмма:

ООП модель офиса

Комментарии к модели:

Основные ошибки были в неправильном названии классов.

Код

Юнит-тесты


Герои Меча и Магии

Краткое описание: Модель эмулирует работу популярной игры Герои Меча и Магии и включает в себя такие сущности как: Герой, Артефакт, Заклинание и т.д.

Use cases:

  • Замок создает постройки
  • Герой добавляется в таверну для последующего найма
  • Нанять героя, после чего он удаляется из таверны
  • Изучить новое заклинание
  • Купить существо
  • Применить заклинание
  • Применить артефакт
  • Взять ресурсы
  • Отправить ресурсы капитолия на склад
  • Посетить обучающую постройку
  • Прокачать капитолий

Диаграмма:

ООП модель Героев Меча и Магии

Комментарии к модели:

На этапе проектирования модели немного неверно определил иерархию классов, что в последующем грозило появлением Copy&Past в коде программы.


Код

Юнит-тесты


Браузер ДНС сервер

Краткое описание: Данная модель отражает работу браузера с днс. В модели присутствуют следующие сущности: Системный администратор, пользователь, браузер и т.д.

Use cases:

  • Системный администратор добавляет домены в базу dns.
  • Системный администратор удаляет домены с базы dns.
  • Пользователь переходит на сайт.
  • Пользователь создает учетную запись.
  • Пользователь входит под учетную запись google chroma.
  • Пользователь хочет установить расширения на google chrome.
  • Пользователь удаляет браузер google chrome.
  • Пользователь загружает файлы.
  • Разработчики google добавляют новые расширения в браузер.

Диаграмма:

ООП модель браузер ДНС сервер

Комментарии к модели:

Основными ошибками было: неправильное взаимодействие классов друг с другом, неправильные имена.

Код

Юнит-тесты


Настольная игра Манчкин

Краткое описание: Данная модель основана на настольной игре Манчкин. В ней реализованы правила настольной игры, фазы хода игрока, виды игровых карт, добыча артефактов и повышение уровня путём сражений с монстрами.

Use cases:

  • Открыть карту двери
  • Применить карту
  • Взять карту сокровищ
  • Сбросить карту
  • Принять бой
  • Позвать на помощь в бою
  • Сыграть монстра против себя
  • Попытаться убежать из боя
  • Взять карту из сброса

Диаграмма:

ООП модель Манчкин

Комментарии к модели: В начале модель имела много static методов и полей, и функционал был разбросан по классам Game, Player, Fight. На данный момент от static методов и полей отказался и весь функционал сосредоточил в классе Game.

Код

Юнит-тесты

Звездные Войны

Краткое описание:

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

Use cases:

  • Дройд аткует противника
  • Джедай атакует противника
  • Джедай приказывает пехоте атаковать противника
  • Пехота атакует противника
  • Бомбардировщик атакует противника
  • Бомбардировщик бомбит планету
  • Бомбардировщик летит к другой планете
  • Флагман атакует противника
  • Флагман захватывает планет
  • Флагман летит к другой планете
  • Истребитель атакует противника
  • Истребитель летит к другой планете
  • Перехватчик атакует противника
  • Перехватчик захватывает корабль
  • Перехватчик летит к другой планете
  • Казарма продает наемников
  • Казарма повышает свой уровень
  • Казарма поднмиает свой уровень
  • Оборона получает солдат
  • Оборона повышает свой уровень
  • Оборона понижает свой уровень
  • Магазин оружия продает оружие
  • Магазин оружия покупает оружие
  • Магазин оружия повышает свой уровень
  • Магазин оружия понижает свой уровень
  • Инфраструктура приносит доход
  • Инфраструктура повышает свой уровень
  • Инфраструктура понижает свой уровень
  • Верфь строит истребитель
  • Верфь строит бомбардировщик
  • Верфь строит флагман
  • Верфь строит перехватчик

Диаграмма классов:

Диаграмма классов модели

Комментарии к модели: Изначально была плохо продумана боевая система, впоследствии заменена.

Код

Тесты

Сталкер

Краткое описание: ООП модель по игре Сталкер и включает в себя такие сущности как: Сталкер, мутанты,оружие, артефакты и др.

Use cases:

  • Сталкер переходит в локацию
  • Сталкер вступает в группировку
  • Сталкер покидает группировку
  • Сталкер начинает торговать, покупает предмет
  • Сталкер начинает торговать, продаёт предмет
  • Сталкер вступает в бой и убивает противника
  • Сталкер вступает в бой и умирает
  • Сталкер обыскивает объект, забирает предмет
  • Сталкер обыскивает объект, забирает деньги
  • Сталкер выбрасывает предмет из инвентаря
  • Сталкер одевает аммуницию из инвентаря
  • Сталкер снимает аммуницию и кладёт её в инвентарь
  • Сталкер съедает еду из инвентаря
  • Сталкер использует аптечку если ранен и восполняет здоровье


Диаграмма:

ООП модель Сталкер

Комментарии к модели:

Основные ошибки: в класс-диаграмме не было generic-ов, переменные и методы были неправильно названы, инициализация полей происходила не в там где нужно.

Транспортная логистическая компания

Краткое описание ООП модель, имитирующая работу транспортной логистической компании. Имитирует работу руководителя, экономиста, водителя, грузчика.

Use cases:

  • Приём на работу новых сотрудников
  • Прохождение собеседования кандидатми
  • Оформление договора на оказание транспортных услуг менеджерами
  • Руководитель и заказчик подписывают договор
  • Расчет стоимости контракта экономистом
  • Погрузка и разгрузка товаров согласно товарной накладной
  • Погрузку осуществляют грузчики
  • Доставка товара водителем
  • Возникновение нестандартных ситуаций:
    • Кандидат не прошел собеседование
    • Кандидат не явился на собеседование
    • Автомобиль сломался во время доставки
    • Заказчик не подписал контракт
    • Грузчик повредил товар при погрузке

Диаграмма классов: 600px|thumb|center|ООП модель "Транспортная логистическая компания"

Код

Юнит-Тесты

Морской бой

Краткое описание: ООП модель усовершенствованной версии игры "Морской бой". В качестве усовершенствований была добавлена возможность передвигать корабли и покупать в магазине оружие для выстрела.

Use cases:

  • Автоматический расстановщик кораблей располагает корабли на поле боя
  • Каждый ход система увеличивает количество денег игроков
  • Пользователь приобретает в магазине оружие
    • Пользователь покупает в магазине одиночную бомбу
    • Пользователь покупает в магазине двойную бомбу
    • Пользователь покупает в магазине тройную бомбу
    • Пользователь покупает в магазине мину
  • Магазин выдает пользователю оружие, если у него хватает на него денег
  • Пользователь выбирает набор клеток, которые будут атакованы купленным оружием
  • Игровое поле реагирует на выстрелы
    • Одиночная, двойная, тройная бомбы повреждают корабли при попадании
    • При промахе мина остается на поле боя, мешая передвижению кораблей
    • При попадании в корабль мина повреждает его
  • При попадании пользователю дается дополнительный ход
  • Раз в ход пользователь передвигает корабль на одну клетку
  • Пользователь выбирает корабль для передвижения
  • Пользователь выбирает направление передвижения для корабля
  • Корабль передвигается на одну клетку, если при этом не выйдет за поле боя и его передвижению не мешают другие корабли и мины
  • Простейший искусственный интеллект делает ходы
    • ИИ случайным образом выбирает бомбу
    • ИИ случайным образом выбирает клетки для выстрелов
    • ИИ случайным образом выбирает корабли для передвижения
    • ИИ случайным образом выбирает направление движения кораблей
  • Пользователь сохраняет игру в базе данных
  • Пользователь загружает сохраненную игру

Диаграмма классов:

ООП модель "Морской бой"

Код

Юнит-Тесты

Расчёт стоимости и длительности проекта

Краткое описание: ООП модель позволяет ответить на вопрос можно ли выполнить данный проект, имея в штате данный персонал, сколько это займёт времени и средств.

Use cases:

  • Пользователь выбирает формат входных файлов: json, xml, txt.
  • Пользователь загружает исходные данные о имеющихся рабочих, проекте, дополнительных расходах.
  • Пользователь выбирает формат выходного файла: json, xml, txt.
  • Пользователь может произвести сортировку рабочих различными способами.
  • Анализ выполнимости данного проекта.
  • Расчёт стоимости и длительности проекта.

Диаграмма классов:

ООП модель "Расчёт стоимости и длительности проекта"

Код

Юнит-Тесты

Океан

Краткое описание: ООП модель имитирует процесс жизни и эволюции рыб в океане.

Use cases:

  • В океан добавляется рыба
  • Океан меняет свою температуру
  • Океан меняет уровень содержания соли
  • Рыба изменят диапазон допустимых температур, если отношение расстояния от температуры воды до диапазона температур рыбы к ширине диапазона <= 1/3 И расстояние до диапазона <= 5
  • Рыба изменяет допустимый уровень соли, если он отстоит от уровня соли океана не более чем на 2 пункта
  • Рыба умирает от старости
  • Рыба умирает, если не может эволюционировать

Диаграмма классов:

ООП модель "Океан"

Код

Юнит-Тесты