C'è qualche differenza nell'apprendimento di OOP su diversi linguaggi di programmazione? [chiuso]


9

Voglio imparare OOP. Conosco Python e conosco pochissime cose su OOP.

Ma quando ho cercato "impara OOP" nei forum ho visto un ragazzo che diceva "Python è così nuovo ed è per questo che non puoi imparare OOP su Python. Dovresti imparare Java e capire OOP su Java"

È vero? C'è qualche differenza nel capire OOP su diversi linguaggi di programmazione? come impararlo su Java, C #, C ++, Perl o Python?


12
"Python è così nuovo ed è per questo che non puoi imparare OOP su Pyton. Impara Java e poi capisci OOP su Java" Non ha senso per me. Se vuoi imparare OOP usando Python, non vedo alcun motivo per cui no. Fallo!
FrustratedWithFormsDesigner,

13
Python non è più vecchio di Java? Credo che lo sia, ma potrei essere fuori di un paio d'anni.
Jimmy Hoffa,

2
@JimmyHoffa Lo è davvero. 91 contro 95 secondo Wikipedia.
Evicatos,

2
@JimmyHoffa: dai, non può essere vero, vero! Sappiamo tutti che Java è stato il primo linguaggio OO di sempre. "Sun annuncia a gran voce la novità di Java" ... - Per quanto riguarda la domanda ... perché sei determinato a imparare OO? Ti sarà costretto abbastanza presto. Python è un eccellente punto di partenza per ottenere informazioni dettagliate sui vantaggi di molteplici paradigmi di programmazione.
lasciato circa il

Risposte:


10

Un oggetto come costrutto teorico è molto semplice: è una struttura che memorizza dati, funzioni o entrambi. L'idea è che queste strutture hanno un senso di "io" che è implicito nella maggior parte delle lingue al di fuori di Python. Questo si chiama "descrittore" e fornisce all'oggetto un punto di auto-riferimento che lega i dati (variabili o campi) e le funzioni (in genere chiamati metodi) al particolare oggetto in questione. L'idea è che stai utilizzando specificamente una variabile o un metodo che appartiene a quella particolare istanza (blocco allocato di memoria in genere sotto) piuttosto che a un costrutto più ampio e più generale.

I sistemi a oggetti tendono a variare rispetto a due grandi categorie: Ereditarietà e Accesso.

Alcuni, come Java o C ++, dichiarano le classi che fungono da "schemi" per gli oggetti che poi vengono allocati. Queste classi e i loro oggetti non possono essere strutturalmente modificati una volta istanziati. Possono avere il contenuto ignorato nel senso che le variabili possono cambiare ma la loro struttura è statica. Ad esempio, non è possibile aggiungere nuovi metodi a HashMap in Java. È possibile estendere l'interfaccia (in pratica classi parzialmente implementate che fungono da contratti) o creare una sottoclasse per ottenere i metodi o le variabili extra necessari insieme a tutte le variabili e i metodi originali della classe in questione.

Altri linguaggi basati su classi, il più comunemente citato come Ruby, ti consentono di aprire facilmente una classe esistente e di aggiungere semplicemente i metodi che ritieni più adatti. Questo è un osso di contesa e considerato da molti molto, molto pericoloso.

Javascript è ancora più libero, gli oggetti non sono altro che una raccolta di slot per variabili o funzioni. Possono essere modificati o sovrascritti ogni volta che il programmatore sente la necessità di farlo. Possono anche essere arbitrariamente clonati come "prototipi" per altri oggetti, trasmettendo così tutte le loro abilità.

Il controllo degli accessi è l'altro grande punto di differenza tra le varie lingue.

Alcuni linguaggi come Java hanno modificatori di accesso molto severi come "privato" e "protetto", che definiscono esattamente quali classi e sottoclassi possono utilizzare una determinata variabile o metodo.

Altri, come Python, sono meno formali, usando la convenzione di un carattere di sottolineatura prima del metodo o del nome della variabile per indicare che è privato.

In definitiva, Python è un linguaggio perfettamente legittimo da programmare in modo orientato agli oggetti, semplicemente non lo impone in modo rigoroso come alcuni degli altri.


Potrebbe essere un po 'troppo tecnico per questa domanda.
Zeroth,

@zeroth, e anche troppo specifico. Il parametro 'self' (o 'this') è tutt'altro che universale.
Javier,

@Javier Ecco perché ho detto che è esplicito in Python e implicito altrove.
Ingegnere mondiale

La domanda riguarda l' apprendimento di OOP e penso che discutere di come sia scritta una lingua per realizzare determinati concetti come l'incapsulamento che abbiamo privateper Java e il trattino basso ( __) per Python è abbastanza importante. Penso che il livello di astrazione di Python potrebbe renderlo un po 'più impegnativo per un principiante, ma sicuramente non impossibile. Java lo spiega per il programmatore che potrebbe far sì che alcuni concetti si attacchino un po 'più facilmente.
Derek W,

