Ho scritto una libreria di comunicazione per un protocollo di dispositivo industriale. Il frame di risposta contiene un array di byte come dati di payload. I dati del payload sono costituiti da diversi "oggetti" di tipi diversi, come interi, float e altri dati più complessi come date o codifiche di stringhe diverse.Per rendere questo più divertente, i dati potrebbero anche essere in ordine di byte diverso.
La mia soluzione attuale è di avere un oggetto dati generico, che contiene le informazioni generali come posizione nell'array di byte e nell'ordine dei byte, e vari oggetti ereditati per gestire i diversi tipi di dati:
public abstract class DataObject{
private readonly int _position;
public int Position {
get { return _position; }
}
private readonly ByteOrder _byteOrder;
public abstract object Data { get;}
/* snip */
}
public class FloatObject : DataObject {
public abstract object Data {
get{
float floatValue;
/* handle byte to float conversion */
return floatValue;
}
}
}
public class StringObject : DataObject {
public abstract object Data {
get{
string stringValue;
/* handle byte to string conversion */
return stringValue;
}
}
}
Ciò che non mi piace di questo è la gestione della proprietà dei dati. La classe base lo dichiara come un oggetto, quindi ogni volta che ho bisogno di trasmettere il risultato al tipo corrispondente. Se non dichiaro una proprietà Data nella classe base, ma in tutte le classi derivate, ho bisogno di eseguire il cast dell'oggetto dati sull'oggetto dati specifico, che è solo uno spostamento del problema. C'è qualche disegno migliore che potrei usare per risolvere questo problema?