Devo chiamare questo "Multitasking" in OOP?

3

Sono molto nuovo alla programmazione e ho questa umile domanda relativa all'OOP:

Possiamo avere un modulo in un programma scritto in modo OOP, che contiene 2 o più funzioni OOP? Dì, sia l'incapsulamento che il polimorfismo O sia l'ereditarietà e la modularità, ecc ...

    
posta JohnDoea 17.02.2016 - 22:29
fonte

3 risposte

3

In senso stretto, solo il polimorfismo è la caratteristica che definisce OOP. Gli altri attributi sono incidentali, ma comunque utili.

  • L'incapsulamento è una funzionalità dei tipi di dati astratti in cui l'interfaccia visibile esternamente ei dettagli dell'implementazione sono separati in modo che i dettagli di implementazione possano cambiare anche senza l'interfaccia dover cambiare. I modificatori di accesso come public o private non sono necessari per questo, ma aiutano a evitare la dipendenza dai dettagli di implementazione. L'incapsulazione viene utilizzata per ottenere modularità , ma ciò è possibile senza OOP.

  • L'ereditarietà ha due aspetti:

    • uno è sottotipizzazione , il che significa che se un oggetto di tipo Foo può essere utilizzato ovunque sia previsto un oggetto di tipo Bar , allora Foo è un sottotipo di Bar . Molti linguaggi OOP lo modellano principalmente con interfacce. Tuttavia, questa definizione presuppone che abbiamo un sistema di tipo significativo, che molti come JavaScript non lo fanno.

      I tipi di sistema vengono spesso usati per limitare il polimorfismo: se chiamo un metodo foo.method() , il compilatore garantirà staticamente che foo ha un tipo che fornisce un method adatto.

    • l'altro è riutilizzo del codice . Quando una classe Subclass eredita da una classe Parent , Subclass non eredita solo l'interfaccia ma anche tutti i campi e il comportamento dei dati. Nuovi campi e nuovi metodi possono essere aggiunti e il comportamento esistente può essere sovrascritto.

      Come risulta, questo è un meccanismo abbastanza problematico per il riutilizzo del codice. Questo è spesso indicato con lo slogan " Composition over Eredità ".

Di questi, l'incapsulamento è il più importante. Un approccio modulare rende il software di grandi dimensioni più gestibile e una classe è un tipo di modulo. Le associazioni tra moduli dovrebbero essere poche e ben definite. Ciò significa che un modulo deve pubblicare un'interfaccia accurata piuttosto che esporre dettagli irrilevanti. Non è sempre necessario che i moduli possano essere selezionati o scambiati in fase di runtime.

Solo quando abbiamo un comportamento in cui non sappiamo in anticipo quale funzione esatta dovrebbe essere eseguita in runtime, abbiamo bisogno di polimorfismo. Ad esempio, potrei avere un elenco di valori diversi che tutti voglio stampare. Potrebbero essere stringhe o numeri o uccelli o automobili o BadOopExamples, ma hanno una cosa in comune: possono essere stampati. Una soluzione OOP (a seconda del linguaggio) definirà un tipo esplicito Printable o un tipo implicito che ogni oggetto deve avere un'operazione print() . Ogni valore che viene inserito nell'elenco deve soddisfare questo tipo. Posso quindi usare quell'elenco e for each Printable p in the list: p.print() e otterrò un output che dipende da ciascun valore. Mentre questa soluzione si basava sul polimorfismo, altre tecniche di progettazione come l'incapsulamento erano irrilevanti. I vari modelli di progettazione orientati agli oggetti si basano tutti sul polimorfismo.

Quindi, mentre l'incapsulamento è davvero importante, il polimorfismo è davvero potente. Molti design combinano entrambe le strategie, ma un buon design non si basa sull'inseguire un po 'di buzzword (che è diventato OOP). È possibile che un buon design finisca per non usare nessuna di queste tecniche, ma sono comunque una buona linea guida. Soprattutto i test del software diventano molto più semplici quando disponiamo di piccoli moduli polimorfici, poiché il polimorfismo può essere utilizzato per testare un modulo in isolamento.

    
risposta data 17.02.2016 - 23:53
fonte
1

OO è un paradigma - una raccolta di idee / metodologie per la modellazione di soluzioni ai problemi. Puoi pensare a OO come "un approccio al problem solving", o anche a una mentalità.

Incapsulamento e modularità sono strettamente correlati tra loro. L'ereditarietà è un prerequisito per il polimorfismo. Questi concetti non si escludono a vicenda, infatti lavorano spesso insieme.

L'ereditarietà e il polimorfismo sono strumenti offerti dai linguaggi di programmazione che supportano l'OO. L'incapsulamento e la modularità riguardano il tuo design e il modo in cui strutturi il tuo codice.

Come programmatore in un linguaggio come Java o C # potresti usare l'ereditarietà e il polimorfismo per migliorare l'incapsulamento e per creare codice modulare o estendere il codice di qualcun altro senza interrompere l'incapsulamento.

L'obbiettivo di OO è aiutare gli esseri umani a gestire la complessità, e ai programmatori viene chiesto regolarmente di risolvere enormi problemi complessi che non riescono a mettere in testa tutti in una volta.

È molto più facile per gli umani risolvere i problemi quando le cose si dividono in blocchi gestibili. Quindi, quando un programma deve risolvere un enorme problema (o molti problemi enormi), è auspicabile che la soluzione sia composta da molte piccole classi o moduli autosufficienti che hanno ciascuno uno scopo chiaro e ben definito; preferendo piccole funzioni che sono molto più facili da capire rispetto a quelle con logica "gonfia".

    
risposta data 17.02.2016 - 23:26
fonte
0

Sì. Infatti l'ereditarietà e l'incapsulamento sono spesso usati per ottenere il polimorfismo. Ciò che tutte queste parole significano diventerà più chiaro quando raccoglierai alcune pratiche esperienze di programmazione orientate agli oggetti.

    
risposta data 17.02.2016 - 23:22
fonte

Leggi altre domande sui tag