Devo rappresentare gli accessori fisici di un sistema come classi nel software?

2

Sto riprogettando un sistema composto da un'unità di acquisizione dati e molti altri sensori (sensore di tensione, sensore angolare, sensore di pressione, ecc.).

Nel modello del dominio del software, esiste una classe Sensor di base, da cui deriva ogni sensore concreto.

public abstract class Sensor
{
    public virtual String Name { get; }
    public virtual UnitOfMeasurement Unit { get; }
    public virtual int SamplingRate { get; }
    public virtual CalibrationModel Calibration { get; }
}

Ognuna di queste sottoclassi rappresenta un sensore fisico venduto dalla nostra azienda e ha un valore "hardcoded" per ogni proprietà. Ad esempio VoltageSensor ha "Voltage" come Name, "UnitOfMeasurement.Volt" come Unit, "1000" come SamplingRate, ecc.

Il problema corrente che sto cercando di risolvere è questo:

Ogni volta che un nuovo hardware del sensore reale viene sviluppato e aggiunto al nostro portafoglio, dobbiamo eseguire il seguente "intervento chirurgico per fucili a pompa":

  1. Crea una nuova sottoclasse Sensor ;
  2. Esegui alcune modifiche sparse e secondarie sul resto del sistema (a causa di depenzioni, ecc.);
  3. Rilasciare un aggiornamento alla nostra base clienti.

Come ho capito, ogni sensore fisico (l'hardware) è un'unità concettuale, e come tale dovrebbe essere in grado di essere "collegato" a un sistema in esecuzione in modo che non debba essere ricompilato e ridistribuito. Poiché questo non è ciò che sta accadendo, mi chiedo come potrei ottenere questa "pluggability" e mantenere il comportamento polimorfico che sta funzionando bene finora (eccetto per ogni volta che dobbiamo cambiare il portfolio).

Esiste un progetto alternativo di "Configurazione sul polimorfismo" che potrei prendere?

    
posta heltonbiker 06.04.2015 - 23:31
fonte

1 risposta

10

Quando ci sono molte sottoclassi di una classe che non differiscono affatto nel loro comportamento (implementazioni del metodo) e differiscono solo nei loro valori, è spesso una buona idea rappresentarle tutte con una classe e leggere i valori precedentemente codificati da un file di configurazione, una tabella di database o un'altra origine dati.

Per aggiungere un nuovo tipo di sensore, dovrai semplicemente aggiungere una linea alla configurazione. La ricompilazione diventa inutile e quando la configurazione è in un formato leggibile dall'uomo, potrebbe anche essere eseguita da qualcuno senza conoscenze di programmazione.

Quando lo fai in modo intelligente, puoi perfino rendere possibile rileggere la configurazione mentre il programma è in esecuzione, quindi un aggiornamento non richiede nemmeno il riavvio del programma.

    
risposta data 07.04.2015 - 00:42
fonte