Architettura

Confini dei moduli, regole di dipendenza e struttura a layer del codebase di BodyMetrics.

Panoramica

BodyMetrics separa le responsabilità in sei layer: coordinamento UI, rendering, facade di dominio, flussi applicativi, regole di business e localizzazione. Ogni layer ha regole di dipendenza rigide per evitare accoppiamenti e rendere il codebase facilmente evolvibile in modo indipendente.

Struttura a Layer

Layer 1 — UI e Navigazione

FileResponsabilità
source/BodyMetricsView.mcCoordinatore modalità — gestisce le transizioni di modo, lo stato di selezione, lo stato transiente degli editor, i badge e il dispatch ai renderer
source/BodyMetricsInputDelegate.mcTraduce l’input hardware e touch in transizioni di stato
source/BodyMetricsMenuView.mcGestisce menu personalizzati, sotto-menu e delegati di navigazione

La view non legge direttamente dallo storage. Tutti gli accessi ai dati passano attraverso la facade di Domain.

Layer 2 — Rendering

FileResponsabilità
source/renderers/BodyMetricsSummaryDetailRenderer.mcDisegna le schermate Riepilogo e Dettaglio
source/renderers/BodyMetricsWizardRenderer.mcDisegna le schermate della procedura guidata (Profilo/Misurazioni/Obiettivi)
source/renderers/BodyMetricsInfoTargetDeltaRenderer.mcDisegna le schermate Info e Delta Obiettivo
source/renderers/BodyMetricsTrendRenderer.mcDisegna il grafico storico trend
source/renderers/RendererCommon.mcUtilities di disegno condivise (wrap testo, fit, disegno centrato, geometria)
source/BodyMetricsQrcodeView.mcVista QR code a schermo intero

I renderer ricevono un dizionario modello pronto per il rendering e non devono leggere dallo storage né modificare lo stato applicativo.

Layer 3 — Facade di Dominio

source/BodyMetricsDomain.mc è la superficie di compatibilità consumata dalla view. Coordina use case, policy, locale e cache trend senza duplicare la logica di presentazione.

Layer 4 — Flussi Applicativi (Use Case)

FileResponsabilità
source/usecases/BodyMetricsMeasurementsUseCase.mcGestisce le misurazioni, i campi editabili e i valori derivati
source/usecases/BodyMetricsProfileUseCase.mcGestisce il profilo utente e l’integrazione con i dati Garmin
source/usecases/BodyMetricsTargetsUseCase.mcGestisce gli obiettivi utente e il fallback degli obiettivi
source/usecases/BodyMetricsTrendUseCase.mcGestisce lo storico e i flussi trend
source/usecases/BodyMetricsResetUserDataUseCase.mcGestisce il reset completo e le invalidazioni correlate

Gli use case possono dipendere da storage, servizi e policy — ma non devono importare classi di view o helper di rendering.

Layer 5 — Regole di Business e Servizi

FileResponsabilità
source/policies/BodyMetricsClassificationPolicy.mcClassifica le metriche in zone colore
source/policies/BodyMetricsThresholdFactory.mcGenera le soglie per metrica e profilo
source/policies/BodyMetricsHealthCalculators.mcCalcoli puri di BMI, BMR e massa muscolare
source/BodyMetricsHistory.mcPersiste gli snapshot storici
source/BodyMetricsDataProvider.mcPersiste le misurazioni correnti
source/BodyMetricsTargets.mcPersiste gli obiettivi personalizzati
source/BodyMetricsGarminProfile.mcLegge il Garmin UserProfile (peso, ecc.)
source/trend/BodyMetricsTrendCacheService.mcCache di presentazione per le finestre trend

Le policy devono rimanere senza effetti collaterali.

Layer 6 — Localizzazione

FileResponsabilità
source/BodyMetricsLocale.mcAdapter di lookup runtime (unica interfaccia pubblica per la localizzazione)
source/i18n/BodyMetricsLocaleCatalog.mcCatalogo traduzioni multilingue (IT, EN, FR, ES)
source/i18n/BodyMetricsLocaleValidator.mcValidatore di completezza per lo sviluppo

Regole di Dipendenza

View  ──────────→  Domain  ──────→  UseCase  ──→  Storage / Servizi
  │                   │                             │
  └──→  Renderer       └──────────────────→  Policy
            └──→  RendererCommon
  • La View può chiamare Domain e Renderer; non deve accedere direttamente allo storage.
  • I Renderer dipendono solo da RendererCommon e dal modello di rendering.
  • Gli UseCase dipendono da storage, servizi e policy; mai da view o renderer.
  • Le Policy sono funzioni pure — nessun effetto collaterale, nessun I/O.
  • I lookup Locale passano sempre attraverso BodyMetricsLocale; l’accesso grezzo al catalogo è riservato al validatore.

Vincoli per le Funzioni Globali

Due funzioni globali sono le implementazioni autoritative uniche nell’intero codebase:

FunzioneFileScopo
round1Global()BodyMetricsDomain.mcArrotondamento a una decimale
fmt1Global()BodyMetricsDomain.mcFormattazione stringa a una decimale

Nessun file può definire equivalenti locali. Analogamente, le utility di rendering in RendererCommon.mc sono le uniche implementazioni autoritative di wrapping del testo, misurazione delle larghezze e disegno centrato.

Varianti di Build

VarianteTargetLocaleStato
Fullfr265IT, EN, FR, ES✅ Stabile (v15)
LiteFR55, FR735XTSolo EN🔲 Pianificata

Comando di Validazione

monkeyc -f monkey.jungle -d fr265 \
  -o /tmp/BodyMetrics-validation.prg \
  -y /percorso/bodymetrics-dev-key.pk8.der

Vedi Anche