Existe alguma diferença em aprender OOP em diferentes linguagens de programação? [fechadas]

9

Eu quero aprender OOP. Conheço Python e sei muito pouco sobre OOP.

Mas quando pesquiso "aprender OOP" nos fóruns, vi um cara dizendo que "Python é tão novo que é por isso que você não pode aprender OOP no Python. Você deve aprender Java e entender OOP no Java"

É verdade? Existe alguma diferença no entendimento do POO em diferentes linguagens de programação? como aprender em Java, C #, C ++, Perl ou Python?

user2783998
fonte
12
"Python é tão novo que é por isso que você não pode aprender OOP no Pyton. Você aprende Java e entende OOP no Java" Isso não faz sentido para mim. Se você quiser aprender OOP usando Python, não vejo nenhuma razão para isso. Vá em frente!
FrustratedWithFormsDesigner
13
Python não é mais antigo que Java? Em cima da minha cabeça, eu acredito que é, mas eu poderia estar fora daqui a alguns anos.
Jimmy Hoffa
2
@JimmyHoffa É de fato. 91 vs. 95 de acordo com a Wikipedia.
Evicatos
2
@ JimmyHoffa: vamos lá, isso não pode ser verdade, pode! Todos sabemos que Java foi a primeira linguagem OO de todos os tempos. "Sun anuncia em voz alta a novidade de Java" ... - Quanto à pergunta ... por que você está determinado a aprender OO? Isso será imposto a você em breve. Python é um excelente ponto de partida para obter insights sobre os benefícios de vários paradigmas de programação.
leftaroundabout

Respostas:

10

Um objeto como construto teórico é muito simples: é uma estrutura que armazena dados, funções ou ambos. A idéia é que essas estruturas têm um senso de "eu" implícito na maioria das linguagens fora do Python. Isso é chamado de "descritor" e fornece ao objeto um ponto de auto-referência que liga dados (variáveis ​​ou campos) e funções (normalmente chamadas de métodos) ao objeto específico em questão. A idéia é que você esteja usando especificamente uma variável ou método que pertença a essa instância específica (bloco de memória alocado normalmente embaixo), em vez de alguma construção maior e mais geral.

Os sistemas de objetos tendem a variar em relação a duas grandes categorias: herança e acesso.

Alguns, como Java ou C ++, declaram classes que agem como "blueprints" para objetos que depois são alocados. Essas classes e seus objetos não podem ser estruturalmente modificados uma vez instanciados. Eles podem ter seu conteúdo substituído no sentido de que as variáveis ​​podem mudar, mas sua estrutura é estática. Você não pode, por exemplo, adicionar novos métodos ao HashMap em Java. Você pode estender a interface (basicamente classes parcialmente implementadas servindo como contratos) ou criar uma subclasse para obter os métodos ou variáveis ​​extras necessários, juntamente com todas as variáveis ​​e métodos originais da classe em questão.

Outras linguagens baseadas em classes, a mais citada como Ruby, permitem abrir facilmente uma classe existente e apenas adicionar métodos como achar melhor. Este é um ponto de discórdia e considerado por muitos como muito, muito perigoso.

Javascript é ainda mais flexível, objetos não passam de uma coleção de slots para variáveis ​​ou funções. Eles podem ser alterados ou substituídos sempre que o programador sentir necessidade de fazê-lo. Eles podem até ser clonados arbitrariamente como "Protótipos" para outros objetos, passando assim todas as suas habilidades.

O controle de acesso é o outro grande ponto de diferença entre os vários idiomas.

Algumas linguagens como Java possuem modificadores de acesso muito rigorosos, como "private" e "protected", que definem exatamente quais classes e subclasses podem usar uma determinada variável ou método.

Outros, como Python, são menos formais, usando a convenção de um sublinhado antes do método ou nome da variável para indicar que ele é privado.

Por fim, o Python é uma linguagem perfeitamente legítima para programar de maneira orientada a objetos, apenas não a aplica de maneira tão rigorosa quanto algumas outras.

Engenheiro Mundial
fonte
Pode ser um pouco técnico demais para esta pergunta.
Zeroth
@zeroth, e muito específico também. O parâmetro 'self' (ou 'this') está longe de ser universal.
Javier
@Javier É por isso que eu disse que é explícito em Python e implícito em outros lugares.
World Engineer
A questão é sobre aprender OOP e acho que discutir como uma linguagem é escrita para realizar certos conceitos, como Encapsulation, onde temos privateJava e sublinhado ( __) para Python, é bastante importante. Eu acho que o nível de abstração do Python pode torná-lo um pouco mais desafiador para um iniciante, mas definitivamente não é impossível. O Java explica o programador, o que pode fazer com que alguns conceitos fiquem um pouco mais fáceis.
Derek W
@ WorldEngineer Não estou falando de ser explícito / implícito (também, Python não é incomum nisso), mas simplesmente de existir como um conceito. Algumas linguagens enviam polimórficamente em todos os parâmetros, não apenas no primeiro. Alguns usam outras dicas para a versão específica, e o estilo principal pode não privilegiar um argumento como 'this'.
21414 Javier
18