@WorldEngineer non sto parlando di essere esplicito / implicito (anche Python non è insolito su questo), ma semplicemente di esistere come concetto. Alcuni linguaggi inviano polimorfici su tutti i parametri, non solo sul primo. Alcuni usano altri suggerimenti per la versione specifica e lo stile principale potrebbe non privilegiare un argomento come "questo".
Javier,

18

L'apprendimento dei principi OOP non è affatto specifico della lingua, quindi se per "impara OOP" intendi "impara cosa significa la terminologia, cos'è OOP e perché dovrei volerlo usare", allora la lingua non ha importanza.

Se intendi "imparare a sviluppare usando OOP", sì, diverse lingue lo gestiscono in modo diverso, ma condividono tutti lo stesso insieme di principi. Se sei come me, lo imparerai meglio semplicemente facendolo. Scegli un linguaggio orientato agli oggetti con un buon tutorial o libro che copra gli aspetti orientati agli oggetti e ce l'hai. Se hai i principi della progettazione orientata agli oggetti, sarai in grado di usarli in qualsiasi altro linguaggio OO.

"Python è così nuovo ed è per questo che non puoi imparare OOP su Pyton. Impari Java e capisci OOP su Java"

Questo mi fa solo male alla testa. Tanto male era stipato in una frase.

Python risale al 1989.

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

Java al 1995.

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

Puoi trarre le tue conclusioni sulla validità di quel consiglio ...


1
Sì, ma Python 1.0 non era fino al 1994. Java era in fase di sviluppo da un po 'di tempo prima che venisse rilasciato anche. Ma sono d'accordo che Python ha OO e PUOI imparare i concetti di OO. È assurdo dire il contrario.
Chubbsondubs,

2
@chubbsondubs Sì, è ancora prima di Java! ;)
Izkata,

1
Fornire solo un contrappunto leggero, OOP basato su classi (C ++, Java, Python e molti altri) è abbastanza diverso da OOP basato su prototipi (JavaScript è l'unico linguaggio che conosco che lo utilizza). Sono ancora OOP e hanno gli stessi fondamenti e servono molti degli stessi obiettivi, ma molte persone considerano le classi parte di ciò che considerano OOP, mentre JavaScript non le possiede ed è decisamente orientato agli oggetti.
KRyan,

@KRyan: Nel caso ti interessi, c'è un altro linguaggio OO basato su prototipo che si chiama Self.
Jerry Coffin,

ActionScript ha sia prototipi che classi.
OrangeDog,

8

Penso che la persona che stai citando mostrasse semplicemente lo sciovinismo linguistico.

In realtà, c'è una differenza tra i concetti di OOP e l' implementazione di OOP. Poeticamente, questo è meglio compreso una volta che hai una migliore comprensione di alcuni dei concetti di OOP.

Molti programmatori si sentono a proprio agio con pochi linguaggi simili, quindi non devono espandere le proprie capacità o soffrire di non essere in grado per un po 'di tempo.

Quindi la domanda arriva davvero a: Python ti insegnerà i concetti di OOP?

Dirò che puoi, a condizione che tu abbia un adeguato supporto all'apprendimento che ti spinga a provare cose che normalmente non esploreresti nell'apprendimento auto diretto. Sarebbe meglio un libro o un mentore di qualche tipo. Mark Lutz scrive libri molto approfonditi, molto dettagliati e molto eccellenti su Python, e raccomanderei i suoi libri perché ti spingeranno a fare e ad imparare di più.

Quello che devi ricordare è che la via di Python non è l'unica via, né l'unica via corretta. Più paradigmi di programmazione padroneggi, migliore diventerai un programmatore. Il modo in cui Python fa OOP non è esattamente come C ++ o Java lo fa, ma i concetti si trasferiscono bene.


4
In termini di OOP, Java e C ++ differiscono l'uno dall'altro tanto quanto differisce da Python.
Gort the Robot,

In una certa misura, ma ciò è in gran parte dovuto al cambiamento delle conoscenze di progettazione del linguaggio e ai diversi vincoli.
Zeroth,

E francamente, il 90% dei concetti di OOP si trasferisce bene tra loro, quasi invisibilmente uniforme.
Zeroth,

Sì, sono d'accordo. Trovo un po 'divertente pensare che Java e C ++ siano "uguali" in termini di OOP.
Gort the Robot,

4

Sì, le implementazioni OOP sono molto diverse. La teoria e i principi sono gli stessi però, ma così tante persone considerano solo "vero OOP" ciò che fanno Java e C ++, che si ottengono molti riferimenti che si suppone siano "linguaggio agnostico" ma che in realtà assumono linguaggi basati su classi, tipicamente statici .

Ciò non significa che quei riferimenti siano cattivi o addirittura limitati; per esempio il libro "Goa (" gang of four ")" Pattern Patterns: Elements of Reusable Object-Oriented Software "è un ottimo esempio di un grande lavoro che dice" OOP "quando in realtà significa" OOP basato su classi statiche ".

Quindi, secondo me: Sì, puoi imparare molto OOP su Python, Javascript, C e molte altre lingue; ma alcune persone (forse un futuro datore di lavoro) quando chiedono "esperienza OOP" significano Java / C ++ / C #. Quindi, sarebbe saggio controllare anche quell'altra vista.

(e quelli non sono gli unici due 'tipi' di OOP ....)


2
Ironicamente statico, OOP di classe non è ciò che Alan Key originariamente suggeriva come OOP. Ma un sacco di "apprendimento" OOP riguarda l'apprendimento del design / senso del codice che non è strettamente limitato a una particolare implementazione OOP
Daniel Gratzer,

2
Potrebbe anche avere senso guardare CLOS: non credo che molti linguaggi / framework offrano metodi multipli.
Giorgio,

2
@jozefg: giusto, una volta Alan Kay ha detto "In realtà ho inventato il termine" orientato agli oggetti "e posso dirti che non avevo in mente C ++."
Javier,

1
@Giorgio In realtà Dylan potrebbe fornire una versione leggermente più semplice di CLOS (nessun modo per specificare quando viene eseguito un metodo multiplo , ma molto più semplice da avvicinare)
Daniel Gratzer,

4

La programmazione orientata agli oggetti è un'idea su come strutturare il linguaggio di programmazione per favorire un basso accoppiamento, nascondere le informazioni (ovvero l'incapsulamento), raggruppare dati e metodi che operano insieme su tali dati e riutilizzare il codice. Molte lingue implementano la loro opinione su queste idee, quindi ci sono variazioni tra le lingue su come si avvicinano all'orientamento agli oggetti. Ad esempio, Java consente solo a una classe di estendere 1 classe. Tuttavia, Python e C ++ consentono di estendere qualsiasi numero di classi. Java ha motivi specifici per i suoi limiti. Limitazioni che hanno lo scopo di correggere le cose dal C ++, ma anche perché Smalltalk supporta solo una singola classe di base.

