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?
java
object-oriented
python
user2783998
fonte
fonte
Respostas:
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.
fonte
private
Java 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.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.
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 ...
fonte
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.
fonte
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 ....)
fonte
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.
fonte
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.
fonte
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.
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:
this.
notação para se referir a variáveis quando elas são mascaradas por outras pessoasSystem.out
é um outputStream. E sim, é um campo, mas é umstatic
campo.String[]
é uma matriz. É um tipo especial de objeto, mas, na verdade, não é verdade.int
é um tipo primitivo. É especial.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 usandog.guess(35)
e retornando uma string.Isso facilita o aprendizado e a compreensão dos conceitos básicos de POO.
fonte
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.
fonte
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.
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
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.
fonte