Mi è stato chiesto di creare una classe che si connetterà a un servizio remoto via soap. La classe ha solo un metodo pubblico send(recordName)
.
La classe si è conclusa in questo modo:
private recordName;
private recordId;
public send(recordName)
{
this.recordName = recordName;
this.validateRecordName();
this.retrieveRecordId();
if (this.recordExists()) {
this.updateRecordOnRemoteServer();
} else {
this.addRecordOnRemoteServer();
}
}
private validateRecordName()
{
// throws exception if this.recordName does not meet certain criteria
}
private retrieveRecordId()
{
response = // creates a soapClient, sends the recordName, and returns a response
this.recordId = response->id ? response->id : null;
}
private recordExists()
{
return this.recordId !== null;
}
private updateRecordOnRemoteServer()
{
someSoapClient->update('url', this.recordId); // notice the this.recordId reference
}
// omitting add method for brevity.
Ma il mio capo (che ha 10 anni di esperienza in più di me) mi ha detto che dovrei passare il recordId come parm al metodo di aggiornamento, perché altrimenti la classe soffre di un problema di Orders Matter
e il metodo di aggiornamento è fragile, dal momento che richiede dati che vengono impostati all'esterno (retrieveRecordId ()) e che deve essere richiamato da un altro metodo (in questo caso send ()).
Quindi le modifiche sono davvero lievi:
public send(recordName)
{
// unchanged
this.recordName = recordName;
this.validateRecordName();
// changed. Notice recordId is now a method var, not a class member.
recordId = this.retrieveRecordId() // returns the id or null
recordExists = recordId !== null;
if (recordExists) {
// notice the param is being passed
this.updateRecordOnRemoteServer(recordId);
} else {
// add new record
}
}
Ho letto Clean Code di Robert C. Martin, e la maggior parte dei suoi esempi è finita in modo simile a quello che ho proposto in origine. Inizializzerà le variabili del memeber di classe nel metodo pubblico invocando metodi privati e quegli attributi saranno usati da altri metodi privati; tutto a cascata.
Quando ho letto per la prima volta il libro non ero convinto che fosse "così pulito", perché pensavo anche che la classe dipendesse pesantemente dall'ordine di invocazione dei metodi privati; ma ho iniziato a usare quel modello nei miei progetti e ho scoperto che mi stava aiutando molto a mantenere il mio codice più breve ei miei metodi pubblici leggibili.
Ho anche imparato dal libro per evitare di passare i param ai metodi privati (a meno che non ci sia un altro modo come il sum (a, b), il sub (a, b) il tipo di funzioni). Il 95% delle volte non definisce gli argomenti per i metodi privati.
Mi piacerebbe davvero sapere se esiste un approccio migliore. Grazie!