Questo può risultare un po 'confuso, ma è una domanda che continuo a trovarmi chiedendo mentre accumulo sempre più responsabilità nei confronti dei vecchi sistemi e funzionalità che ho progettato in precedenza. Cercare di arrivare al nocciolo della mia domanda è un po 'difficile, ma cercherò di illustrarlo con alcuni esempi.
Un paio di anni fa, mi è stato assegnato il compito di creare un sistema di modifica dei menu altamente personalizzabile per il nostro sito. Questo sistema di modifica del menu è stato progettato con uno scopo molto specifico, che era quello di consentire agli utenti finali di configurare menu di navigazione personalizzati per specifici ruoli utente nel sistema. Il sistema non era eccessivamente complesso o troppo robusto, ma era abbastanza funzionale da gestire ogni possibile caso d'uso che potessimo immaginare per creare un nuovo menu di navigazione. Abbiamo costruito tutta la nostra logica personalizzata e la gestione speciale in. Abbiamo scritto centinaia di righe di codice per soddisfare le nostre regole di business specifiche per questa parte di funzionalità, e l'abbiamo rinforzata.
Circa un anno dopo aver creato il sistema di menu del sito, mi è stato assegnato lo sviluppo di un sistema di menu dinamico per la nostra applicazione mobile che ci permettesse di creare menu personalizzati basati sulla società per cui l'utente lavorava. Questo nuovo sistema era molto simile al vecchio sistema e abbiamo deciso che era meglio riutilizzare le tabelle e le funzionalità del menu del sito. Tutto quello che dovevamo fare era espanderli leggermente, e per lo più si adattavano al nostro bisogno. Tuttavia, c'erano ancora alcune differenze importanti, quelle erano:
- I menu mobili non utilizzavano esclusivamente Font Awesome come la loro icona come il nostro menu del sito web. Invece, ha usato immagini recuperate da una posizione statica sul nostro server web. Permetteva anche il caricamento e l'archiviazione di immagini personalizzate nel database. Quindi ora dovevamo controllare se questa voce di menu mobile popolava il campo url o il campo del file.
- I menu mobili erano basati sulla società dell'utente piuttosto che sul ruolo assegnato nel sistema. Ciò ha reso la nostra tabella MenuRoles inutile per questa funzione.
- Il menu del cellulare non ha navigato su pagine diverse sul nostro sito web. Invece, corrispondeva a determinate azioni nell'applicazione, ma poteva anche lanciare una webview per un URL personalizzato. Abbiamo attenuato questo facendo una tabella delle azioni e includendo un campo URL.
Ora, per evitare di ingombrare la tabella del menu principale con colonne in eccesso, ho creato un'altra tabella chiamata MobileMenuItem
che fa riferimento alla nostra tabella MenuItem
. Questa tabella di voci di menu mobile conteneva tutte le nostre colonne aggiuntive e abbiamo semplicemente inserito il codice per ignorare le colonne irrilevanti nella tabella MenuItem
originale. Non troppo grande di un problema.
Successivamente abbiamo dovuto aggiornare il modo in cui sono state controllate le autorizzazioni del menu. Fortunatamente, nell'ultimo anno, abbiamo anche creato una funzione di FeatureSet
incredibilmente robusta che può controllare gerarchicamente attraverso molti scenari diversi per determinare a quali funzioni un singolo utente ha avuto accesso. Sfortunatamente, è stato originariamente progettato per determinare semplicemente se un utente avesse accesso a una funzione specifica. Queste caratteristiche erano semplicemente una stringa nel database a cui si accedeva attraverso le costanti nel codice, e gli algoritmi che abbiamo messo in atto semplicemente sputavano un vero / falso sul fatto che un utente avesse accesso a quella caratteristica.
Fortunatamente, alcuni mesi prima, avevamo personalizzato il set di funzionalità in modo da poter recuperare le stringhe da una tabella di risorse in base alle funzioni a cui un utente aveva accesso e quali caratteristiche individuali erano state sostituite. Ma ancora una volta, questo sistema non era proprio adatto per andare a prendere il menu corretto mentre cercavamo le stringhe, non i riferimenti ai menu. Quindi, di nuovo, abbiamo adattato il sistema per essere in grado di gestire anche i menu. Ancora una volta, ignorando le funzionalità implementate in precedenza e dovendo codificare ciò che avevamo costruito in precedenza.
Alla fine, questo portò a una serie di 3-4 sistemi indipendenti che erano abbastanza simili da riutilizzare alcune parti della loro funzionalità, ma abbiamo rotto la specificità di quei sistemi nel processo.
Quindi oggi sono seduto qui, costruendo un 3%% di co_de che personalizza la schermata iniziale del nostro sito in base a società personalizzate (proprio come l'applicazione mobile). Tuttavia, è solo abbastanza diverso che devo modificare la tabella Menu Editor
originale per includere molte proprietà che sono state incluse nella tabella MenuItem
. Così ora mi rimangono 3 editor di menu indipendenti con colonne ambigue tra tabelle, logica specifica per ogni singolo sistema e codice spaghetti a perdita d'occhio.
Quindi la mia grande domanda si riduce fondamentalmente a, qual è l'approccio giusto? Dovresti disaccoppiare completamente le funzionalità della tua applicazione, anche se sono incredibilmente simili? Dovresti avere potenzialmente dozzine e dozzine di tabelle e algoritmi quasi identici anche se sono solo leggermente diversi.
Oppure, dovresti provare a riutilizzare il maggior numero possibile di altri tuoi sistemi?