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

10

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

Ma quando cerco "learn OOP" nei forum ho visto un ragazzo dire che "Python è così nuovo che è perché non puoi imparare OOP su Python, dovresti imparare Java quindi capire OOP su Java"

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

    
posta user2783998 18.02.2014 - 22:21
fonte

9 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 "sé" che è implicito nella maggior parte delle lingue al di fuori di Python. Questo è chiamato "descrittore" e fornisce all'oggetto un punto di riferimento personale che lega dati (variabili o campi) e funzioni (in genere chiamati metodi) al particolare oggetto in questione. L'idea è che stai usando specificatamente una variabile o un metodo che appartiene a quell'istanza particolare (il blocco di memoria assegnato in genere sottostante) piuttosto che a un costrutto più grande e più generale.

I sistemi oggetto tendono a variare in relazione a due grandi categorie: ereditarietà e accesso.

Alcuni, come Java o C ++, dichiarano classi che fungono da "blueprints" per oggetti che poi vengono allocati. Queste classi e i loro oggetti non possono essere modificati strutturalmente una volta istanziati. Possono avere il contenuto sovrascritto 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 le classi parzialmente implementate che fungono da contratti) o creare una sottoclasse per ottenere i metodi o le variabili aggiuntivi necessari con tutte le variabili e i metodi originali della particolare classe in questione.

Altre lingue basate sulla classe, la più tipicamente citata essendo Ruby, ti permettono di aprire facilmente una classe esistente e aggiungere solo i metodi come meglio credi. Questo è un pomo della discordia e considerato da molti molto, molto pericoloso.

Javascript è ancora più flessibile, gli oggetti non sono altro che una collezione 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, passando così tutte le loro abilità su.

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

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

Altri, come Python, sono meno formali, usando la convenzione di un trattino basso 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, ma non lo applica in modo rigoroso come alcuni degli altri.

    
risposta data 19.02.2014 - 00:13
fonte
19

Imparare i principi OOP non è affatto un linguaggio specifico, quindi se "impari OOP" intendi "apprendi cosa significa la terminologia, cos'è OOP e perché potrei volerlo usare", quindi il la lingua non ha importanza.

Se intendi "impara a sviluppare usando OOP" allora sì, lingue diverse lo gestiscono diversamente, 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 un libro che copra gli aspetti orientati agli oggetti e ad esso. Se hai i principi del design orientato agli oggetti, sarai in grado di usarli in qualsiasi altro linguaggio OO.

"Python is so new that's why you can't learn OOP on Pyton. you learn Java then understand OOP on Java"

Questo mi fa solo male alla testa. Così tanto sbagliato stipato in una sola frase.

Date di Python del 1989.

link

Java al 1995.

link

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

    
risposta data 18.02.2014 - 23:09
fonte
9

Penso che la persona che stai citando stava semplicemente mostrando lo sciovinismo linguistico.

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

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

Quindi la domanda si riduce a, in realtà, Python ti insegnerà i concetti di OOP?

Dirò che puoi, a patto che tu abbia un adeguato supporto per l'apprendimento che ti spinga a provare cose che normalmente non esploreresti nell'apprendimento autodiretto. Un libro o un mentore di qualche tipo sarebbe il migliore. Mark Lutz scrive su Python libri molto approfonditi, molto dettagliati e molto eccellenti, e raccomanderei i suoi libri perché ti spingono a fare e ad imparare di più.

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

    
risposta data 18.02.2014 - 22:53
fonte
5

Sì, le implementazioni OOP sono molto diverse. La teoria e i principi sono gli stessi però, ma così tante persone considerano solo "OOP reale" ciò che fanno Java e C ++, che si ottengono molti riferimenti che dovrebbero essere "indipendenti dal linguaggio", ma in realtà si assumono linguaggi basati su classi, tipizzati staticamente .

Questo non significa che i riferimenti siano cattivi, o anche limitati; per esempio, il libro di "gang of four" (GoF) "Patterns di progettazione: elementi di software orientato agli oggetti riutilizzabili" è 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 molte cose OOP su Python, Javascript, C e molti altri linguaggi; 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 ....)

    
risposta data 18.02.2014 - 22:34
fonte
4

La programmazione orientata agli oggetti è un'idea su come strutturare il linguaggio di programmazione per favorire l'accoppiamento basso, l'occultamento delle informazioni (noto anche come incapsulamento), il raggruppamento di dati e metodi che operano insieme su questi dati e il riutilizzo del codice. Molte lingue implementano la loro presa su queste idee così ci sono variazioni tra le lingue su come si avvicinano all'Obiettivo Orientamento. 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 ragioni specifiche 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 di classe) delle lingue include C ++, Java, Smalltalk, Ruby, C #, Python per citarne alcuni (ci sono tonnellate in questa famiglia). Questi sono un mix di linguaggi di tipo staticamente e dinamicamente e mentre differiscono leggermente su alcuni concetti sono molto simili nel modo in cui pensano a OOP. Quello che intendo è che si avvicinano all'accoppiamento, all'incapsulamento, ai dati e ai metodi vincolanti, al riutilizzo del codice e agli strumenti che forniscono per farlo. All'interno di questa famiglia molti concetti sono uguali.