Le lingue OO possono essere raggruppate in due famiglie. La famiglia Smalltalk (o OOP basata sulla classe) di linguaggi include C ++, Java, Smalltalk, Ruby, C #, Python per citarne alcuni (ce ne sono tonnellate in questa famiglia). Questi sono un mix di linguaggi di tipo statico e dinamico e sebbene differiscano leggermente su alcuni concetti, sono molto simili nel modo in cui pensano a OOP. Quello che intendo con questo è il modo in cui affrontano l'accoppiamento, l'incapsulamento, i dati e i metodi di associazione, il riutilizzo del codice e gli strumenti che forniscono per farlo. All'interno di questa famiglia molti concetti sono gli stessi.

L'altra famiglia è la OOP basata sul protoipo. Queste lingue sembrano molto diverse nella loro implementazione OOP. Probabilmente l'esempio più noto di questo è Javascript, ma Javascript ha copiato queste idee da Scheme e Object LISP. Queste sono lingue meno conosciute e tipicamente tipizzate in modo dinamico. Non riesco a pensare a un linguaggio basato su prototipo tipicamente statico, ma ciò non significa che non ce ne sia uno. Puoi leggerlo qui: http://en.wikipedia.org/wiki/Prototype-based_programming . Il punto è che affrontano OOP in un modo molto diverso rispetto alle lingue basate sulla classe. Ciò significa che i concetti non sono portatili tra queste due famiglie. Solo perché conosci OO in una famiglia non significa che passerai facilmente quelle idee all'altra famiglia.

Ricorda che la maggior parte dei linguaggi di programmazione mescola concetti di molte idee. Python e Ruby incorporano nei loro linguaggi sia OOP che idee di programmazione funzionale. E puoi combinare OO basato su prototipo con determinate estensioni a linguaggi di classe in modo da renderlo ancora più complesso.


Non conterei C ++ nella famiglia Smalltalk. Smalltalk si basa su Simula e Alan Kay ha deliberatamente ignorato la maggior parte delle modifiche in Simula-II, mentre C ++ si basa su questo. C # è strano, è stato progettato da utenti C ++ e designer Pascal per essere come Java.
Jörg W Mittag,

1

OOP è un principio di programmazione - è fondamentalmente un'idea. L'implementazione di OOP varia attraverso i linguaggi di programmazione, ma i pilastri (Astrazione, Ereditarietà, Incapsulamento e Polimorfismo) di OOP sono generalmente presenti in qualche modo o forma.

