Разбор задачи из реального собеса. Предложить правила для улучшения структуры JSON
Такие разборы задач отлично помогают потренироваться в подходах к решению рабочих задач + увеличить насмотренность.
Условия задачи
Предусловие
Медицинская компания оказывает услуги по лечению пациентов. У пациентов есть личный кабинет, где они могут посмотреть:
историю своих заказов,
их наполнение,
стоимость,
скачать результаты исследований.
Для того, чтобы это сделать, был реализован ответ от сервера в котором эта информация возвращается в виде JSON файла, но заказчика не удовлетворяет результат.
Что нужно сделать?
Необходимо изучить структуру JSON документа и предложить правки для улучшения структуры.
Значения, которые обязательно должны быть в документе
Общие сведения о заказе:
Уникальный идентификатор заказа,
Дата создания заказа,
Статус заказа (например, "завершён", "в процессе", "ожидает оплаты"),
Общая стоимость заказа.
Информация о пациенте:
Уникальный идентификатор пациента,
Имя и фамилия пациента.
Список оказанных услуг в заказе:
Для каждой услуги
Уникальный идентификатор услуги,
Название услуги (например, "Общий анализ крови", "МРТ"),
Статус выполнения (например, "завершено", "ожидает результатов", "отменено"),
Дата оказания услуги,
Цена за услугу,
Ссылка на PDF-отчет, если доступен.
{
"fullName": "Иван Иванов",
"order": [
{
"orderId": "ORD-2024-00123",
"OrderDate": "2024-10-26",
"orderStatus": ["completed"],
"totalCost": 150.00,
"service":
{
"serviceId": "SERV-1001",
"serviceName": "Общий анализ крови",
"serviceStatus": "completed",
"service_date": "2024-10-20",
"servicePrice": 50.00,
"reportUrl": "https://medical-center.com/reports/ORD-2024-00123_SERVICE-1001.pdf"
},
"donloadOptions": {
"fullOrderReport": "https://medical-center.com/reports/ORD-2024-00123_full.pdf"
}
},
{
"orderId": "ORD-2024-00124",
"OrderDate": "2024-10-15",
"orderStatus": ["in progress"],
"totalCost": 80.00,
"service":
{
"serviceId": "SERV-1003",
"serviceName": "Рентген грудной клетки",
"serviceStatus": "pending",
"service_date": "2024-10-10",
"servicePrice": 80.00,
"reportUrl": "https://medical-center.com/reports/ORD-2024-00124_SERVICE-1003.pdf"
}
,
"donloadOptions": {
"fullOrderReport": "https://medical-center.com/reports/ORD-2024-00124_full.pdf"
}
}
]
}
Начнем с явных и критических ошибок
1. Добавил бы идентификатор пользователя, так как могут быть однофамильцы. Да и в целом, по текстовому полю работать сложнее
{
"userId": "PAT-45678",
"name": "Иван",
"middleName": "",
"lasname": "Иванов",
2. Разделил бы ФИО на отдельные части
{
"userId": "PAT-45678",
"name": "Иван"
"middleName": "",
"lasname": "Иванов",
3. Статус заказа исправить с массива на просто текст, так как в одно время статус не может иметь 2 значения и вообще, я бы сделал его ENUM
"orders": [
{
"id": "ORD-2024-00123",
"date": "2024-10-26",
"status": "IN_PROGRESS",
"totalCost": 140.00,
"currency": "RUB",
"services": [
4. Параметр services
Написал бы во множественном числе, сделал массивом, так как у нас в одном заказе может быть больше одной услуги
"services": [
{
"id": "SERV-1001" ,
"name": "Общий анализ крови",
"status": "COMPLETED",
"date": "2024-10-20",
"qty": 1,
"price": 50.00,
"discountSum": 10.00,
"currency": "RUB",
"reportUrl": "https://medical-center.com/reports/ORD-2024-00123_SERVICE-1001. pdf"
},
{
"id": "SERV-1002",
"name": "МРТ головного мозга",
"status": "PENDING",
"date": "2024-10-22",
"qty": 1,
"price": 100.00,
"discountSum": null,
"reportUrl": null
},
Переходим к неявным ошибкам
5. Обращаем внимание на стиль написания параметров. Все ли написано в общем стиле: cammelCase, snake_case. В задании затесался параметр service_date и OrderDate
6. Смотрим на орфографические ошибки, как параметр назовешь, так он в код и заплывет :) здесь у нас ошибка в слове downloadOption - не хватает буквы
"servicePrice": 50.00,
"reportUrl": "https://medical-center.com/reports/ORD-2024-00123_SERVICE-1001. pdf"
},
"donloadOptions": {
"fullOrderReport": "https://medical-center.com/reports/ORD-2024- 00123_full.pdf"
}
},
{
"orderId": "ORD-2024-00124",
"OrderDate": "2024-10-15",
"orderStatus": ["in progress"],
"totalCost": 80.00,
"service":
{
"serviceId": "SERV-1003",
"serviceName": "Рентген грудной клетки",
"serviceStatus": "pending",
"service_date": "2024-10-10",
"servicePrice": 80.00,
"reportUrl": "https://medical-center.com/reports/ORD-2024-00124_SERVICE-1003. pdf"
}
,
"donloadOptions": {
"fullrderReport": "https://medical-center.com/reports/ORD-2024-00124 full.pdf"
7. Можно убрать лишние слова в заказе и услуге
"orders": [
{
"id": "ORD-2024-00123",
"date": "2024-10-26",
"status": "IN_PROGRESS",
"totalCost": 140.00,
"currency": "RUB",
"services": [
{
"id": "SERV-1001",
"name": "Общий анализ крови",
"status": "COMPLETED",
"date": "2024-10-20",
"qty": 1,
"price": 50.00,
"discountSum": 10.00,
"currency": "RUB",
"reportUrl": "https://medical-center. com/reports/ORD-2024-00123_SERVICE-1001. pdf"
},
8. Я бы добавил еще дополнительных параметров в заказ и услугу:
Например,
currency - валюта,
discountSum - сумма скидки,
qty - количество заказанных одинаковых услуг.
но это уже вещи, которые стоит добавлять только после сбора требований в реальной жизни.
Итоговый вариант выглядит так:
{
"userId": "PAT-45678",
"name": "Иван",
"middleName": "",
"lasname": "Иванов",
"orders": [
{
"id": "ORD-2024-00123",
"date": "2024-10-26",
"status": "IN_PROGRESS",
"totalCost": 140.00,
"currency": "RUB",
"services": ["..."],
"downloadOption": {
"fullOrderReport": "https://medical-center.com/reportsORD-2024-00123_full.pdf"
}
},
{
"id": "ORD-2024-00124",
"date": "2024-10-15",
"status": "COMPLETED",
"totalCost": 80.00,
"services": [
{
"id": "SERV-1003",
"name": "Рентген грудной клетки",
"status": "COMPLETED",
"date": "2024-10-10",
"qty" : 1,
"price": 80.00,
"discountSum": null,
"reportUrl": null
}
],
"downloadOption": {
"fullOrderReport": "https://medical-center. com/reports/ORD-2024-00124_fult. pdf"
}
}
]
}