L'altra famiglia è l'OOP basato sul protoipo. Questi linguaggi hanno un aspetto molto diverso nella loro implementazione OOP. Probabilmente l'esempio più noto di questo è Javascript, ma Javascript ha copiato queste idee da Scheme e Object LISP. Si tratta di lingue meno conosciute e tipicamente tipizzate dinamicamente. Non riesco a pensare a un linguaggio basato su prototipo tipicamente, ma questo non significa che non ce ne sia uno. Puoi leggerlo qui: link . Il punto è che si avvicinano all'OOP in un modo molto diverso rispetto ai linguaggi basati sulla classe. Ciò significa che i concetti non sono così portatili tra queste due famiglie. Solo perché conosci OO in una famiglia non significa che potrai facilmente trasferire quelle idee all'altra famiglia.

Ricorda che la maggior parte dei linguaggi di programmazione mescola concetti e molte idee. Python e Ruby incorporano entrambe le idee di programmazione funzionale e OOP nelle loro lingue. E puoi unire OO basato su prototipo con determinate estensioni ai linguaggi basati sulla classe, quindi è ancora più complesso.

    
risposta data 19.02.2014 - 02:46
fonte
1

OOP è un principio di programmazione - è fondamentalmente un'idea. L'implementazione di OOP varia attraverso i linguaggi di programmazione, ma i pilastri (Abstraction, Inheritance, Encapsulation e Polymorphism) di OOP sono solitamente presenti in qualche modo o forma.

Dirò senza preferenza a nessuno dei due linguaggi, che Java spinga la semantica un po 'più sul programmatore che dire Python.

Ad esempio,

Codice Java: class Cat extends Animal {}

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

Codice Python: class Cat(Animal):

Certo entrambi definiscono una gerarchia di classi in cui Cat eredita da Animal. Ma penso che per un programmatore che sta appena iniziando in OOP, l'applicazione e le implicazioni delle idee OOP potrebbero essere un po 'migliori in Java, dal momento che sta spiegando il programmatore.

    
risposta data 19.02.2014 - 04:09
fonte
1

Stai chiedendo esplicitamente qual è il linguaggio più semplice per imparare i concetti 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 indovinare più in alto.

Java

In Java, scriverai una classe 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 delle difficoltà. Inoltre, guarda cosa devi spiegare a un potenziale alunno per questo semplice programma:

  • Metodi statici
  • Visibilità (pubblico vs privato). Devi sempre contrassegnare i campi come privati.
  • notazione this. per il riferimento alle variabili quando sono mascherate da altri
  • Il costruttore è simile a un metodo, ma non è un metodo.
  • System.out è un outputStream. E sì, è un campo, ma è un campo static .
  • A volte, puoi omettere le parentesi graffe se c'è una sola istruzione
  • String[] è un array. È un tipo speciale di oggetto, ma poi di nuovo, non proprio.
  • int è un tipo primitivo. È speciale.
  • Sono necessari molti metodi di framework

Python

Python è molto "più puro". Non ci sono tipi primitivi. Un costruttore non esiste, c'è solo un metodo speciale chiamato all'inizializzazione.

Non hai bisogno di interagire con la console, dato che hai REPL . Puoi semplicemente giocare usando g.guess(35) e restituendo una stringa.

Ciò facilita l'apprendimento della lingua e afferra i concetti di base dell'OOP.

    
risposta data 19.02.2014 - 15:27
fonte
0

L'idea centrale in OOP è incapsulare (il che significa raggruppare o nascondere) le variabili e i metodi insieme all'interno delle classi (che Python supporta assolutamente). Si tratta di progettare il tuo codice su Nouns. Quindi continua da lì.

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

Penso che sia più semplice imparare OOP in un linguaggio come Java, perché la lingua lo richiede e la comunità è meno avversa ad essa rispetto, ad esempio, alla comunità python.

Ma ci sono tonnellate di scritti sul design e sull'amplificazione OOP; pratica là fuori, e leggere non è uno sforzo inutile. Anche quando scrivo Python (che è molto), scrivo molti oggetti e uso molti oggetti da librerie di terze parti.

    
risposta data 18.02.2014 - 23:58
fonte
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 tocco a OOP.

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

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

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

  • OOP non riguarda le lingue imperative
  • OOP non riguarda le classi

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 l'OOP.

    
risposta data 19.02.2014 - 10:22
fonte

Leggi altre domande sui tag