The way I can do that is by having a parent class called SomeParentClass
that have a virtual method called printInfo()
, and then I would make the classes data types that can be present in the array inherit from this class and override the printInfo()
method, and then I can create an array of type SomeParentClass*
.
Is there anything wrong with this approach?
Non c'è assolutamente nulla di sbagliato in tutto questo (anche se consiglio vivamente di evitare puntatori e array, e invece scegliere qualcosa come std::deque
con std::unique_ptr
o std::shared_ptr
in modo che tu non stia scrivendo il codice che ha bisogno occuparsi della gestione della memoria).
Da una prospettiva "OO" indipendente dalla lingua, questo è esattamente il tipo di scenario con cui ci si aspetta che l'ereditarietà venga usata.
I'm asking because I have read that a class should represent an entity (for example: BankAccount
, Car
, House
, Student
, etc.), but SomeParentClass
doesn't represent an entity. I have also read that the relationship between a parent class and a child class is an "Is-A" relationship, but the classes that will inherit from SomeParentClass
are not SomeParentClass
(in the same way that a Car
is a Vehicle
for example).
Posso pensare ad alcuni scenari in cui questo potrebbe essere un consiglio ragionevole, anche se posso pensare a molti altri scenari in cui questo consiglio è fuorviante o sbagliato. Ci sono stati troppi libri, blog e tutorial scritti nel corso degli anni che tentano di spiegare OO in termini come questo, e il più delle volte sono scritti da persone la cui comprensione di OO è fuorviata (almeno dal punto di vista che non corrisponde alla definizione originale di Alan Kay del termine "programmazione orientata agli oggetti", che non ha nulla a che fare con le entità).
In primo luogo, non c'è assolutamente alcun requisito che una classe dovrebbe rappresentare un'entità di dati. Attenersi a questo tipo di mantra come una regola difficile può facilmente condurre a un modo molto stretto e fuorviante di pensare alla struttura del codice in cui qualsiasi tipo di comportamento che può essere correlato a una particolare entità di dati appartiene a quell'entità, risultando pesantemente classi gonfiate contenenti dozzine di metodi che hanno una relazione minima o nulla tra loro. Questa mentalità spesso provoca l'anti-pattern "Oggetto di Dio" come descritto qui: link
Il design della classe è completamente diverso da Entity Modeling: se si confondono 'entità' con 'classi', si rischia anche di perdere la separazione logica tra diversi livelli e moduli nel codice.
Ad esempio, in un'architettura con livelli / livelli, è possibile avere strutture di entità semplici che non contengono alcun comportamento e vengono semplicemente utilizzate per supportare le operazioni CRUD in / da un archivio di persistenza. In genere, le classi contenenti la propria logica aziendale principale non dovrebbero avere alcuna conoscenza della persistenza. Se si segue la vista che le classi dovrebbero essere entità, allora si possono finire con le classi 'business logic' che contengono anche molti metodi non correlati alla logica di business come Read
o Save
, a quel punto il codice perde qualsiasi tipo di struttura chiara o separazione.
La chiave per la programmazione orientata agli oggetti sta dietro la progettazione di classi attorno alla separazione logica e al raggruppamento del relativo comportamento (cioè funzioni / metodi).
Vale a dire, in molte (ma non tutte) circostanze, limitare l'uso delle classi solo per rappresentare entità non fornisce una struttura utile al tuo codice e talvolta può essere controproducente.
Se una classe contiene metodi che non hanno relazioni tra loro e che soddisfano requisiti completamente indipendenti, allora è un'indicazione che hai una classe che fa troppe cose - ma questo è esattamente ciò che è probabile finire con se si trattano le entità come classi. La maggior parte delle volte il modo per arrivare a un codice pulito e modulare è quello di dividere i metodi non correlati tra diverse classi che probabilmente non si adattano perfettamente a nessuna entità nel dominio del problema.
D'altra parte, la modellazione Entity riguarda esclusivamente l'identificazione e il raggruppamento di attributi di dati logicamente correlati e le relazioni logiche tra i dati raggruppati. In molti casi, i criteri che si possono usare quando si decide se creare un raggruppamento di attributi in un'entità (come 3NF / BCNF) saranno completamente diversi dai criteri quando si decide di creare un raggruppamento di comportamenti in una classe; per questo motivo, è meglio evitare di sfumare le linee tra il concetto di un'entità dati e il concetto di classe.