Browse Source

SVI Рефакторинг физической структуры, документация

SVI 8 months ago
parent
commit
2acf352177
10 changed files with 145 additions and 59 deletions
  1. 5 58
      README.md
  2. 21 0
      cmd/adt_service/main.go
  3. 9 0
      docs/change.md
  4. 62 0
      docs/tz.md
  5. 1 1
      go.mod
  6. 13 0
      intertnal/fabrics/fabrics.go
  7. 7 0
      intertnal/serv_http/serv_http.go
  8. 19 0
      intertnal/service/service.go
  9. 0 0
      old/main.go
  10. 8 0
      pkg/types/iservice.go

+ 5 - 58
README.md

@@ -1,62 +1,9 @@
 # Application design
 
-В коде представлен прототип сервиса бронирования номеров в отелях,
-в котором реализована возможность забронировать свободный номер в отеле.
+Тестовое задание на гибкую архитектуру и рефакторинг
 
-Сервис будет развиваться, например:
+## Оглавление
 
-- появится отправка письма-подтверждения о бронировании
-- появятся скидки, промокоды, программы лояльности
-- появится возможность бронирования нескольких номеров
-
-## Задание
-
-Провести рефакторинг структуры и кода приложения, исправить существующие
-проблемы в логике. Персистентное хранение реализовывать не требуется,
-все данные храним в памяти сервиса.
-
-В результате выполнения задания ожидается структурированный код сервиса,
-с корректно работающей логикой сценариев бронирования номеров в отелях.
-
-Чеклист:
-
-- код реорганизован и выделены слои
-- выделены абстракций и интерфейсы
-- техническе и логические ошибки исправлены
-
-Ограничения:
-
-- ожидаем реализацию, которая управляет состоянием в памяти приложения,
- но которую легко заменить на внешнее хранилище
-- если у тебя есть опыт с Go: для решения надо использовать только
- стандартную библиотеку Go + роутер (например chi)
-- если у тебя нет опыта с Go: можно реализовать решение на своем
- любимом стеке технологий
-
-## Что будет на встрече
-
-На встрече ожидаем что ты продемонстрируешь экран и презентуешь свое решение:
-расскажешь какими проблемами обладает исходный код и как они решены в твоем варианте.
-Мы будем задавать вопросы о том почему было решено разделить ответственность между
-компонентами тем или иным образом, какими принципами ты при этом руководствуешься.
-Спросим что будет если продакт решит добавить какую-то новую фичу — как она ляжет
-на предложенную тобой структуру. Также можем поговорить и о более технических вещах:
-о значениях и указателях, многопоточности, интерфейсах, каналах.
-
-## Например
-
-```sh
-go run main.go
-```
-
-```sh
-curl --location --request POST 'localhost:8080/orders' \
---header 'Content-Type: application/json' \
---data-raw '{
-    "hotel_id": "reddison",
-    "room_id": "lux",
-    "email": "guest@mail.ru",
-    "from": "2024-01-02T00:00:00Z",
-    "to": "2024-01-04T00:00:00Z"
-}'
-```
+- [техническое задание](./docs/tz.md);
+- [описание архитектуры](./docs/arch.md);
+- [описание исправлений](./docs/change.md).

+ 21 - 0
cmd/adt_service/main.go

@@ -0,0 +1,21 @@
+// package main -- пускач для сервиса
+package main
+
+import (
+	"log"
+	"os"
+
+	"adt/intertnal/fabrics"
+)
+
+func main() {
+	serv, err := fabrics.MakeService()
+	if err != nil {
+		log.Printf("main(): in create IService, err=\n\t%v\n", err)
+		os.Exit(1)
+	}
+	if err := serv.Run(); err != nil {
+		log.Printf("main(): in IService.Run, err=\n\t%v\n", err)
+		os.Exit(2)
+	}
+}

+ 9 - 0
docs/change.md

@@ -0,0 +1,9 @@
+# Изменения
+
+Ниже изложены измения по проекту
+
+* создание рекомендованной физической структуры проекты;
+* проставление комментариев отвечающих на вопрос "зачем" в коде;
+* выделение крупных частей в отдельные пакеты;
+* вынесение грязных фабрик в отдельные пакеты.
+* в файле `main.go` исправление структуры `if`, добавление кодов выхода;