Aprender os princípios de POO não é de maneira alguma um idioma específico; portanto, por "aprender POO", você quer dizer "aprender o que significa a terminologia, o que é POO e por que eu quero usá-la", então o idioma não importa.

Se você quer dizer "aprender a desenvolver usando OOP", sim, idiomas diferentes lidam com isso de maneira diferente, mas todos compartilham o mesmo conjunto de princípios. Se você for como eu, aprenderá melhor apenas fazendo isso. Escolha uma linguagem orientada a objetos com um bom tutorial ou livro que cubra os aspectos orientados a objetos e tenha o que precisa. Se você tiver os princípios do design orientado a objetos, poderá usá-los em qualquer outra linguagem OO.

"Python é tão novo que é por isso que você não pode aprender OOP no Pyton. Você aprende Java e entende OOP no Java"

Isso apenas faz minha cabeça doer. Tanta coisa errada amontoada em uma frase.

O Python data de 1989.

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

Java para 1995.

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

Você pode tirar suas próprias conclusões sobre a validade desse conselho ...

Paul Glover
fonte
11
Sim, mas o Python 1.0 não foi até 1994. O Java estava em desenvolvimento por algum tempo antes de ser lançado também. Mas eu concordo que o Python tem OO e você PODE aprender os conceitos de OO. É absurdo dizer o contrário.
Chubbsondubs
2
@chubbsondubs Sim, isso ainda é antes do Java! ;)
Izkata
11
Para fornecer apenas um contraponto leve, o OOP baseado em classe (C ++, Java, Python e muitos outros) é bastante diferente do OOP baseado em protótipo (JavaScript é a única linguagem que conheço que usa isso). Eles ainda são OOP e têm os mesmos fundamentos e cumprem muitos dos mesmos objetivos, mas muitas pessoas consideram as classes parte do que consideram OOP, enquanto o JavaScript não as possui e é definitivamente orientado a objetos.
KRyan
@KRyan: Caso você se importe, há outra linguagem OO baseada em protótipo chamada Self.
Jerry Coffin
O ActionScript possui protótipos e classes.
19414 OrangeDog
8

Eu acho que a pessoa que você está citando estava simplesmente exibindo chauvinismo de linguagem.

Na realidade, há uma diferença entre conceitos de POO e implementação de POO. Poeticamente, isso é melhor entendido quando você tiver uma melhor compreensão de alguns dos conceitos de OOP.

Muitos programadores se sentem confortáveis ​​com apenas algumas linguagens semelhantes, para que não precisem expandir suas capacidades ou sofrer por não serem capazes por um tempo.

Portanto, a questão se resume a: Python realmente ensinará os conceitos de OOP?

Eu direi que você pode, desde que você tenha um suporte de aprendizagem adequado que o incentive a tentar coisas que normalmente não exploraria na aprendizagem auto-dirigida. Um livro ou um mentor de algum tipo seria o melhor. Mark Lutz escreve livros muito detalhados, detalhados e excelentes sobre Python, e eu recomendaria os livros dele, porque eles o pressionam a fazer e aprender mais.

O que você deve se lembrar é que o caminho do Python não é o único caminho, nem o único caminho correto. Quanto mais paradigmas de programação você dominar, melhor será o programador. A maneira como Python faz OOP não é exatamente como C ++ ou Java, mas os conceitos transferem bem.

Zeroth
fonte
4
Em termos de POO, Java e C ++ diferem entre si tanto quanto diferem do Python.
Gort the Robot
Até certo ponto, mas isso se deve em grande parte à alteração do conhecimento de design de linguagem e a diferentes restrições.
Zeroth
E, francamente, 90% dos conceitos de POO transferem-se bem entre eles, quase invisivelmente.
Zeroth
Sim, eu concordo. Acho um pouco engraçado pensar que Java e C ++ são "iguais" em termos de POO.
Gort the Robot
4

Sim, as implementações de POO são muito diferentes. Porém, a teoria e os princípios são os mesmos, mas muitas pessoas consideram apenas "OOP real" o que Java e C ++ fazem, que você obtém muitas referências que deveriam ser "agnósticas de linguagem", mas na verdade assumem linguagens estaticamente baseadas em classe .

