Durante anos, venho fazendo coisas algorítmicas, escrevendo estruturas de dados escaláveis para pesquisa na Internet, por exemplo, Árvores de Pesquisa Binária Aleatória para Recomendação Automática, BitMaps, Algoritmos baseados em Sabedoria de Multidão usando Gráficos, escrevendo alguns Algoritmos de Aprendizado de Máquina interessantes como Clustering, Detecção de Anomalias, trabalhando em coisas de recuperação de informações e assim por diante
Há uma coisa comum nas coisas que mencionei acima. Todo o material acima, cada um se codificado em uma linguagem como C ++, requer um punhado de classes. Quero dizer, são problemas interessantes, mas não são complexos em termos de material Orientado a Objetos muito carregado. Eu nunca usei Herança, material virtual etc. Embora eu tenha usado muito a Programação Genérica, Modelos e assim por diante.
Eu amo C ++ (- coisas volumosas de OO, como eu gosto do que Joe Armstrong, criador de Erlang diz: No mundo de OO, se você pedir uma banana, você terá uma grande selva junto com um gorila segurando a banana). Eu gosto de codificar em outras linguagens como Java, Python também.
Agora, minha pergunta é: estou gostando do tipo de projeto / algoritmo em que estou trabalhando. Preciso realmente aprender coisas sobre OO; serei um melhor codificador / designer apenas usando coisas como herança, polimorfismo dinâmico (virtuais)? OU posso mudar para o mundo da Programação Funcional (ainda não o fiz até agora), o que me atrai mais, pois posso me concentrar apenas em tarefas / algoritmos e não deixar que o material baseado em OO do Kingdom Of Noun, tem-a, é uma regra mim?
Em suma, as coisas OO podem / podem me ajudar em todos os tipos de projetos / algoritmos que mencionei acima?
EDITAR:
Um link extremamente interessante para adicionar aqui:
http://steve-yegge.blogspot.in/2006/03/execution-in-kingdom-of-nouns.html
Respostas:
A programação orientada a objetos é realmente boa para esconder suas complexas coisas matemáticas de fantasia por trás de palavras fáceis de entender e facilitar para que os menos importantes entre vocês usem realmente o que você escreveu. Ele não substitui a programação funcional ... apenas oferece uma maneira muito fácil de mudar implementações ou adicionar comportamento.
No seu exemplo de Árvores de pesquisa binária aleatória acima, e se você recebesse o requisito de que no dia da mentira de abril, o Randomizer fosse substituído por um pedido por distância de três patetas? É realmente útil criar
StoogeBinaryTree : RandomBinaryTree
e substituir oprotected int GetSortOrder (Tree a, Tree b)
método. Assim, em 2 de abril, você pode mudar a implementação de volta para oRandomBinaryTree
sem precisar alterar nenhum código.Em um exemplo simples, mostrei a adição de um pouco de comportamento e a alternância de implementação ...
fonte
Se você vai fazer FP ainda com idiomas como Haskell e Erlang que fazem isso bem, não há necessidade de beber o refrigerante OOP. FP É muito poderoso e pode fazer muito, mesmo no mundo real
Dito isto, aprender uma língua OOP não seria uma coisa ruim. Compreender várias maneiras de programar e várias metodologias funcionará a seu favor. Além disso, se você mudar de Haskell ou Erlang para Java, poderá se perguntar como é que alguém pode trabalhar sem um REPL e lambdas.
fonte
Parece que você se concentrou apenas em resolver um único problema de cada vez, ou seja, escrever algoritmos. Mas considere como você escreveria um aplicativo GUI, por exemplo, ou algum outro aplicativo enorme que seja possível, requer que você use muito do seu algoritmo. Nesse caso, conhecer o OO será essencial, pois ele ajudará a simplificar seu código para torná-lo mais legível e fácil para outros desenvolvedores usarem, por exemplo, criando uma biblioteca que possa ser carregada como um objeto.
Um dos padrões de design mais importantes da Programação Orientada a Objetos é o Padrão de Estratégia , que no cenário acima também o ajudará bastante. Considere um exemplo em que o usuário apresentaria uma entrada na qual você permitiria que ele executasse um algoritmo. Isso pode ser facilmente uma construção confusa de if / else ou switch / case. Criando uma interface comum para seu algoritmo e usando o Padrão de Estratégia, seu código seria muito mais flexível, legível, mais fácil de estender e, portanto, mais fácil de manter.
fonte
A abordagem orientada a objetos se tornou bem-sucedida por causa de um aspecto crucial: permite lidar com sistemas de complexidade essencial significativa sem introduzir muita complexidade acidental . Isso pode ser quase ignorado quando você trabalha em sistemas domésticos, mas se torna muito importante quando você cria sistemas em grande escala.
Os elementos-chave da abordagem orientada a objetos podem ser explicados a um programador com ampla exposição à programação procedural em questão de dias, o que ajudou a técnica a ganhar popularidade rapidamente (isso não significa que você pode se tornar um especialista em um alguns dias: é semelhante a aprender xadrez - você pode aprender a mover suas peças em menos de dez minutos, mas leva anos para dominar o jogo).
Técnicas de programação funcional estão ganhando mais importância com a introdução do suporte a idiomas nas linguagens convencionais (lambdas e delegados anônimos de C #, lambdas de C ++ e até classes anônimas de Java, até certo ponto). É muito útil entender essas técnicas, mas elas são projetadas para resolver problemas mais localizados na escala tática . As técnicas orientadas a objetos, por outro lado, permanecem relevantes na escala estratégica , especialmente no contexto de equipes maiores.
fonte
Faça a programação funcional, será uma experiência muito boa para você, mesmo se você decidir não continuar. Como você pode ler algumas das respostas aqui, muitas pessoas nem sabem o que é.
Conceitos de linguagens funcionais, por exemplo, avaliação lenta e transparência referencial, são uma coisa muito muito boa para aprender. Especialmente se você gosta de recursão.
por exemplo:
é uma função haskell muito simples que se repete através de uma lista e calcula o comprimento. Se você estiver interessado em números maiores que longos e quiser usar Listas infinitas e outras coisas sofisticadas, experimente a programação funcional.
fonte
length
. Uma maneira diferente (mais eficaz e mais próxima de como os programas de FP não triviais são realmente escritos) pode estar dando algumas dobras no valor inicial0
e na função de etapaacc -> acc + 1
. Alternativamente,sum . map (const 1)
lê bem.length
construído sobre osfold
s não-estritos fazem isso).persistent
), tratamento de erros (acimaMaybe
/Either
), malabarismo de estado (acimaState
), travessias de árvore (acimaMap
/Set
), etc., mas descrever minha intenção em termos de funcionalidade de nível superior é melhor em praticamente todos os aspectos e, portanto, também o que o FP faz na prática.Como outros já disseram, a orientação a objetos é o paradigma dominante na indústria. Você disse que trabalhou principalmente com programas que podem ser abordados por várias classes, mas em um aplicativo industrial existem centenas ou milhares de casos de uso que precisam ser abordados e a orientação a objetos se mostrou muito confiável. e uma maneira amplamente compreensível de estruturar essas grandes bases de código.
Você fala sobre programação funcional, que é um sólido candidato ao The Next Big Paradigm, mas o FP ainda não é familiar no setor. Especialmente como você é um programador de C ++, você deve saber que o setor pode ser conservador e o mundo de C / C ++, com ênfase no desempenho, é um lugar onde a natureza imperativa do hardware é vista como uma consideração muito real. Em geral, programadores de sistemas embarcados são extremamente céticos em relação à FP, na minha experiência.
Mesmo se FP faz se tornar um paradigma mais dominante na indústria, é certamente o caso que ele vai ter sucesso na forma de linguagens híbridas de objetos funcionais como F # e Scala e não na forma de "puros" línguas FP, como Haskell.
Tudo isso é para dizer que sim, as "coisas" orientadas a objetos são importantes para as bases de código profissionais e sua carreira.
fonte
OO ganhou força porque foi uma grande melhoria para lidar com a complexidade, como antes também era a programação estruturada / processual.
Os benefícios do uso de OO aumentam à medida que o tamanho do projeto aumenta. Para um programa 1KLOC, não importa muito qual paradigma você use, todos eles funcionarão bem. Porém, para um programa de 200KLOC +, simplesmente não existe concorrência viável para OO. Isso não significa que você não pode escrever um programa de 200KLOC em C, apenas que precisará ser muito mais disciplinado para evitar acabar com uma bagunça que ninguém (nem você) pode entender. Isso não significa que o OO evitará essa bagunça, apenas facilitará sua vida para evitá-la.
A programação funcional é um paradigma que se desvia um pouco do padrão anterior, porque não veio para ajudar a lidar com ainda mais complexidade do que o OO, mas para resolver um tipo diferente de problemas: a programação paralela. Essa foi a primeira vez, também, que um paradigma de programação tentou fazê-lo: todos os mecanismos que existiam anteriormente no OO e / ou SP / PP não faziam parte do paradigma, mas apenas entidades do SO (threads, mutexes etc.) encapsulado de acordo com as regras do paradigma.
Nesse sentido, o FP é muito mais natural que os outros, mas isso tem o custo de reverter a maneira como geralmente pensamos sobre os problemas. E devido a isso, ele tem uma capacidade limitada de lidar com a mesma complexidade na mesma escala que o OO.
Meu palpite é que isso limitará a adoção do PF em um futuro próximo a sistemas muito especializados, em geral não muito grandes, ou seções especializadas de sistemas maiores. E o resto ainda será feito usando OO. Qual das pessoas que você planeja desenvolver (ou aprender sobre o desenvolvimento) determinará qual deve ser seu foco de aprendizado, a IMO.
fonte
Indiscutivelmente, os modelos são simplesmente uma forma diferente de POO. Funções virtuais e herança explícita têm uma intercambiabilidade binária em tempo de execução de caso de uso específica. Modelos são intercambiáveis em tempo de compilação. No entanto, no nível mais básico, eles oferecem a mesma abstração de recurso sobre qualquer tipo que ofereça a interface correta. O uso excessivo da herança em tempo de execução é um cheiro significativo ao código e, nesse caso, eu concordo com você - simplesmente não é necessário por grande parte do tempo.
Esses dois trechos são efetivamente idênticos, mesmo que um use modelos exclusivamente e o outro use herança e classes em tempo de execução como implementação. Ambos abstraem a função que você está chamando. Esta é trivialmente óbvio quando você substituir
T
parastd::function<void(int)>
, por exemplo. A única diferença é a hora em que essa abstração é feita. A versão do modelo é excelente para funções estd::function
geralmente é melhor como variáveis de membro. Você não precisa criar uma nova classe sempre que desejar um novo retorno de chamada.OOP não é particularmente adequado para algoritmos. Destina-se a construções de larga escala, dividindo as partes do programa. Se você estiver escrevendo um algoritmo específico operando em dados específicos, é improvável que você precise de classes.
É fácil, e é ótimo, compor algoritmos de funções. No entanto, assim que você ultrapassa isso, as classes emergem como o método dominante.
fonte
Sim, é importante, por esse único motivo: entender o POO faz de você um programador melhor. Como regra geral: entender sempre faz de você um programador melhor.
Deve-se notar que nem is-a, nem classes e muito menos herança têm algo a ver com OOP. O que realmente é OOP é dissociar por meio de indireção, conforme formulado pelo princípio de inversão de dependência . Pode-se argumentar que esse também é um aspecto importante do PF. Se estudar tanto OOP quanto FP, você ficará cada vez mais ciente de que eles são realmente dois lados de um continuum. Quanto mais amplo e profundo o seu entendimento, melhor você se tornará.
Para entender o POO, tente Io e talvez Smalltalk e Ruby.
fonte
No mundo do desenvolvimento, linguagens são ferramentas, paradigmas de programação são ferramentas e bibliotecas são ferramentas. Quanto mais ferramentas você tiver, melhor poderá selecionar a ferramenta certa para o trabalho. Então, isso seria um argumento para você aprender OO, AOP e programação funcional - conforme o tempo permitir.
O mundo do desenvolvimento continua crescendo cada vez mais (em termos de idiomas, estruturas etc.), então você não pode esperar aprender tudo. No entanto, o objetivo de todas essas inovações é ajudar os desenvolvedores a se tornarem mais produtivos (velocidade de desenvolvimento e reutilização) e tornar o código mais sustentável (facilidade de entendimento, facilidade de estender e modificar).
A melhor coisa que você pode fazer é realizar um aprendizado direcionado e contínuo, na esperança de que algo novo que você acabou de aprender o ajude a concluir algo melhor e mais rápido de uma maneira que você nunca esperava.
fonte
Eu tenho lido o livro de Steve Jobs e há uma história sobre como Steve viu o SmallTalk nos laboratórios Xerox PARC. Essa foi uma das primeiras línguas OO. Sem OO, seria horrível desenvolver algo como uma Interface Gráfica de Usuário (GUI). Com toda a entrada assíncrona e poder saltar de uma tarefa para outra enquanto trabalha com um "Objeto" ou outro.
Então, enquanto você pode fazer muito com uma linguagem funcional e definitivamente possui seus casos de uso. Quando você começa a lidar com sistemas mais complexos que interagem mais com problemas do mundo real, você encontra OO como um design superior.
fonte