Dirò senza preferenza per entrambe le lingue, che Java spinge la semantica un po 'più difficile sul programmatore rispetto a dire Python.

Per esempio,

Codice Java: class Cat extends Animal {}

È un po 'più ovvio su cosa stai facendo nel punto di vista OOP delle cose rispetto a:

Codice Python: class Cat(Animal):

Certo, entrambi definiscono una gerarchia di classi in cui Cat eredita da Animal. Ma ritengo che per un programmatore che ha appena iniziato in OOP, l'applicazione e le implicazioni delle idee di OOP potrebbero rimanere un po 'meglio in Java poiché lo sta spiegando per il programmatore.


1

Stai esplicitamente chiedendo quale sia la lingua più semplice per imparare i concetti di OOP. Penso che la risposta sia chiara: python .

Per mostrare perché questo è il caso, diamo un'occhiata al tipico programma per principianti in Java vs Python. Facciamo un semplice gioco di ipotesi superiore-inferiore.

Giava

In Java, scriverai una lezione di gioco.

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

Sono un programmatore esperto e anche io ho difficoltà. Inoltre, guarda cosa devi spiegare a un potenziale allievo per questo semplice programma:

  • Metodi statici
  • Visibilità (pubblica vs privata). Devi sempre contrassegnare i campi come privati.
  • this. notazione per riferirsi alle variabili quando sono mascherate da altri
  • Il costruttore assomiglia a un metodo, ma non è un metodo.
  • System.outè un outputStream. E sì, è un campo, ma è un staticcampo.
  • A volte, puoi omettere le parentesi graffe se c'è solo un'istruzione
  • String[]è un array. È un tipo speciale di oggetto, ma poi di nuovo, non proprio.
  • intè un tipo primitivo. È speciale.
  • Hai bisogno di molti metodi di framework

Pitone

Python è molto più "puro". Non ci sono tipi primitivi. Non esiste un costruttore, esiste solo un metodo speciale che viene chiamato durante l'inizializzazione.

Non è necessario interagire con la console, poiché si dispone di REPL. Puoi semplicemente giocare usando g.guess(35)e restituendo una stringa.

Ciò semplifica l'apprendimento della lingua e la comprensione dei concetti base di OOP.


0

L'idea di base in OOP è incapsulare (il che significa raggruppare o nascondere) variabili e metodi all'interno delle classi (che python supporta assolutamente). Si tratta di progettare il tuo codice attorno ai nomi. Quindi va avanti da lì.

Mentre ci sono differenze di implementazione (ad esempio, python non supporta la visibilità come fa Java) e differenze di sintassi (in Javascript, devi ereditare i metodi da solo), il design di base rimane lo stesso.

Penso che sia più facile imparare OOP in una lingua come Java, perché la lingua lo richiede e la community è meno avversa rispetto a, diciamo, la community di Python.

Ma ci sono un sacco di scritti sul design e le pratiche OOP là fuori, e leggere non è uno sforzo sprecato. Anche quando scrivo Python (che è molto), scrivo molti oggetti e utilizzo molti oggetti di librerie di terze parti.


L'idea del codice è il passaggio di messaggi. Inoltre nessuna fonte.
Utente

1
OOP non riguarda le lezioni.
Jörg W Mittag,

1
L'idea originale di @Uerer Alan Kay riguardava la messaggistica, ma da allora la pratica di OO si è evoluta in design per nome, o classi di oggetti. Ad esempio, il Dr. Kay ha anche affermato che Java non è orientato agli oggetti, perché non supporta l'associazione tardiva. @ Jorg lol ya ya
Rob,

0

Quando impari OOP in una lingua, inizi a pensare in questa lingua. Il linguaggio influenza ciò che pensi possa essere fatto e come e aggiunge anche un sapore a OOP.

  • Dovrebbe esserci una Garbage Collection?
  • Posso aggiungere metodi agli interi?
  • Uso classi o prototipi?
  • In che modo gli oggetti si riflettono su se stessi?

Alcune persone non possono fare OOP senza lezioni. Alcuni devono uccidere i loro oggetti con il processo.

C'è un nucleo di OOP e le idee originali al riguardo. Puoi dare un'occhiata anche a Smalltalk, Self, Simula, LISP, Newspeak. E anche uno sguardo a tipi di linguaggio non OOP come bash, APL, J. Logical quelli Prolog. Haskell (classi di tipi). Ti insegneranno tutti un pensiero diverso e potresti impararlo

  • OOP non riguarda le lingue imperative
  • OOP non riguarda le lezioni

E alla fine potresti vedere a cosa serve OOP. Almeno avrai un'altra idea al riguardo. Suggerisco di trovare discorsi di Alan Kay .


Se non guardi le lingue questo post è inutile.

Come puoi vedere qui: non possiamo essere d'accordo su cosa sia OOP.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.