Questa è una lista di caratteristiche che il disegno di una applicazione può esprimere. La lista non prende in considerazioni scelte architetturali e requisiti non funzionali che ci sono per una specifica applicazione e non considera nemmeno le priorità che ogni singolo team può scegliere per se tra le varie qualità che un buon disegno può esprimere. La lista quindi contiene le caratteristice di base del disegno di una applicazione che hanno una validità generale.
Le caratteristiche sono elencate a partire dagli aspetti più macroscopici che cioè hanno un impatto ampio sull'intera applicazione proseguendo via via con gli aspetti di dettaglio che invece hanno un impatto più localizzato; per questo da quanto ho provato con un approccio graduale conviene cominciare a risolvere eventuali problemi partendo dal primo punto della lista per passare solo in seguito al successivo.
Sono raggruppati nello stesso Assembly i tipi che solitamente vengono rilasciati e riutilizzati insieme ?
Azione correttiva: raggruppare in un Assembly i tipi che solitamente vengono evoluti e rilasciati insieme condividendo lo stesso versioning, e che solitamente sono riutilizzati insieme (formando un grappolo di tipi strettamente correlati) e che condividono le medesime impostazioni di sicurezza; assicurarsi che non ci siano dipendenze cicliche tra gli Assembly definiti per una applicazione e in modo di ridurre le dipendenze tra Assembly distinti?'''
Sono raggruppati nello stesso namespace i tipi logicamente correlati e i namespace organizzati (nidificazione tra di loro, contenimento nello stesso Assembly o in Assembly distinti) secondo la loro relazione logica e in modo di ridurre le dipendenze tra namespace distinti?
Azione correttiva: definire i namespace, muovere le classi nel namespace opportuno, organizzare i namespace in Assembly
Le classi pubbliche hanno un nome che descrive il ruolo e la responsabilità della classe, i membri pubblici un nome che rappresenta la funzione svolta, i parametri dei metodi pubblici un nome significativo che rappresenta il significato del parametro?
Azione correttiva: rinominare classi, membri e parametri con dei nomi intuitivi e comprensibili a prima vista per un nuovo utilizzatore
guardando con sospetto i nomi di classi che indicano azioni/verbi invece che oggetti/concetti e quelle che usano il suffissi tipo XxxManager e XxxController
differenziando i nomi dei metodi pubblici che effettuano un solo calcolo senza modificare lo stato della classe (tipo IsXxx, GetXxx, CheckXxx, ExistsXxx, ContainXxx) dai nomi dei metodi pubblici che modificano lo stato dell'oggetto (SetXxx, AddXxx, etc.)
Le responsabilità sono ripartite in modo chiaro tra le classi?
Azione correttiva: spostare i membri di una classe che non assolvono alle responsabilità specifiche della classe individuando la classe più adatta.
Sono state rimosse le dipendenze circolari tra Assembly e classi e sono state eliminate le dipendenze non necessarie tra classi di assembly diversi e tra classi di namespace diversi?
Azione correttiva: tracciare il diagramma delle dipendenze e individuare quelle che vanno rimosse.
Gli algoritmi più complessi sono stati semplificati e sono comprensibili?
Azione correttiva: Modificare l'algoritmo semplificandone il flusso, utilizzando nomi parlanti per le variabili, scomponendolo dove possibile e rimuovendo ottimizzazioni non indispenzabili sino a renderlo comprensibile ad un nuovo programmatore che lo legge.
Quando si inizia a lavorare su codice legacy che non si conosce ho notato che conviene iniziare a considerare gli aspetti di granularità pià grossa (assembly, namespace) per poi scendere via via in giù mentre si comprende e si riorganizza il codice.
Quando si scrive nuovo codice o su codice che si conosce ho notato che conviene partire a considerare gli aspetti a granularità più fina (algoritmo, metodo) lasciando emergere via via le scelte di disegno a granularità più grossa.
Lascia qui sotto le tue considerazioni e commenti: [Modifica]
Rubriki: la Rubrica del Wiki
15/08/2008 19.17.06 - LucaMinudel
Luca Minudel, mi presento.
08/05/2007 13.18.34 - LucaMinudel-193.42.138.35
Elenco dei criteri secondo cui unire classi e namespace in uno stesso assembly o in assembly distinti.
23/05/2007 19.35.19 - LucaMinudel-193.42.138.35
Gli strumenti di astrazione messi a disposizione dai LinguaggiObjectOriented.
20/11/2005 23.02.02 - LucaMinudel-151.47.133.157
General Responsability Assignment Software Patterns, ovvero i pattern relativi all'assegnazione delle responsabilità nell'ambito di una struttura ad oggetti.
28/03/2007 22.38.45 - 82.52.16.217
Pattern GRASP High Coesion (alta coesione).
16/08/2008 1.16.08 - LucaMinudel
General Responsability Assignment Software Patterns, ovvero i pattern relativi all'assegnazione delle responsabilità nell'ambito di una struttura ad oggetti.
28/03/2007 22.38.45 - 82.52.16.217
Pattern GRASP High Coesion (alta coesione).
16/08/2008 1.16.08 - LucaMinudel
Definizione del concetto di coesione (cohesion), elenco dei tipi di coesione ed alcuni esempi pratici per spiegare meglio i concetti esposti.
16/08/2008 1.34.59 - LucaMinudel
Pattern GRASP Information Expert (o Expert).
30/11/2006 21.34.49 - RiccardoGolia-87.5.178.75
Pattern GRASP descritto anche come legge di Demeter.
26/04/2006 23.47.29 - RiccardoGolia-87.5.178.75
Catalogo dei pattern di refactoring.
09/08/2008 17.55.35 - -88.149.244.15
General Responsability Assignment Software Patterns, ovvero i pattern relativi all'assegnazione delle responsabilità nell'ambito di una struttura ad oggetti.
28/03/2007 22.38.45 - 82.52.16.217
Pattern GRASP Information Expert (o Expert).
30/11/2006 21.34.49 - RiccardoGolia-87.5.178.75
La code smell Data Class.
17/05/2006 20.46.19 - LucaMinudel-193.42.138.33
General Responsability Assignment Software Patterns, ovvero i pattern relativi all'assegnazione delle responsabilità nell'ambito di una struttura ad oggetti.
28/03/2007 22.38.45 - 82.52.16.217
Pattern GRASP Low Coupling (basso accoppiamento).
26/04/2006 23.48.42 - RiccardoGolia-87.5.178.75
Un design pattern che definisce un'interfaccia unificata attraverso cui accedere all'intero sotto-sistema.
10/02/2008 13.10.08 - -89.97.35.71
un design pattern che definisce la logica con cui un insieme di oggetti interagiscono e realizza l'interazione mantenendo gli oggetti disaccoppiati.
20/12/2006 15.35.02 - -83.103.36.228
Un design pattern che definisce una relazione uno a molti tra oggetti in modo tale che quando un oggetto cambia stato tutti gli oggetti da lui dipendenti vengono automaticamente notificati.
04/10/2007 16.43.02 - -213.140.16.182
Un design pattern che disaccoppia un'astrazione dalla sua implementazione in modo che possano evolvere autonomamente.
27/05/2006 16.08.17 - LucaMinudel-88.149.166.101
Un design pattern che rappresenta una nuova operazione da aggiungere a tutte le classi di una gerarchia di oggetti.
03/10/2007 1.55.30 - -84.221.53.107
Quando usare l'ereditarietà e quando il contenimento?
24/04/2006 12.31.47 - LucaMinudel-193.42.138.33
Refactoring, tecnica per ristrutturare una porzione di codice, alterandone la struttura senza modificarne il comportamento.
08/05/2007 13.18.07 - LucaMinudel-193.42.138.35
Le code smell.
17/05/2006 20.27.56 - LucaMinudel-193.42.138.33
La code smell Large Class.
17/05/2006 20.23.30 - LucaMinudel-193.42.138.33
La code smell Long Method.
17/05/2006 20.24.45 - LucaMinudel-193.42.138.33
La code smell Long Parameter List.
17/05/2006 20.26.33 - LucaMinudel-193.42.138.33
Principio che promuove la semplicità del disegno del software.
24/04/2006 13.23.01 - LucaMinudel-193.42.138.33
Le code smell.
17/05/2006 20.27.56 - LucaMinudel-193.42.138.33
La code smell Switch Statement.
17/05/2006 20.37.29 - LucaMinudel-193.42.138.33
Refactoring, tecnica per ristrutturare una porzione di codice, alterandone la struttura senza modificarne il comportamento.
08/05/2007 13.18.07 - LucaMinudel-193.42.138.35
La Programmazione Object Oriented, cosa è e quali strumenti ha.
25/02/2007 14.30.54 - LucaMinudel-88.149.168.133
Cos'è una Architettura Object Oriented e come si definisce.
11/11/2007 20.02.49 - -88.149.247.101
I Processi di Sviluppo Software, cosa sono, quali sono, che scopo hanno.