API pubblica:
getClients / getClientById - returns a json object like:
{ clientid: 1, name: "Client1" }
getProjects / getProjectById - returns a json object like
{ projectid: 5, name: "MyProject", clientid: 1}
Domanda : come progettare una libreria e un insieme di oggetti per interagire con questa API in modo specifico con il problema di come il progetto contiene l'ID cliente. Quello su cui continuo a scontrarmi è che l'oggetto del progetto contiene un clientid, quindi creo il mio oggetto di progetto con solo un ID o anche un oggetto client i.e
class Project
{
int projectId ...
string name ....
int clientId....
Client client // Not sure about this pattern as it wont always be initialized?
}
Come un paio di soluzioni / idee potresti:
- Forza il progetto a prendere un oggetto Client nel costruttore, ma ora imponi un hit all'API prima di creare un progetto.
- Non hai il membro del cliente in Project ma ora usi la libreria ma questo rende più difficile l'uso del sistema di oggetti?
- Chiedere all'oggetto del progetto di prelevare il client dall'API in base alle esigenze
Preoccupazioni
- Ogni volta che ti trovi in un oggetto del progetto devi fare un viaggio all'API pubblica per ottenere il nome del cliente.
- Quando ti trovi in un oggetto del progetto, il riferimento del client potrebbe essere nullo (se lo includi).
- Se il progetto sa come ottenere un client tramite l'API, ora il nostro codice sta diventando un pasticcio confuso.
Come gestisco fino ad ora
Mantenere il client e gli oggetti del progetto il più vicino possibile alle definizioni dell'API e nella classe API wrapper compilata in alcuni caching, quindi non sono così preoccupato di chiamarlo per ottenere il client ogni volta che ne ho bisogno. Il codice non è ancora ottimo perché finisce con l'aspetto di:
var project = apiWrapper.getProject(5)
out("This project belongs to client " + apiWrapper.getClient(project.clientId)
// note this call to getClient has cahcing in my implemtation