Sto lavorando a un'app che parla con un dispositivo bluetooth a basso consumo energetico (BLE) e scambia dati personalizzati con esso. Il nostro team ha definito i modelli di dati e c'è un metodo che analizzerà il carico utile dei dati e assegnerà i valori alle caratteristiche corrispondenti. Funziona perfettamente finché non abbiamo introdotto un nuovo firmware.
In questo nuovo firmware alcuni valori nel payload dei dati sono stati ridefiniti o l'offset di un valore specifico è stato modificato. Quindi il metodo di analisi dovrà essere aggiornato / riscritto in base alla nuova definizione del payload. Poi arriva il problema: entrambe le versioni del firmware devono essere supportate! Naturalmente potrei scrivere un sacco di if / else nel metodo di analisi in questo momento, ma cosa accadrebbe se altri 3 aggiornamenti del firmware arrivassero uno dopo l'altro? Posso immaginare che il codice diventerà difficile da leggere e perdere la sua semplicità.
Mi chiedo se esiste un modo elegante per gestire la coesistenza delle versioni del firmware. Forse uno schema di progettazione che può essere adottato qui?
Per renderlo più specifico:
Nella mia classe modello Temperature
ho le seguenti proprietà:
@property (nonatomic, readonly) float temp_outside;
@property (nonatomic, readonly) float temp_inside;
La libreria deve supportare 3 diverse versioni del firmware:
-
V1 supporta solo
temp_outside
-
V2 supporta
temp_outside
etemp_inside
-
V3 supporta
temp_outside
etemp_inside
, matemp_inside
deve essere ottenuto in modo diverso rispetto a V1 & V2
Supponendo che il firmware fornisca le proprie informazioni entro manufacturer data
delle inserzioni come dati non elaborati:
-
Firmware V1: 00 42 0a
- (byte 1: sw id, byte 2: id del protocollo, byte 3: temp_outside)
-
Firmware V2: 00 43 0a 10
- (byte 1: id id, byte 2: id protocollo, byte 3: temp_outside, byte 4: temp_inside)
-
firmware V3: 00 44 10 0a
- (byte 1: sw id, byte 2: id del protocollo, byte 3: temp_inside, byte 4: temp_outside)
Qual è il modo migliore per implementarlo? Ci sono diversi aspetti da considerare:
-
Il modello ha valori che potrebbero non essere riempiti da un firmware specifico; dovrei avere modelli separati per firmware o come posso assicurarmi che solo le proprietà supportate saranno accessibili?
-
Il metodo responsabile per analizzare i byte nel modello deve supportare tutti i firmware. Dovrebbe esserci un metodo / parser con diverse condizioni basate sull'ID del protocollo o su più classi di parser?
-
L'uso della libreria all'interno dei controller di visualizzazione dovrebbe essere il più comodo possibile.