Benefícios do OOP clássico sobre o idioma Go-like

13

Eu tenho pensado muito sobre design de linguagem e quais elementos seriam necessários para uma linguagem de programação "ideal", e o estudo do Google's Go me levou a questionar muitos conhecimentos comuns.

Especificamente, o Go parece ter todos os benefícios interessantes da programação orientada a objetos sem realmente ter a estrutura de uma linguagem orientada a objetos. Não há classes, apenas estruturas; não há herança de classe / estrutura - apenas incorporação de estrutura. Não há hierarquias, classes-pai ou implementações explícitas de interface. Em vez disso, as regras de conversão de tipo baseiam-se em um sistema flexível semelhante à digitação de pato, de modo que, se uma estrutura implementa os elementos necessários de um "Leitor" ou "Solicitação" ou "Codificação", é possível convertê-lo e usá-lo como um.

Existe algo sobre o OOP implementado em C ++ e Java e C # que é inerentemente mais capaz, mais sustentável, de alguma forma mais poderoso que você precisa desistir ao mudar para uma linguagem como Go? Que benefício você tem que desistir para ganhar a simplicidade que esse novo paradigma representa?

EDIT
Removida a pergunta "obsoleta" pela qual os leitores pareciam ficar excessivamente pendurados e enfurecidos.

A questão é: o que o paradigma tradicional orientado a objetos (com hierarquias e coisas semelhantes), como freqüentemente visto em implementações de linguagem comum, tem a oferecer, que não pode ser feito tão facilmente neste modelo mais simples? Ou, em outras palavras, se você fosse projetar uma linguagem hoje, existe algum motivo para incluir o conceito de hierarquias de classe?

tylerl
fonte
1
OOP tornou a programação processual obsoleta? Detesto parecer pedante ou estou falando com você, mas essa foi a primeira frase que me veio à mente. Go fornece um novo (ish) paradigma. Com a experimentação, os usuários descobrirão no que é bom e no que não é bom (como em todos os paradigmas e idiomas), e terminaremos com centenas de ótimos produtos (junto com sua parcela justa de produtos ruins) escritos em Go . Pelo menos, essa é a minha opinião #
Jamie Taylor
1
Existem algumas leituras interessantes quando o Google for OOP está morto . Eu recomendo a web vai morrer quando Morre OOP
Andomar
Existe um valor tão pequeno no POO que não vale a pena desperdiçar seu tempo.
SK-logic
1
Eu concordo com o comentário anterior não se concentre muito em OOP. Além de OOP, não significa C ++ ou Java. Tente ler abit em ltu.org
AndreasScheinert
C ++, Java e C # não são linguagens OOP "clássicas". Se existe uma linguagem clássica de POO, acho que é Smalltalk.
kevin Cline

Respostas:

16

Não há novo paradigma. A orientação a objetos é um padrão usado para escrever programas, que nem é claramente definido. Várias linguagens fornecem vários traços típicos da orientação a objetos (definição de novos tipos, encapsulamento, hierarquias de tipos, polimorfismo, passagem de mensagens e mais), mas podem falhar em fornecer outros. Nesses casos, cabe aos programadores imitá-los, se necessário.

Muitas das linguagens que fornecem esses recursos não possuem um análogo ao conceito de classe - por exemplo, Javascript e Common Lisp. A implementação fornecida por linguagens do tipo Java (baseada em classe, com herança única, interfaces, envio baseado em tipo) é apenas uma das possibilidades, e não necessariamente a melhor.

