241-327_Deev_ASD/lab-3/iquiz_adapter.h

64 lines
4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* iquiz_adapter.h — Целевой интерфейс (Target) паттерна «Адаптер»
*
* ╔══════════════════════════════════════════════════════════════════╗
* ║ ПАТТЕРН «АДАПТЕР» (Adapter / Wrapper) ║
* ╠══════════════════════════════════════════════════════════════════╣
* ║ Задача: клиентский код (ApiClient) хочет работать с Quiz- ║
* ║ объектами, но получает от сети «чужой» формат — QJsonObject. ║
* ║ ║
* ║ Участники: ║
* ║ • Target (цель) — IQuizAdapter ← этот файл ║
* ║ • Adaptee (адаптируемый) — QJsonObject / QJsonArray (Qt) ║
* ║ • Adapter (адаптер) — QuizJsonAdapter ║
* ║ • Client (клиент) — ApiClient, использует IQuizAdapter ║
* ╚══════════════════════════════════════════════════════════════════╝
*
* IQuizAdapter задаёт контракт: «дай мне QJson-данные —
* я верну тебе Quiz или QList<Quiz>».
* ApiClient знает только об этом интерфейсе и не зависит
* от конкретного способа парсинга. Если завтра формат сервера
* изменится (XML, Protobuf), достаточно написать новый класс,
* реализующий IQuizAdapter, — ApiClient трогать не придётся.
*/
#pragma once
#include <QJsonObject> // { "key": value, ... } — один JSON-объект
#include <QJsonArray> // [ {...}, {...} ] — массив JSON-объектов
#include <QList> // динамический массив Qt
#include "quiz.h" // целевой тип данных нашего приложения
class IQuizAdapter
{
public:
/*
* Виртуальный деструктор обязателен для любого полиморфного
* базового класса: без него при delete через указатель на базу
* деструктор производного класса не будет вызван (UB).
*/
virtual ~IQuizAdapter() = default;
/*
* Преобразует один JSON-объект в C++-объект Quiz.
* Вызывается, когда сервер вернул одну запись
* (GET /api/quiz/:id/ → { "id":1, "title":"...", ... }).
*
* Метод объявлен const: адаптер не хранит состояния —
* один и тот же экземпляр можно использовать многократно.
*
* Метод чисто виртуальный (= 0): IQuizAdapter нельзя
* создать напрямую; обязательна конкретная реализация.
*/
virtual Quiz toQuiz(const QJsonObject &json) const = 0;
/*
* Преобразует JSON-массив в список Quiz.
* Вызывается, когда сервер вернул коллекцию записей
* (GET /api/quiz/ → [ {...}, {...}, ... ]).
*
* Внутри реализации каждый элемент массива
* делегируется в toQuiz().
*/
virtual QList<Quiz> toQuizList(const QJsonArray &json) const = 0;
};