Isso não significa que essas referências sejam ruins ou até limitadas; por exemplo, o livro seminal "gang of four" (GoF) "Design Patterns: Elements of Reusable Oriented Object Oriented" é um excelente exemplo de um ótimo trabalho que diz "OOP" quando realmente significa "OOP baseado em classe estática".

Então, na minha opinião: Sim, você pode aprender muito OOP em Python, Javascript, C e muitas outras linguagens; mas algumas pessoas (talvez um futuro empregador) quando solicitam "experiência OOP" significam Java / C ++ / C #. Portanto, seria sensato verificar também essa outra visão.

(e esses não são os únicos dois 'tipos' de POO ....)

Javier
fonte
2
Ironicamente estático, OOP baseado em classe não é o que Alan Key originalmente sugeriu como OOP. Mas um monte de OOP "aprendizagem" é sobre a aprendizagem de concepção / codificação-sentido de que não é estritamente limitado a um determinado implemenation OOP
Daniel Gratzer
2
Também pode fazer sentido olhar para o CLOS: não creio que muitas linguagens / estruturas ofereçam métodos múltiplos.
Giorgio
2
@jozefg: certo, Alan Kay disse uma vez "Na verdade, eu inventei o termo" orientado a objetos "e posso dizer que não tinha C ++ em mente".
Javier
11
@Giorgio Na verdade Dylan pode fornecer uma versão um pouco mais simples de CLOS (nenhuma maneira de especificar quando um multimethod é executado, mas muito mais simples de abordagem)
Daniel Gratzer
4

A Programação Orientada a Objetos é uma idéia sobre como estruturar a linguagem de programação para promover baixo acoplamento, ocultação de informações (também conhecido como encapsulamento), agrupamento de dados e métodos que operam nesses dados juntos e reutilização de código. Muitas linguagens implementam sua opinião sobre essas idéias, para que haja variações entre as linguagens sobre como elas abordam a Orientação a Objetos. Por exemplo, Java permite apenas que uma classe estenda 1 classe. No entanto, Python e C ++ permitem estender qualquer número de classes. Java possui razões específicas para suas limitações. Limitações destinadas a corrigir coisas do C ++, mas também porque o Smalltalk suporta apenas uma única classe base.

Os idiomas OO podem ser agrupados em duas famílias. A família Smalltalk (ou OOP baseada em classe) inclui C ++, Java, Smalltalk, Ruby, C #, Python, para citar alguns (existem muitos nessa família). Essas são uma mistura de linguagens de tipo estaticamente e dinamicamente e, embora diferam um pouco em alguns conceitos, são muito semelhantes na maneira como pensam sobre OOP. O que quero dizer com isso é como eles abordam o acoplamento, o encapsulamento, os dados e métodos de ligação e a reutilização de código e as ferramentas que eles fornecem para você fazer isso. Dentro dessa família, muitos dos conceitos são os mesmos.

A outra família é a OOP baseada em protoype. Esses idiomas parecem muito diferentes na implementação do POO. Provavelmente, o exemplo mais conhecido disso é o Javascript, mas o Javascript copiou essas idéias do Scheme e Object LISP. Esses são idiomas menos conhecidos e tipicamente digitados dinamicamente. Não consigo pensar em uma linguagem baseada em protótipo estaticamente tipada, mas isso não significa que não exista uma. Você pode ler aqui: http://en.wikipedia.org/wiki/Prototype-based_programming . O ponto é que eles abordam a OOP de uma maneira muito diferente das linguagens baseadas em classes. Isso significa que os conceitos não são tão portáteis entre essas duas famílias. Só porque você conhece OO em uma família, não significa que você passará essas ideias facilmente para a outra família.

Lembre-se de que a maioria das linguagens de programação combina conceitos de muitas idéias. Python e Ruby incorporam idéias de programação funcional e OOP em suas linguagens. E você pode misturar OO baseado em protótipo com certas extensões para linguagens baseadas em classes, tornando-o ainda mais complexo.

chubbsondubs
fonte
Eu não contaria C ++ na família Smalltalk. O Smalltalk é baseado no Simula, e Alan Kay deliberadamente ignorou a maioria das alterações no Simula-II, enquanto o C ++ é baseado nisso. O C # é estranho, foi projetado por usuários de C ++ e designers de Pascal para se parecer com Java.
Jörg W Mittag
1

OOP é um princípio de programação - é fundamentalmente uma ideia. A implementação do POO varia ao longo das linguagens de programação - mas os pilares (Abstração, Herança, Encapsulamento e Polimorfismo) do POO geralmente estão presentes de alguma forma ou forma.

