Ho alcune domande sul miglioramento della struttura del codice e sulla manutenibilità, specialmente per quanto riguarda SOLID. Queste domande sono specifiche per questo progetto, quindi sarei felice se questo non finisse come post di un articolo duplicato (sono consapevole che ci sono molti post riguardo questo argomento).
La domanda principale è, se è utile o addirittura necessario usare SOLID per rifattorizzare correttamente il codice.
Una breve introduzione: sto lavorando come scimmia di codifica su un progetto C # .NET per un servizio Windows. Questo servizio deve leggere i file di testo, che contengono informazioni di registrazione dei dati, identificare la lettura (ad esempio la tensione) eseguire alcuni calcoli su di esso e inviare i dati in un file di testo. Questo è un lavoro individuale che sto facendo per il mio datore di lavoro. Attualmente è di circa 3000 LOC Come ben sapete, un progetto come questo inizia in piccolo con un piccolo insieme di requisiti. Poi improvvisamente nuove cose devono essere implementate nel più breve tempo possibile. Di conseguenza la struttura del programma non è ottimale. Devo ammettere che non sono molto esperto (attualmente sto studiando CS al college).
È iniziato con quattro classi, una l'implementazione del servizio Windows stessa con funzione di base sui dati e tre per la struttura big data contenente tutti i valori di configurazione e identificazione.
Ora ci sono due problemi, il primo è che abbiamo iniziato con un solo tipo di data logger, ora ce ne sono molti e la funzione che esegue le operazioni sui dati letti deve essere divisa in parti.
Seconda e principale preoccupazione, ho ancora solo quattro classi. Tutto è ancora nella classe ConverterService.
Sono consapevole del fatto che, secondo SOLID e OOD, le cose devono essere separate in classi diverse, se sono per preoccupazioni diverse. Quello che non riesco a capire è davvero, se è davvero necessario farlo qui.
Ad esempio, ho una funzione per la lettura di XML e la funzione per scrivere XML. Questo potrebbe essere messo in una classe separata, ma vorrei comunque avere una sola istanza.
Ora per quanto riguarda la funzione di calcolo dei dati, questo è il modo in cui la struttura attualmente appare:
private static void editFile(input the file)
check the header
validate that values are really from configured data logger
check timestamps
special cases where values registers have certain names do…
if conditions q
if data logger x and also a do lots of operations
else if data logger y and also a do
else if data logger z and b do
if condition w
if data logger x and also a do
else if data logger y and also a do some other operations
else if data logger z and b do
…
Come puoi immaginare piuttosto spiacevole da guardare.
Ora quello che farei sicuramente è separare le attività che puoi vedere in diverse funzioni (come controllare l'intestazione ecc.)
Ma quando si tratta di separare l'operazione di condizionamento, le cose si complicano leggermente.
Vedo in due modi farlo. Prima l'approccio non OOD / SOLID:
Conservalo nella classe ConverterService ma crea funzioni separate per le operazioni.
La funzione editFile contiene ancora i controlli delle condizioni e chiama queste funzioni.
Secondo approccio, creare una classe per ciascun data logger con le proprie operazioni. Sarebbe anche possibile creare un'interfaccia che ogni classe di data logger implementa per renderla più unificata. Il problema però è che le operazioni sono molto diverse quindi probabilmente non è la migliore idea.
La funzione editFile contiene ancora i controlli delle condizioni e chiama queste funzioni.
Non vedo un grande miglioramento perché l'astrazione non semplifica davvero nulla.
Riassunto: 3000 LOC, 37 funzioni e uno sviluppatore
Grande domanda:
- Che cosa dovrei fare?
Tutte le domande:
- Devo usare SOLID?
- Devo separare strongmente le mie funzioni con le classi?
- Ho completamente frainteso OOD? (Avere misericordia)
- Sta usando una nuova classe nel modo giusto, anche se lo farò usarlo per chiamare una funzione (e avere su istanza)?
- Come lo rifattoresti?
- Come gestire elenchi di parametri di grandi dimensioni che tu bisogno di separarlo in più funzioni?
Spero davvero che questo grosso numero di domande non sia fuori luogo.