Andrea
fonte
11
+1 para "não necessariamente o melhor". Citando Alan Kay: "Inventei o termo Orientado a Objetos e posso dizer que não tinha C ++ em mente". (nem ele tinha C # e / ou Java, eu suponho humildemente) #
1911
1
@herby Eu vi sugerir que os sistemas de agentes (semelhantes à maneira como Erlang funciona) estão mais próximos da intenção final de Alan Kay para OOP.
CodexArcanum
2
Er, Common Lisp definitivamente tem aulas. Porém, normalmente, uma classe CL contém dados e métodos são definidos em "funções genéricas". Como efeito colateral, isso oferece uma maneira conveniente de realizar vários despachos, pois os métodos não são mais acoplados a "uma única classe de implementação".
Vatine 19/06/12
Sim, o que eu quis dizer é que ele não tem aulas no sentido de Java
Andrea
5

Que benefício você tem que desistir para ganhar a simplicidade que esse novo paradigma representa?

A verificação de tipo para um sistema de tipo estrutural é muito mais complexa do que simplesmente verificar se a classe base está na sua lista de herança. O despacho virtual se torna um pouco mais complicado e provavelmente com menos desempenho.

Esse sistema obsoleta o conceito de POO?

Não. Desde que você possa criar o programa em termos de 'objetos que fazem coisas', em vez de uma lista de instruções, um conjunto declarado de regras ou uma série de funções em cascata ... a implementação não importa. Da mesma forma, alterar o sistema de tipos não invalida nenhum dos princípios comuns de OO.

Você ainda pode trabalhar em um tipo base e não se importar com o tipo real. Você ainda pode estender os tipos sem modificá-los. Você ainda pode fazer um tipo fazer apenas uma coisa. Você ainda pode fornecer interfaces refinadas. Você ainda pode fornecer abstrações para seus tipos.

Como uma linguagem permite isso realmente não importa.

Telastyn
fonte
Na verdade, Go faz todas essas OOP coisas mais fáceis e adiciona algumas possibilidades extras como estender um tipo para fornecer nova interface de aplicação para instâncias existentes (desde que você não precisa de novos membros de dados, é claro).
Jan Hudec
4

Eu acho que sua idéia sobre OOP está um pouco errada:

Eu inventei o termo 'Programação Orientada a Objetos' e este {Java e C ++} não é o que eu tinha em mente.
- Alan Kay .

A escolha da digitação (subtipo nominativo, subtipo estrutural ou tipagem de pato - ou uma combinação desses) é amplamente ortogonal ao POO. Herança e classes são inteiramente ortogonais ao POO. Se você dedicar algum tempo para brincar com io , verá isso.

Agora você pode perguntar que tipo de sistemas de tipos é "melhor" e quais são os meios de reutilização e combinação de códigos. E tente determinar as vantagens e desvantagens entre as opções feitas no Simula (e posteriormente executadas em C ++, Java e C #) e as feitas no Go. Mas essas são questões diferentes e distintas.

Por fim, OOP é um conceito muito vago e todas as tentativas de implementá-lo vêm em uma enorme variedade de sabores. Mas, para realmente simplificar as coisas, eu diria que a idéia central do OOP é compor sistemas de subsistemas SOLID . Agora, isso confunde absolutamente outros paradigmas, mas eu especularia que essa é a razão pela qual as linguagens multiparadigmas aumentaram em popularidade recentemente e por que o Google fez sua própria tentativa com o Go.

back2dos
fonte
2
A questão pertence aos conceitos, não sendo necessário o termo. Se você pode criar um nome melhor que "OOP" para se referir ao conceito de hierarquias de classe e a todos os recursos que o acompanham, podemos usá-lo.
tylerl
@tylerl: Você está confundindo pelo menos duas perguntas em uma. Uma é se a subtipo estrutural é melhor que a subtipo nominativo. O outro é basicamente se a composição é melhor que a herança. Essas perguntas são mutuamente ortogonais. Eu acho que, no final das contas, a "melhor" linguagem não faz essa escolha para você. Eu especularia que o Go simplesmente tem um conjunto diferente de problemas, mas veremos se o Google adiciona esses recursos "de volta" ou não.
back2dos
Gostaria apenas de uma linguagem que possua a maioria dos recursos do C ++, mas que seja menor e mais simples. C ++ é a única linguagem, exceto C, realista para kernels, e fornece ferramentas extremamente úteis, como destruidores e STL. E o importante princípio "se você não o usa, não paga". OO, usado corretamente, é extremamente poderoso. Mas genéricos e outros conceitos não relacionados a OO também são de vital importância. C não lhe dá quase nada e Go joga fora o OO real para algumas idéias estranhas e novas.
Erik Alapää
1

OOP não é obsoleto.

Como Andrea disse, existem muitos conceitos propostos como uma alternativa para as aulas (por exemplo: haskell typeclass). OOP tem um grande benefício: é ensinado em muitos lugares, e a cultura do OOP é amplamente compartilhada entre os desenvolvedores.

Isso permite uma comunicação mais rica dentro de uma equipe. Pode-se falar sobre fábricas mais facilmente do que sobre pré-promorfismos zigo-histomórficos . OOP estrutura a maneira como você organizará e se comunicará sobre seu programa com diagramas comumente usados. Este é um ativo poderoso.

Simon Bergot
fonte
1
Eu penso: isso aconteceu em muitos lugares. Não é uma vantagem, na verdade.
AndreasScheinert
@AndreasScheinert, por que não seria uma vantagem?
Simon Bergot
Porque para fazer um julgamento, você deve saber pelo menos 1 alternativa igualmente boa. É uma questão de hábito, as pessoas gostam de ficar em sua zona de conforto e isso leva à estagnação.
AndreasScheinert
O @AndreasScheinert usa a ferramenta certa para o trabalho. Oop não funciona para todos os cenários .... não tem nada a ver com a sua zona de conforto
pqsk
1

Não, não há nada novo aqui, nem o OOP está obsoleto. O C ++ também possui interfaces implícitas na forma de modelos, mas as pessoas ainda usam funções virtuais. Você precisa de interfaces explícitas para lidar com, por exemplo, interfaces binárias ou interfaces em que o outro código simplesmente não é conhecido no momento da compilação.

Você poderia argumentar que este é simplesmente um caso de inferência versus afirmação explícita, que não é nada como um "novo paradigma" e realmente apenas mais conveniente.

DeadMG
fonte