Ho lavorato sul refactoring del vecchio codice e ho trovato molte istanze del seguente tipo di situazione: c'è un oggetto master che chiamiamo "Application" e ce n'è solo uno. L'applicazione creerà al suo interno altri oggetti denominati "Funzionalità" in base all'input dell'utente, ecc. L'oggetto Feature potrebbe avere alcuni metodi che prendono parametri void ma in realtà operano o utilizzano alcune variabili nell'ambito di applicazione. Questo perché le funzioni definite nella feature di classe sono definite nello stesso progetto e includono l'intestazione da Application (questo è C ++). Ecco un rudimentale tentativo di mostrare un semplice esempio di pseudocodice:
int main()
{
Application theApp = new Application()
the.App.someSetting = foo;
the.App.someVariable = bar;
the.App.RunSomeFeature();
}
// RunSomeFeature function def in class Application
void Application::RunSomeFeature()
{
// create object of type feature
Feature feature = new Feature();
feature.SomeFunction(void)
}
// SomeFunction def in class Feature
void Feature::SomeFunction(void)
{
// global variable from Application "creeping in"
someLocalVariable = theApp.someSetting;
otherLocalVariable = theApp.someVariable;
}
Spero che questo illustri un po 'cosa intendo. Il mio obiettivo è essenzialmente quello di spostare la classe "Feature" in una posizione diversa dallo spazio dei nomi di "Application" (ad esempio in una dll) e non posso includere l'intestazione Application (poiché ciò vanificherebbe lo scopo della separazione). Ma dal momento che ci sono questi tipi di globals ovunque nel vecchio codice questo compito è piuttosto complicato. Questa potrebbe essere una cosa del C ++ per quanto ne so, è facile (o posible) fare questo errore di codifica, ma non ne sono sicuro.
Questo mi ha fatto riflettere su alcune domande riguardanti il design OOP. Il codice OOP ben progettato avrebbe solo classi e funzioni completamente autonome con tutte le variabili esterne passate esplicitamente? Anche se un oggetto verrà creato all'interno di un altro? Posso vedere in questo modo l'intero codice sarebbe molto più facile da "rimescolare" internamente. Ma a volte ci possono essere molti parametri da passare e dal momento che "Feature" è creato da "Application" comunque vedo perché la mia situazione potrebbe sorgere. Ma il codice scritto come nell'esempio collega implicitamente la classe Application e Feature allo stesso "blocco" o ambito globale e prende il lavoro riga per riga ogni volta per separarli.
Tuttavia l'altro estremo sarebbe che ogni classe è essenzialmente quasi un'applicazione autonoma a sé stante (e questo può andare un po 'contro l'idea di ereditarietà). Quando leggo dei principi di progettazione OOP, di solito non trovo questa sfumatura particolare di cui ho parlato molto o ho solo l'idea che tutto dovrebbe essere fondamentalmente autonomo, ma trovo che in pratica questo è raramente vero.
Vedo che questo potrebbe essere un po 'aperto, ma qualsiasi regola empirica su quale livello dovremmo "incapsulare completamente" al fine di avere pezzi di codice che possiamo rimescolare facilmente? O qualsiasi filosofia progettuale che qualcuno condividerebbe su questo tipo di situazione?