La programmazione generica e l'OOP si escludono a vicenda?

2

Non ho mai fatto programmazione generica prima, essendo più un tipo pitone, e generalmente usando OOP. Mentre mi sono trasferito nella programmazione generica, ho affrontato alcuni problemi. Ho letto le Domande frequenti , ma non sono soddisfatto. Quello che voglio chiedere sono le seguenti domande (sono principalmente interessato al primo, ma rispondere agli altri sarà estremamente positivo):

La programmazione generica e l'OOP si escludono a vicenda? Ad esempio, si suppone che tu abbia metodi e funzioni che accettano il modello, invece di una classe di base o di una classe pura astratta?

Altre domande che ho, solo per fornire un contesto alla mia mancanza di comprensione sono: in che modo i modelli di progettazione tradizionali reagiscono all'approccio e ai concetti di programmazione generici? Come prevenire (o controllare) la genericità di ogni classe / modello a "esplodere" nelle dipendenze dettate dalla logica del programma, in particolare quando due tipi sono correlati e vanno sempre insieme (ad esempio una classe RealNumberProducer e una doppia rispetto a ComplexNumberProducer e std :: complesso)?

    
posta Stefano Borini 21.03.2013 - 16:04
fonte

4 risposte

7

No. In effetti, molti dei migliori sistemi utilizzano entrambi in combinazione. I contenitori sono inutili se non sono generici, caso in questione, contenitori Java o C # quando queste lingue sono state lanciate.

In effetti, la programmazione generica è praticamente identica a OOP, tranne che si verifica in fase di compilazione / interpretazione piuttosto che in termini di tempo di esecuzione, che presenta numerosi vantaggi, tra cui aumento delle prestazioni, sicurezza e flessibilità.

are generic programming and OOP mutually exclusive? Meaning, for example, are you supposed to have methods and functions accepting the template, instead of baseclass or abstract pure class?

Non si escludono a vicenda, ma dovresti usare i modelli quando possibile per ottenere un metodo generico. Non utilizzare mai l'ereditarietà a meno che non sia possibile utilizzare un modello. L'ereditarietà è uno dei peggiori strumenti presenti nell'arsenale.

How do traditional design patterns react to generic programming approach and concepts?

Vengono completamente spazzati via dall'acqua. Alcuni modelli sono semplicemente del tutto privi di valore all'inizio (ad esempio Singleton), molti altri sono inutili di fronte ai modelli o tutte le possibili istanze di essi sono implementati direttamente da un modello, come Listener.

How to prevent (or control) the genericity of each class/template to "bubble up" in the dependencies dictated by the program logic, in particular when two types are related and go always together (e.g. a RealNumberProducer class and double vs ComplexNumberProducer and std::complex)?

Non farlo. Incoraggiarlo. Inoltre, sto solo indovinando i nomi qui, ma in realtà suona solo come std::function<double(args)> , piuttosto che come una vera classe.

    
risposta data 21.03.2013 - 16:53
fonte
2
  1. No, non si escludono a vicenda. Eiffel e C ++ hanno entrambi avuto generici e OOP per molto tempo, e lingue più recenti supportano entrambe le funzionalità.

  2. Gli schemi di progettazione sono principalmente scritti in termini di programmazione orientata agli oggetti e si riferiscono alla decomposizione di un problema in classi. Queste classi potrebbero essere generiche o meno in termini di tipi di dati che accettano; i generici e le OOP sono ortogonali in questo senso.

  3. Devi solo scegliere se una raccolta di codice (OO o altro) sarà generica o utilizzerà tipi specifici; non c'è davvero alcun "controllo" da guadagnare o perdere. Prendendo in considerazione il tuo caso, potresti forse piegare queste due coppie di tipi in un NumberProducer<T> che restituisce numeri di tipo <T> , anche se la domanda non entra in dettagli sufficienti per capire se è fattibile o appropriato.

risposta data 21.03.2013 - 16:49
fonte
0

In teoria, OOP e Generico sono due diversi paradigmi e lo stato mentale per la codifica è diverso l'uno dall'altro. In termini pratici, puoi combinare OOP con la meta-programmazione del modello. Tuttavia, non suggerirei di unirli a meno che non siate a vostro agio con OOP e generici e se siete in un processo di apprendimento potrebbe confondervi. Inoltre, vi sono alcuni avvertimenti in C ++ quando si combina l'ereditarietà con i modelli. Dai uno sguardo al libro di Scott Meyer (credo all'articolo 48) e menziona dei buoni punti su di esso.

Buona fortuna per il tuo viaggio di apprendimento Stefano

Armando.

    
risposta data 21.03.2013 - 18:36
fonte
-1

No, non si escludono a vicenda, ma immagino che il punto si sia già verificato.

Nella mia mente OOP è una questione di semantica. È un modo per separare le preoccupazioni e aiutare la manutenibilità e l'uso (riutilizzo se lo si desidera) del codice.

Inoltre, Generics riguarda espressività . Quando posso implementare un algoritmo ed esprimerlo in modo tale che possa, e lo farà, accettare molti tipi - quindi i generici sono lo strumento giusto.

Alcune lingue combinano le due consentendo al programmatore di specificare un contratto / interfaccia per il tipo come modo per garantire la semantica del tipo. Ha un sovraccarico per la moltiplicazione? Può essere paragonato ad altre istanze dello stesso tipo? ecc ecc La maggior parte delle lingue (almeno quella che uso) offrono entrambe, fianco a fianco.

Se sei deciso a utilizzare i generici senza utilizzare OOP, ti suggerisco di iniziare a esaminare un linguaggio funzionale tipizzato dinamicamente.

    
risposta data 21.03.2013 - 19:29
fonte

Leggi altre domande sui tag