Quando hai in mano un martello, tutto sembra un chiodo. È allettante una volta che sai come #ifdef
funziona per usarlo come una sorta di mezzo per ottenere un comportamento personalizzato nel tuo programma. Lo so perché ho fatto lo stesso errore.
Ho ereditato un programma legacy scritto in MFC C ++ che già utilizzava #ifdef
per definire i valori specifici della piattaforma. Ciò significava che potevo compilare il mio programma da utilizzare su una piattaforma a 32 bit o su una piattaforma a 64 bit semplicemente definendo (o in alcuni casi non definendo) specifici valori macro.
Quindi è sorto il problema che avevo bisogno di scrivere un comportamento personalizzato per un client. Avrei potuto creare una filiale e creare una base di codice separata per il cliente, ma ciò avrebbe reso un inferno di manutenzione. Avrei potuto anche definire i valori di configurazione da leggere dal programma all'avvio e utilizzare questi valori per determinare il comportamento, ma dovrei quindi creare configurazioni personalizzate per aggiungere i valori di configurazione corretti ai file di configurazione per ciascun client.
Sono stato tentato e ho ceduto. Ho scritto #ifdef
sezioni nel mio codice per differenziare i vari comportamenti. Non commettere errori, non era niente di esagerato all'inizio. Sono state apportate modifiche di comportamento molto minori che mi hanno permesso di ridistribuire le versioni del programma ai nostri client e non ho bisogno di avere più di una versione della base di codice.
Nel corso del tempo questo è diventato un problema di manutenzione comunque perché il programma non si è più comportato in modo coerente su tutta la linea. Se volevo testare una versione del programma, dovevo necessariamente sapere chi era il cliente. Il codice, sebbene provassi a ridurlo a uno o due file di intestazione, era molto disordinato e l'approccio di correzione rapida fornito da #ifdef
significava che tali soluzioni si diffondevano in tutto il programma come un cancro maligno.
Da allora ho imparato la lezione e anche tu dovresti. Usalo se devi assolutamente e usalo rigorosamente per le modifiche alla piattaforma. Il modo migliore per affrontare le differenze di comportamento tra i programmi (e quindi i client) è modificare solo la configurazione caricata all'avvio. Il programma rimane coerente ed entrambi diventano più facili da leggere e da eseguire correttamente.