Дано множество городов и дорог, соединяющих эти города. Каждая дорога соединяет два города. Спроектировать и реализовать сервис RoadMap, удовлетворяющий следующим требованиям.
- Город:
- Уникальное имя.
- Координаты (x, y).
- Дорога:
- Уникальное имя.
- Длина.
- API:
- Добавление нового города.
- Добавление новой дороги.
- Удаление дороги.
- Получение города по имени.
- Получение списка дорог по имени города.
- Основные технические требования:
- Организовать хранение в памяти.
- Данные сервиса всегда должны находиться в консистентном состоянии.
- Нельзя использовать сторонние библиотеки (только JRE).
- Имплементация сервиса должна быть потокобезопасной (данное требование является дополнительным. Реализуйте его только в том случае, если у вас осталось время, и вы уверены в бизнес-логике своего решения).
- Разбил предметную область на модели, разделил приложение на слои (
controller
,service
,model
,storage
). - Сделал обработку исключений выводом в консоль.
- Расчет расстояния и вывод дорог города сделал в
RoadTo
, т.к. та было проще и быстрее всего сделать. - Выбрал один из самых простых способов синхронизации – навесил на все чувствительные и публичные методы контроллера. Это сработает, т.к. у нас есть только одна точка внешнего взаимодействия с системой – контроллер.
- Улучшить сообщения в исключениях (сейчас они более общие, вида "object not found"). Как минимум можно
конкретизировать. А можно сделать конкретные исключения, напр.:
ObjectNotFoundStorageException
. - Реализовать тесты слоёв приложения (можно самое простое, без JUnit, т.к. см. требования).
- Можно объединить методы
executeOrSout
иreturnOrSout
, чтобы не дублировать обработку исключений. - Улучшить вывод результатов операций в консоль (сейчас в
toString
стандартный вывод полей объекта). - Можно улучшить синхронизацию, т.к. она на данный момент не оптимальна.