+ 62 - 0
docs/tz.md

@@ -0,0 +1,62 @@
+# Application design
+
+В коде представлен прототип сервиса бронирования номеров в отелях,
+в котором реализована возможность забронировать свободный номер в отеле.
+
+Сервис будет развиваться, например:
+
+- появится отправка письма-подтверждения о бронировании
+- появятся скидки, промокоды, программы лояльности
+- появится возможность бронирования нескольких номеров
+
+## Задание
+
+Провести рефакторинг структуры и кода приложения, исправить существующие
+проблемы в логике. Персистентное хранение реализовывать не требуется,
+все данные храним в памяти сервиса.
+
+В результате выполнения задания ожидается структурированный код сервиса,
+с корректно работающей логикой сценариев бронирования номеров в отелях.
+
+Чеклист:
+
+- код реорганизован и выделены слои
+- выделены абстракций и интерфейсы
+- техническе и логические ошибки исправлены
+
+Ограничения:
+
+- ожидаем реализацию, которая управляет состоянием в памяти приложения,
+ но которую легко заменить на внешнее хранилище
+- если у тебя есть опыт с Go: для решения надо использовать только
+ стандартную библиотеку Go + роутер (например chi)
+- если у тебя нет опыта с Go: можно реализовать решение на своем
+ любимом стеке технологий
+
+## Что будет на встрече
+
+На встрече ожидаем что ты продемонстрируешь экран и презентуешь свое решение:
+расскажешь какими проблемами обладает исходный код и как они решены в твоем варианте.
+Мы будем задавать вопросы о том почему было решено разделить ответственность между
+компонентами тем или иным образом, какими принципами ты при этом руководствуешься.
+Спросим что будет если продакт решит добавить какую-то новую фичу — как она ляжет
+на предложенную тобой структуру. Также можем поговорить и о более технических вещах:
+о значениях и указателях, многопоточности, интерфейсах, каналах.
+
+## Например
+
+```sh
+go run main.go
+```
+
+```sh
+curl --location --request POST 'localhost:8080/orders' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+    "hotel_id": "reddison",
+    "room_id": "lux",
+    "email": "guest@mail.ru",
+    "from": "2024-01-02T00:00:00Z",
+    "to": "2024-01-04T00:00:00Z"
+}'
+```

+ 1 - 1
go.mod

@@ -1,3 +1,3 @@
-module applicationDesignTest
+module adt
 
 go 1.21.6

+ 13 - 0
intertnal/fabrics/fabrics.go

@@ -0,0 +1,13 @@
+// package fabrics -- грязная фабрика объектов
+package fabrics
+
+import (
+	"adt/intertnal/service"
+	"adt/pkg/types"
+)
+
+// MakeService -- возвращает новый объект сервиса
+func MakeService() (types.IService, error) {
+	sf := service.NewService()
+	return sf, nil
+}

+ 7 - 0
intertnal/serv_http/serv_http.go

@@ -0,0 +1,7 @@
+// package serv_http -- веб-сервер сервиса (графика и АПИ)
+package serv_http
+
+// ServHttp -- веб-сервер сервиса (графика и АПИ)
+type ServHttp struct {
+}
+

+ 19 - 0
intertnal/service/service.go

@@ -0,0 +1,19 @@
+// package service -- главный тип сервиса
+package service
+
+
+// Service -- главный тип приложения
+type Service struct {
+	// ...
+}
+
+// NewService -- возвращает новый объект сервиса
+func NewService() *Service {
+	return &Service{}
+}
+
+// Run -- запускает сервис в работу
+func (s *Service) Run() error {
+	// ...
+	return nil
+}

+ 0 - 0
main.go → old/main.go


+ 8 - 0
pkg/types/iservice.go

@@ -0,0 +1,8 @@
+// package types -- интерфейсы сервиса
+package types
+
+// IService -- интерфейс к объекту сервиса
+type IService interface {
+	// Run -- запускает сервис в работу
+	Run() error
+}