Il codice esistente
Ho un progetto C # con circa 45000 righe di codice. Ha una classe utility / helper che contiene metodi statici che rendono più facile per il mio codice lavorare con PDFSharp / Migradoc per produrre moduli PDF, che sono prevalentemente strutturati usando tabelle. Uno di questi metodi aggiunge del testo a una cella e ha la seguente intestazione:
public static Cell TextInCell( Cell cell, string text,
CellStyle style = CellStyle.Normal,
int mergeRight = 0,
bool underline = false,
ParagraphAlignment? horizontalAlignment = null,
VerticalAlignment? verticalAlignment = null)
CellStyle
è la mia enumerazione con 15 membri, è un mix di informazioni su dimensionamento, font e colore, ad es. Tiny
, SmallRed
, SmallShaded
. Se il parametro è BoldHeading
, SmallHeading
o Heading
applica quindi un'ombreggiatura a una cella, il cui colore è mantenuto in una variabile private static readonly
della classe di utilità.
Le opzioni non sono totalmente indipendenti. Ad esempio, quando viene selezionata un'opzione di intestazione, il colore del carattere viene automaticamente impostato su bianco.
Ci sono circa 1000 posti nel mio codice in cui viene chiamato questo metodo, con circa 200 che coinvolgono una delle opzioni di titolo di CellStyle
. Questi usi sono distribuiti su 24 classi, che hanno tutti un antenato comune nella gerarchia ereditaria: una classe chiamata FormDesigner
.
Nuovo requisito
Ora il colore dell'ombreggiatura può variare, può essere blu o verde a seconda del tipo di oggetto che fornisce i dati per i moduli.
Possibili soluzioni
- Modifica l'enumerazione per rimuovere i 3 valori che attualmente producono
ombreggiatura e aggiunta:
BlueBoldHeading
,BlueSmallHeading
,BlueHeading
,GreenBoldHeading
,GreenSmallHeading
oGreenHeading
. - Aggiungi un altro parametro per indicare il colore dell'ombreggiatura. Questo
il parametro non ha significato a meno che non sia un'opzione di ombreggiatura per
CellStyle
utilizzato. - Separa la funzionalità di ombreggiatura da questo metodo e inseriscila
in un altro metodo, che deve essere chiamato in aggiunta a
TextInCell
. - Introdurre un metodo statico per impostare la variabile di colore statica in precedenza ogni modulo è stampato.
- Spostare questa funzionalità in una nuova classe non statica, che tiene il passo
dell'opzione per l'ombreggiatura. È quindi possibile creare un'istanza nel costruttore per
FormDesigner
.
Le opzioni (1) e (2) sono pessime perché comporterebbero molto lavoro e aumenterebbero la complessità dell'intestazione del metodo, il che credo peggiori il problema.
Penso che andrò per l'opzione 5. Sostituirò tutti i riferimenti alla classe statica con riferimenti a un'istanza, questo può essere fatto principalmente automaticamente.
Domande
Il modo in cui funziona questo metodo costituisce un odore di codice? La mia comprensione è che qualcosa è proibitivamente difficile da cambiare, c'è un odore di codice.
L'opzione (4) costituisce una soluzione professionale? È ovviamente l'opzione più semplice, ma l'intuizione mi dice che è sbagliato. Sta mantenendo lo stato in una variabile statica, cosa che normalmente non faccio; Mantengo lo stato negli oggetti e faccio il giro degli oggetti o uso i parametri.