Ho letto tutti i libri sul perché creare una classe e cose come "cercare i nomi nelle vostre esigenze" ma non sembra essere sufficiente. Le mie classi mi sembrano disordinate. Mi piacerebbe sapere se ci sono delle metriche o qualcosa in cui posso confrontare le mie classi e vedere se sono ben progettate. In caso contrario, chi è il guru OO più rispettato in cui posso ottenere i consigli di progettazione della classe corretta?Desigining Proper Classes
risposta
se si ha familiarità con la progettazione di database, in particolare il concetto di normalizzazione, allora la risposta è semplice: una classe di data-centric dovrebbe rappresentare un'entità in terza forma normale
se questo non è utile, provate questo invece:
- una classe è una raccolta di elementi di dati ed i metodi che operano su di essi
- una classe dovrebbe avere una responsabilità singolare, vale a dire che dovrebbe rappresentare una cosa in vostro modello; se rappresenta più di una cosa, dovrebbe essere più di una classe.
- tutti gli elementi di dati in una classe devono essere associati/correlati logicamente tra loro; se non lo sono, diviso in due o più classi
- tutti i metodi in una classe deve operare solo sui parametri di input e elementi di dati della classe - vedi Law of Demeter
che è circa quanto posso andare con un consiglio generale astratto (senza scrivere un lungo saggio); potresti pubblicare una delle tue lezioni per la critica se hai bisogno di un consiglio specifico
@ [Celebrus]: grazie –
Penso che il design dell'oggetto sia tanto l'arte quanto la scienza. Ci vuole tempo e pratica per capire come progettare eleganti classi eleganti &. Forse se puoi dare un esempio di una lezione semplice che hai progettato non sei soddisfatto con SO, gli utenti possono criticare e fornire indicazioni. Non sono sicuro che ci siano risposte generali al di fuori di ciò che hai già letto nei testi.
, quale lingua stai usando? sebbene l'OOD sia neutrale rispetto alla lingua, l'uso di funzioni specifiche della lingua in classe può renderlo più pulito. – Jason
Il guru OO più rispettato che conosca personalmente è StackOverflow. Metti qui i tuoi nomi di classe e penso che avrai un buon numero di recensioni.
Bene o empio? – orbfish
Le classi sono tipicamente utilizzate per modellare i concetti del dominio del problema. Una volta che hai un problema ben definito (ovvero il set di casi d'uso), sarai in grado di identificare tutti i partecipanti. Un sottoinsieme dei partecipanti sarà intrinseco al sistema che stai progettando. Inizia con una grande scatola nera come sistema. Continua a scomporlo, come e quando hai più informazioni. Quando hai un livello in cui non possono più essere scomposti (in concetti nel tuo dominio problematico), inizi a ricevere le tue lezioni.
Ma poi, questa è una visione soggettiva di un non-guru. Suggerirei un pizzico di sale al menu.
La creazione di classi che iniziano a essere pulite e diventano disordinate è una parte fondamentale di OO, ovvero quando si refactoring. Molti sviluppatori cercano di passare al design di classe perfetto fin dall'inizio, nella mia esperienza che non è proprio possibile, invece inciampi, risolvendo il problema e poi refactoring. Puoi raccogliere, basare le classi e le interfacce man mano che il design emerge.
se non sai come progettare una buona classe in primo luogo, è probabile che anche tu non sappia come rifattorizzare una classe per renderla migliore ... ;-) –
Questo è vero, ma il suo punto è vero anche e fu mancato altrove. – orbfish
Metriche? Non è così che ti fideresti di loro.
Le tue lezioni stanno svolgendo il lavoro per far funzionare il programma e mantenerlo gestibile attraverso più revisioni?
Se sì, stai andando bene.
Se no, chiediti perché no, quindi modifica ciò che non funziona.
Cerca di concentrarti sul comportamento anziché sulla struttura. Gli oggetti sono entità "viventi" con comportamenti e responsabilità. Digli di fare le cose. Dai un'occhiata all'approccio CRC-card per aiutarti a modellare in questo modo.
- 1. Design Aggregate Root Proper
- 2. JavaScript "classes"
- 3. Android animate drop down/up view proper
- 4. HKEY_CURRENT_USER \ Software \ Wow6432Node \ Classes vs HKEY_CURRENT_USER \ Software \ Classes \ Wow6432Node
- 5. Ruby "Base" classes
- 6. protected Inner Classes
- 7. UnitTesting Static Classes
- 8. C# Array of Classes
- 9. Multiple classes in SVG
- 10. ES6 Classes Valore predefinito
- 11. scale case classes domande
- 12. Unity Resolve Multiple Classes
- 13. ReportDiagnostic on Partial Classes
- 14. py.test test parametrizing classes
- 15. Abstract Sealed Classes
- 16. Scala case classes in raccolte
- 17. Iterating through all JDK classes
- 18. C++ typename e inner classes
- 19. ASP.NET MVC V2 - Buddy Classes
- 20. java inner classes metodo accesso
- 21. Infinite Maven 'target/classes' folders
- 22. Proper DOCTYPE ... attributi personalizzati e markup non standard
- 23. Che cos'è la directory "Classes-1.moved-aside" nella mia directory Classes?
- 24. Guice @Provides Methods vs Provider Classes
- 25. CSS Module, React e Overriding CSS Classes
- 26. Qual è l'operatore <= su Ruby Classes?
- 27. Clojure hot code swapping per uberjars/.classes
- 28. Haskell record syntax e type classes
- 29. Ruby on Rails: Modules vs. Classes
- 30. Thinging Checked Exceptions from Anonimo Inner Classes
+1, mi piacerebbe sapere anche – krebstar