Eu direi, sem preferência para nenhuma das linguagens, que o Java pressiona a semântica um pouco mais sobre o programador do que o Python.

Por exemplo,

Código Java: class Cat extends Animal {}

É um pouco mais óbvio do que você está fazendo no ponto de vista das OOP do que:

Código Python: class Cat(Animal):

Claro que ambos definem uma hierarquia de classes na qual Cat herda de Animal. Mas eu sinto que, para um programador que está começando no OOP, a aplicação e as implicações das idéias do OOP podem ficar um pouco melhores em Java, uma vez que são explicadas para o programador.

Derek W
fonte
1

Você está perguntando explicitamente qual é o idioma mais fácil para aprender os conceitos de POO. Eu acho que a resposta é clara: python .

Para mostrar por que esse é o caso, vejamos o programa iniciante típico em Java vs Python. Vamos fazer um simples jogo de adivinhar mais alto-baixo.

Java

Em Java, você escreverá uma classe de jogo.

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?
        }
    }
}

Sou um programador experiente e até estou tendo dificuldades. Além disso, observe o que você precisa explicar a um aluno em potencial para este programa simples:

  • Métodos estáticos
  • Visibilidade (pública x privada). Você deve sempre marcar os campos como privados.
  • this. notação para se referir a variáveis ​​quando elas são mascaradas por outras pessoas
  • O construtor se assemelha a um método, mas não é um método.
  • System.outé um outputStream. E sim, é um campo, mas é um staticcampo.
  • Às vezes, você pode omitir os colchetes se houver apenas uma instrução
  • String[]é uma matriz. É um tipo especial de objeto, mas, na verdade, não é verdade.
  • inté um tipo primitivo. É especial.
  • Você precisa de muitos métodos de estrutura

Pitão

Python é muito mais "puro". Não há tipos primitivos. Um construtor não existe, existe apenas um método especial chamado na inicialização.

Você não precisa interagir com o console, pois possui um REPL. Você pode simplesmente jogar usando g.guess(35)e retornando uma string.

Isso facilita o aprendizado e a compreensão dos conceitos básicos de POO.

parasietje
fonte
0

A idéia central do OOP é encapsular (o que significa agrupar ou ocultar) variáveis ​​e métodos juntos dentro de classes (que o python suporta absolutamente). Trata-se de projetar seu código em torno dos substantivos. Então isso meio que continua a partir daí.

Embora existam diferenças de implementação (por exemplo, python não oferece suporte à visibilidade da mesma forma que Java) e diferenças de sintaxe (em Javascript, você mesmo deve herdar métodos), o design básico permanece o mesmo.

Eu acho que é mais fácil aprender OOP em uma linguagem como Java, no entanto, porque a linguagem exige isso e a comunidade é menos adversa do que, digamos, a comunidade python.

Mas existem muitos textos sobre design e práticas de POO por aí, e ler não é um esforço desperdiçado. Mesmo quando escrevo python (o que é muito), escrevo muitos objetos e uso muitos objetos de bibliotecas de terceiros.

Roubar
fonte
A ideia do código é passar mensagens. Também não há fonte.
Utilizador
11
OOP não é sobre classes.
Jörg W Mittag
11
A idéia original do usuário Alan Kay era sobre mensagens, mas desde então a prática do OO evoluiu para design por substantivo ou classes de objetos. Por exemplo, o Dr. Kay também opinou que o Java não é orientado a objetos, porque não suporta ligação tardia. @ Jorg lol ya ya
Rob
0

Quando você aprende OOP em um idioma, você começa a pensar nesse idioma. A linguagem influencia o que você acha que pode ser feito e como e também adiciona um sabor ao POO.

  • Deve haver uma coleta de lixo?
  • Posso adicionar métodos a números inteiros?
  • Eu uso classes ou protótipos?
  • Como os objetos refletem sobre si mesmos?

Algumas pessoas não podem fazer POO sem aulas. Alguns devem matar seus objetos com o processo.

Há um núcleo de OOP e as idéias originais sobre ele. Você pode dar uma olhada também em Smalltalk, Self, Simula, LISP, Newspeak. E também uma olhada em tipos de linguagem não OOP, como linguagens de fluxo de dados bash, APL, J. Logical ones Prolog. Haskell (classes de tipo). Todos eles vão ensinar um pensamento diferente e você pode aprender que

  • OOP não é sobre linguagens imperativas
  • OOP não é sobre classes

E, no final, você pode ver para que serve o POO. Pelo menos você terá outra idéia sobre isso. Sugiro encontrar palestras de Alan Kay .


Se você não olhar para os idiomas, este post é inútil.

Como você pode ver aqui: Não podemos concordar sobre o que é OOP.

Do utilizador
fonte