Creazione di un'API con un oggetto di connessione centrale su un dispositivo esterno

0

Voglio costruire un'API (Java) che si basa in gran parte su un oggetto di connessione su un server di dati che gestisce una connessione a un dispositivo reale. Tutto quello che ho è un oggetto DeviceConnection . Attualmente ho una grande classe che presenta all'utente tutto ciò che il dispositivo può fare e gestire l'oggetto di connessione all'interno di quella classe.

Funziona abbastanza bene quando si lavora con l'API così com'è, ma diventa molto complesso e difficile da usare quando si prova a metterlo alla prova. Inoltre viola il Principio di Responsabilità Unica.

Come strutturate un'API, in cui quasi tutte le chiamate dipendono da un singolo oggetto di connessione? Per quanto riguarda le chiamate che configurano semplicemente il dispositivo e le chiamate che restituiscono alcune informazioni specifiche del dispositivo piuttosto poco interessanti?

Questo è quello che vorrei pensare:

DeviceConnection conn = new DeviceConnection();
conn.connect(connectionData);

// This one is kinda ok
DeviceDataReceiver dataRec = new DeviceDataReceiver(conn);
Data data = dataRec.getData();

// This one feels like i don't really need the object
DeviceInformation devInfo = new DeviceInformation(conn);
Information info = devInfo.getInfo();

// This one feels really awkward to use
DeviceSettingsManager settingsManager = new DeviceSettingsManager(conn);
settingsManager.setOptionA(true);

Come architetti questo tipo di API? Come dovrei nominare le mie classi? Come devo passare il mio oggetto di connessione?

Non è che i miei approcci non funzionino, è solo che al momento non sembra una buona API.

    
posta Luca Fülbier 30.05.2016 - 23:53
fonte

1 risposta

1

In genere ci sono alcuni miglioramenti che puoi fare a questa API, per renderla migliore,

  1. Utilizza le interfacce
  2. Utilizza DI

Quindi sembrerebbe,

    public interface IDeviceConnectionProvider{
        DeviceConnection GetConnection();
        CloseConnection(DeviceConnection conn);
    }

    public class DeviceConnectionProvider : IDeviceConnectionProvider {
        public DeviceConnection GetConnection(){
           DeviceConnection conn = new DeviceConnection();
           conn.connect(connectionData);
           return conn;
        }

        public void CloseConnection(DeviceConnection conn)
        {
            //close it
        }
}

Questa classe creerà la connessione al dispositivo e la chiuderà. A seconda del tuo requisito e dell'intensità delle risorse nell'apertura di una connessione, potresti voler collegare le connessioni qui, ma è fuori dallo scopo di questa discussione.

public interface IDeviceDataReceiver{
     public Data GetData();
}

public class DeviceDataReceiver : IDeviceDataReceiver {
     private IDeviceConnectionProvider connectionProvider;

     public DeviceDataReceiver( IDeviceConnectionProvider provider){
         this.connectionProvider = provider;
     } 

     public Data GetData(){
         DeviceConnection conn = this.connectionProvider.GetConnection();
         Data data = //get data from connection;
         this.connectionProvider.CloseConnection(conn);
         return data;
     }
}

Ora devi registrare le interfacce e la loro implementazione nel contenitore DI.

Se vuoi utilizzarlo da qualche parte, inserisci semplicemente la tua API,

public class SomeClass : ISomeInterface
{
    private IDeviceDataReceiver receiver;

    public SomeClass(IDeviceDataReceiver receiver){
        this.receiver = receiver;
    } 

    public void DoSomethingWithDeviceData(){
        Data data = this.receiver.GetData();
        //do stuff
    }
}
    
risposta data 31.05.2016 - 02:41
fonte

Leggi altre domande sui tag