A volte è facile scrivere tutta la logica in modello procedurale piuttosto che usare SOLID
non posso essere più d'accordo, è più facile per noi programmatore per gestire il codice nel modello procedurale. Questo rende OOP difficile da programmare per chi è abituato alla programmazione procedurale.
Tuttavia ho trovato più semplice scrivere prima l'interfaccia generale e il consumatore piuttosto che rompere l'interfaccia progettata per moduli più piccoli. Questo è, una specie di pratica Test First Development -> Red, green, refactor
. (si prega di notare che, se si vuole raggiungere il neat design
, considerare i seguenti TDD invece questa guida. Questa guida è solo una piccola sezione di fare TDD)
dire che vogliamo creare il ServiceAttendance
fare scanEmployeeID
. Ci sarà ha un'interfaccia simile (si prega di notare l'esempio è in C# di denominazione):
public interface IServiceAttendance{
bool ScanEmployeeId();
}
Si prega di notare che decido il metodo per restituire bool invece di vuoto per determinare il successo/fallimento dell'operazione. Si prega di notare l'esempio di consumo di seguito non implementare alcun DI perché voglio solo mostrare come consumarlo. Quindi nel consumatore, possiamo avere:
public void ConsumeServiceAttendance(){
IServiceAttendance attendance = Resolve<IServiceAttendance>();
if(attendance.ScanEmployeeId()){
// do something
}
}
Questo conclude il consumatore. Ora passiamo all'implementazione. Di 'che puoi svilupparlo usando la programmazione procedurale e ottenuto il blocco di codice monolitico. È possibile dichiarare l'implementazione con una dichiarazione simile a pseu.
public class ServiceAttendance : IServiceAttendance{
public bool ScanEmployeeId(){
bool isEmpValid = false;
// 1 scan the employee id
// 2 validate the login
// 3 if valid, create the login session
// 4 notify the user
return isEmpValid;
}
}
Ora abbiamo 4 passaggi da fare in questa unica operazione. Il mio principale è, non fare più di 3 processi di facciata in un metodo, quindi posso semplicemente refactoring il 3 e il 4 per un processo. Ora abbiamo
public class ServiceAttendance : IServiceAttendance{
public bool ScanEmployeeId(){
bool isEmpValid = false;
// 1 scan the employee id
// 2 validate the login
// 3 if valid, create the login session and notify the user
return isEmpValid;
}
}
Questo, abbiamo 3 operazione principale. Possiamo analizzare se abbiamo bisogno di creare un modulo più piccolo o meno abbattendo l'operazione. Diciamo che vogliamo interrompere la seconda operazione. Possiamo ottenere:
// 2 validate the login
// 2.1 check if employee id matches the format policy
// 2.2 check if employee id exists in repository
// 2.3 check if employee id valid to access the module
L'operazione di interruzione in sé è abbastanza ovvia da interrompere il secondo modulo in un altro modulo più piccolo. Per 2.2
e 2.3
, abbiamo bisogno di un modulo più piccolo da iniettare. Semplicemente perché avrà bisogno di dipendenza dal repository, quindi deve essere iniettato. Lo stesso caso si applica per la fase operativa 1 scan the employee id
, poiché richiede la dipendenza dallo scanner di impronte digitali, pertanto il gestore dello scanner deve essere implementato in un modulo separato.
possiamo sempre ripartizione l'operazione, come possiamo farlo in 2.1
:
// 2.1 check if employee id matches the format policy
// 2.1.1 employee id must match the length
// 2.1.2 employee id must has format emp#####
Ora sto incerto se 2.1.1
e 2.1.2
necessità di essere suddiviso in 2 moduli separati, spetta a voi decidere. E ora abbiamo le interfacce, quindi possiamo iniziare l'implementazione. Aspettatevi di lanciare exceptions
durante la convalida o dovrete passare la classe personalizzata per gestire i messaggi di errore.
SOLID è l'acronimo di più principi. Devi prima capirli e poi provare ad applicarli quando scrivi il codice. Le ricette non esistono realmente, non si otterrà un passo alla volta come fare le cose altrimenti non ci sarebbe bisogno di sviluppatori umani. Ogni applicazione e problema ha le sue sfide e il contesto unici, ciò che ha funzionato in un caso potrebbe non funzionare in altri casi. – MikeSW
Questa domanda sembra essere troppo ampia per poter rispondere in modo efficace. – anotherdave
Un sacco di buoni video su SOLID può essere trovato qui: [DimeCasts.net] (http://dimecasts.net/Casts/ByTag/SOLID%20Principle) – PositiveGuy