Por que devemos aprender programação procedural antes de aprendermos programação orientada a objetos [fechado]

10

Agora estou no quarto ano em uma universidade de TI e, quando converso com meu professor sobre esse tópico, ele rejeita minha opinião e me faz uma crítica muito pesada (na minha universidade, estávamos aprendendo C (ANSI) (em Procedural Aula de programação - no 1º ano na universidade) antes de C ++ (na aula de POO no 2º ano) e outras ...

Mas, aos 13 anos, meu irmão me ensinou Java primeiro e nada mais. Agora, ele pode fazer quase tudo o que um aluno normal do segundo ano pode fazer com Java.

Para vocês profissionais, eu gostaria de saber por que você acha que devemos aprender a programação processual primeiro.

Lucas
fonte
8
Porque o Assembler não tem objetos.
9
É por isso que devemos aprender a calcular corretamente antes de aprender a usar uma calculadora.
22
Porque o design orientado a objetos é falho. Programas são uma coleção de comportamentos que operam nos dados. Os objetos geralmente apresentam complexidade desnecessária. Leia "Como criar programas: uma introdução à programação e computação".
8
Como dito por outra pessoa, "Não distraia novos programadores com OOP": prog21.dadgum.com/93.html - basicamente tudo o que o OOP está impedindo de ensinar os fundadores a novos programadores. Você está ensinando a eles dois conceitos realmente difíceis ao mesmo tempo.
John Ripley
7
@juxstapose - dizer que a programação orientada a objetos introduz complexidade desnecessária é como dizer que devemos esculpir veículos a partir de um único bloco de aço. Apenas minha opinião.

Respostas:

23

Resumo rápido:

  1. Porque no mundo real, mais cedo ou mais tarde, você precisa trabalhar com código processual.

  2. Como as Linguagens procedurais podem funcionar como uma extensão ou uma introdução às Linguagens orientadas a objetos, em vez de apenas serem uma alternativa.

  3. Complemento à resposta 2. Como a POO é mais complexa que a Programação Procedimental, é melhor aprender a Programação Procedimental primeiro.

  4. Porque no mundo real, os programadores trabalham e combinam várias maneiras de resolver problemas, também conhecido como "programação multiparadigmática", e não apenas um único paradigma.

  5. A maioria das linguagens de programação é multiparadigm, em algum nível, mesmo que seus designers ou desenvolvedores comuns digam o contrário.

  6. [NOVO] Como a Programação Modular, geralmente misturada e confusa com a Programação Procedimental, pode ser aplicada ao OOP. Portanto, a pergunta pode ser lida como "Por que devemos aprender programação Modular antes de aprender a programação orientada a objetos"?

Descrição Aborrecida Estendida:

O ponto 1 é muito claro, sem mais explicações.

Ponto 2, Classes, Herança, Polimorfismo, Interfaces, etc.

Ponto 3, eu codifico Pascal processual antes de aprender Pascal orientado a objetos, quando cheguei lá, eu disse: "olha, as classes são como pequenos programas processuais ... ... e você pode fazê-los conversar, legal !!! "

Ouvi o mesmo de pessoas que passaram do C para o C plus plus.

Ponto 4, na maioria das vezes os programadores combinam várias técnicas ou paradigmas de programação, ou maneiras de resolver um problema. Funcional, procedural, OOP, lógico.

Mesmo o Java "Pure OO" não é tão simples quanto a programação de objetos.

+1 ponto para dizer "Programação procedural" em vez de "Programação estruturada". Ou programação modular. Isso é importante.

Embora muitas vezes esses termos sejam ensinados juntos e usados ​​de forma intercambiável, eles não são. Programação Estruturada, inclui muitos conceitos, não apenas usando procedimentos, e um deles é fazer com que o programa não pareça com "Código de Espaguete".

Hoje eu li vários programas OO "puros" que se parecem com "Código de Espaguete Orientado a Objetos", significando que o programador usou OOP, mas seu código parece uma bagunça.

Muitas vezes, eu posso ler um código OO e dizer que o programador aprendeu a Programação Estruturada antes do OOP, porque o código é claro e organizado.

E para a Programação Modular, já vi vários aplicativos. em C ++ e PHP que não usa módulos. *

umlcat
fonte
18

Eu pensaria que a analogia seria semelhante à matemática. Você precisa aprender alguns conceitos básicos primeiro (adição / subtração / ...) e depois passar para tópicos mais complexos (álgebra / cálculo). O programa processual é muito linear e é mais fácil entender o fluxo de controle enquanto você aprende a sintaxe. O POO talvez seja considerado mais complexo, baseia-se nas construções mais simples usadas nas linguagens processuais, mas é mais abstrato e mais difícil de entender. Começar com linguagens como C também o aproxima do hardware e ajuda a lidar com problemas de alocação de memória e ponteiros, que você precisa entender, mas não consegue usar em linguagens como Java / C #. Existe algum valor real em ser exposto a isso na escola, independentemente de ser o primeiro ou o segundo.

FWIW, está prestes a mudar eventualmente. Quando eu comecei a escola, aprendemos em Pascal e PL / 1. Não chegamos ao C até a aula de idiomas avançados (que data comigo). Eu não peguei o Java até a faculdade - ainda não havia sido inventado!

tvanfosson
fonte
+1 - uma espécie de paradoxo da intenção lá ... "mais abstrato e mais difícil de entender" :)
10
@ Spacemoses - na verdade não, quanto mais abstrato algo for, mais fácil será a discussão, mas mais difícil será entender a realidade do que está sendo discutido.
concordou, entendo seu ponto agora.
ses011
12

A programação orientada a objetos é uma coleção de trechos de procedimentos de maneira organizada. Acho que a lição que você está aprendendo é que a metodologia orientada a objetos ajuda a manter a organização e a capacidade de manutenção. Muitos programadores não conseguem fazer essa distinção e afirmam que seus programas são orientados a objetos quando são mais processuais.

ses011
fonte
3
mas as funções + state = objetos
Dan D.
4
A orientação a objetos geralmente torna a manutenção muito mais difícil, porque infla a base de código. Os sistemas baseados em Java são um pesadelo para manter, devido ao nível de pureza de OO e padrões de design encontrados nessa comunidade.
bit-twiddler
11
"Padrões de design encontrados nessa comunidade" - parece um problema pessoal na "comunidade Java", se essa for sua posição.
ses011
11
@ Dan D: orientação a objetos é muito mais do que combinando funções e estado em um objeto ...
Marjan Venema
4
@ Spacemoses: Eu tenho um problema com qualquer comunidade de desenvolvimento que não abraça o princípio do KISS. A melhor solução para um problema geralmente é a solução mais simples.
bit-twiddler
11

Você não

Aprendemos a programação funcional primeiro, com o Scheme. Então nos mudamos para processual, em seguida, OOP, e , em seguida, programação declarativa. E, acredite ou não, enquanto eu já conhecia programação, acho que também foi mais fácil para outras pessoas: porque FP é como matemática! Então você já sabe o básico.

Debatei isso comigo mesmo muitas vezes e finalmente cheguei à conclusão de que realmente depende de quão bem seu professor ensina os conceitos.

Não existe uma resposta única porque:

  • Começar com algo processual como C (ou mesmo assembly) pode ser uma boa escolha, porque você aprende como os computadores realmente funcionam

  • Começar com algo orientado a objetos Java pode ser uma boa escolha, porque é relativamente fácil aprender e aplicar OOP à vida real e porque ensina a ** formar

  • Começar com uma programação funcional como o Scheme pode ser uma boa escolha, porque ensina a pensar de maneira mais abstrata (em termos de funções em vez de variáveis), o que, em última análise, o torna um programador melhor

Se o seu professor não ensina bem, então realmente não importa com o que você começa; eles ficarão praticamente iguais.

user541686
fonte
4
Marcou com +1 e não acredito que precisei percorrer tantas respostas ruins para encontrá-la!
jk.
Na verdade, eu tive problemas para grokking funções matemáticas por um tempo, porque eu aprendi algumas codificações primeiro, e o conceito de uma função que 'é' em vez de 'fazer coisas' me deixou perplexo. : 3
StarWeaver
6

Uma linguagem pode ser orientada a objetos como C ++, Java ou C #. E você pode começar com esses idiomas. Mas o ponto é que, mesmo com essas linguagens OO, você precisa aprender a programação procedural primeiro e depois OOP. Eu acho que o mesmo foi feito por você para seu irmão.

Gulshan
fonte
3
+1 precisamente. Todo método OOP é um programa processual curto. Se você não sabe como combinar as peças pequenas (tipos, valores literais, variáveis, operadores, =atribuição, if, for, etc) em pedaços maiores (métodos), como você pode sempre esperar entender OOP. Como na maioria das habilidades, ser muito inteligente, motivado e / ou ter acesso a instruções individuais pode permitir que você aprenda vários tópicos relacionados simultaneamente.
David Harkness 23/03
3

A programação processual, pelo menos em uma linguagem como C, reduz a programação a uma prática básica: algoritmos e estruturas de dados e em um nível de abstração que é um meio termo entre o código-fonte compreensível humano e o código de montagem.

Dessa forma, os alunos podem aprender um pouco de ciência (algoritmos, estruturas de dados) e um pouco de engenharia (compilação de fonte-> objeto-> máquina, arquitetura von-neuman (provável)) ao mesmo tempo.

OOP, via C ++ / obj-C, introduz um padrão de organização de código, que é apenas mais uma coisa a aprender. Isso pode dificultar o aprendizado dos conceitos acima.

OOP via Java (entre outros) vai ainda mais longe, abstraindo o hardware e o ambiente. Agora, o produto subjacente não é um código de máquina, mas algum tipo de intermediário que não revela como o hardware subjacente funciona, mas o efeito é que ele permite que o aluno se concentre nos padrões de organização do código.

No final, acho que é uma troca entre aprender como o hardware funciona ou aprender um padrão de organização de código. Quanto ao que é mais importante, eu realmente não sei. O mundo real requer conhecimento de ambos, pelo menos até certo ponto.

Suponho que um programa de graduação que comece com programação procedimental de baixo nível provavelmente produz cientistas / engenheiros de computação, e um programa que comece com conceitos de nível superior produz engenheiros / desenvolvedores / programadores de software.

Curtis Batt
fonte
3

As tripas dos objetos OOP são compostas de programação procedural.

Se você não pode fazer um loop for, use os ponteiros corretamente, declare seus tipos e funções que não poderá escrever interfaces para suas classes e muito menos fazer com que o interior faça algo que valha a pena.

Você realmente não aprenderia OOP em uma aula introdutória de qualquer maneira, seria apenas uma sintaxe - pular direto para o OOP tornaria as coisas mais complicadas de entender (a princípio) do que já é.

OOP não é sobre sintaxe declarante para formar classes, é sobre estruturas de dados, padrões de design, polimorfismo, herança e composição.

Para fazer todas essas coisas que você precisa saber sobre programação procedural, algo facilmente feito em C. Você pode transportar quase tudo o que aprende com C para Java ou C ++ de qualquer maneira, talvez seja necessário repensar algumas das coisas que você considerava óbvias em C, MAS ... Você precisa conhecer a gramática (onde você está na introdução C) para escrever sentenças (deve escrever procedimentos para definir interfaces), parágrafos (conhecer estruturas de dados) e conhecer alguns padrões de design (tragédia, comédia, falhas) herói, como eles interagem e quando não usá-los) antes que você possa escrever romances completos (sistema completo de POO).

Se eu fosse você, escolheria alguns dos seguintes livros: Linguagem de programação C , Linguagem de programação Java , Padrões de design , Gang of Four e Hachura de padrões . Definitivamente, eu pegaria uma cópia da Linguagem de Programação C se levasse a sério o C / C ++.

Se você deseja apenas percorrer todo o caminho, o Java (e fazendo isso pelo $) identifica alguns livros sobre padrões de design Java e como usar o Java com os servidores Web Apache e Tomcat e alguns livros sobre programação de banco de dados SQL. O Java é tão chocante na web, desculpe, mas o PHP tem um histórico de toneladas de brechas de segurança, tornando-o tão difícil quanto o Windows impedir que o servidor seja enraizado ou que os bancos de dados SQL sejam injetados.

Você também deve reservar um tempo para aprender SQL, o Oracle MySQL Postgresql e o MSSQL têm muito em comum em relação à sintaxe, mas se eu tivesse que escolher apenas aprender um para mim, escolha o Postgresql apenas porque é licenciado em BSD em vez de GPL (você deve comparar e contraste também nas licenças GPL / BSD)

Hategrin
fonte
2

Eu diria que a maioria dos códigos escritos em linguagens orientadas a objetos como Java não é realmente orientada a objetos. Realmente entender as idéias por trás do OO é difícil, como resultado, supostamente, o código OO é realmente principalmente processual.

No entanto, isso não é nada errado ao escrever código processual em Java. Sim, há benefícios em fazer OO, mas não é algo que eu queira confundir um programador iniciante. Portanto, nessa base, não vejo nada de errado em ensinar Java. Não espere OO real com isso, mas funciona.

No entanto, o Java oculta muitos detalhes de baixo nível sobre o que está acontecendo dentro do computador. C deixa isso muito mais exposto. Pode-se argumentar que os alunos devem aprender como esses detalhes de baixo nível funcionam antes de usar um idioma que cuide deles. Mas você também pode argumentar que deve ignorar esses detalhes e aprendê-los mais tarde.

Winston Ewert
fonte
2

Vários outros já responderam ao longo deste tema, mas acho que vale a pena declarar isso de forma mais explícita.

Mesmo que você comece a aprender programação com uma linguagem orientada a objetos como Java, comece aprendendo técnicas de programação procedural antes de chegar aos conceitos de OO . Ao ensinar um novo programador Java, você não os apresenta primeiro a objetos e classes, mas a instruções e variáveis. Quando o aluno está em posição de aprender muito sobre objetos e classes, ele já tem pelo menos o básico de programação procedural.

Portanto, pelo menos, você precisa aprender programação procedural em Java e, em seguida, aprender programação orientada a objetos em Java. Se você passa um ano inteiro em programação procedural ou apenas passa as primeiras semanas do curso de programação, e se usa ou não uma linguagem diferente, está apenas discutindo os detalhes.

Ben
fonte
0

Para ser muito franco, acho que o momento para isso vem principalmente de programadores antigos que desejam ter velhos tempos.

Antes de dizer qualquer outra coisa, eu absolutamente não sustento nenhum argumento para programadores mais velhos, muitos deles são simplesmente incrivelmente qualificados. Infelizmente, às vezes aqueles que não são, que ficam loucos e nunca foram realmente bons em programação para começar ... se tornam professores quando não conseguem invadir o 'mundo real'. (Nem todos os professores também ... mas ... MUITOS)

OOP não é o santo graal da programação, mas também a programação processual é uma relíquia. É bom conhecer pelo menos alguns dos dois, mas acho que a prática geral do que acaba sendo ensinado como programação processual tende a ser um enorme desperdício de tempo e esforço. Precisamos aprender a programar na academia, não apenas um estilo ou outro. Atribuo um pouco de código terrível e conceitos errados a isso, incluindo o meu.

Garet Claborn
fonte
2
Eu tive um professor usando C de 1989, mas era para um microchip esperando c '99. Havia outro professor usando 'c ++', mas sem o STL ou os modelos. Poderiam ter sido estruturas com indicadores de função.
Ape-Inago
11
Para ser justo, o STL e os modelos em geral não são tópicos introdutórios de C ++. O objetivo básico de qualquer curso de programação de 101 níveis é ensinar a criar lógica sequencial, condicional e iterativa bem estruturada dentro das restrições de uma determinada sintaxe. Todos os outros recursos de linguagem são meramente açúcar sintático que permitem agrupar as estruturas básicas de controle e vinculá-las aos dados.
bit-twiddler
ai dois votos negativos. vi que uma vinda = P é estranha para mim, embora a opinião originalmente tenha sido de um programador mais velho que me ajudou a me recuperar de um ensino ruim. @Ape: O chefe do nosso departamento de CS estava tentando nos ensinar COBOL por um ano em 2004 XD (a menor das minhas preocupações com o estilo de 'ensino' dele, eu meio que não me importo, pois posso trabalhar em algum ponto de vendas máquinas lol mas geeze ... sério)?
Garet Claborn
11
@ bit-twiddler - Sim senhor, muito estranho. Não confio muito nessa experiência nessa opinião, mas procurei outros locais. Eu realmente amo os dois estilos de programação e parece-me que eles devem ensiná-los juntos. Acabei de descobrir que os professores ainda um pouco mais jovens não têm a mesma porcentagem de fanatismo sobre o assunto. OMI é uma coisa boa. Eu entendo que alguns acham que o procedimento é importante primeiro.
Garet Claborn 24/03
11
@ bit-twiddler: sim, mas não foi um curso introdutório. Foi um curso avançado de quarto ano em design de banco de dados, e deveríamos estar usando c ++. Apenas parecia errado depois de experimentar o c ++ a um nível tão alto nos cursos anteriores.
Ape-inago 24/03
0

Duas razões para mim: Uma programação OO veio resolver problemas de programação procedural. Portanto, ao escrever algumas codificações processuais e as mesmas coisas no OO, fica mais fácil entender a diferença.

Há também um elemento adicional aqui: As duas abordagens para educar sobre os tópicos de programação. Pode-se começar o mais baixo possível (por exemplo, montagem, em muitos lugares processuais, outros começam com circuitos) e depois subir (em direção a OO / Funcional / Gerenciado). A outra abordagem é começar no mundo físico (por exemplo, Navegador / Windows 7 etc.) e depois começar a ir mais fundo. Existem prós e contras em cada abordagem. Sua universidade escolheu a primeira e para começar com o procedimento. Pode haver alguma justificativa ou eles simplesmente copiaram outra pessoa :-).

Dimitrios Mistriotis
fonte
11
"A programação OO veio resolver problemas de programação procedural". Esse era o objetivo, mas o OO criou tantos problemas quanto resolveu.
bit-twiddler
@ bit-twiddler: História muito grande. Ao focar (ou reduzi-lo) no aspecto pedagógico, argumenta: O que tínhamos isso, como o tornamos melhor: que (você discute se é melhor ou não)
Dimitrios Mistriotis
0

Não há outra razão senão a inércia institucional. Olhe para a CMU, eles jogaram fora todo o currículo de OOP e o substituíram por programação funcional. Portanto, mais uma vez, a resposta para sua pergunta é que é uma escolha arbitrária feita pelos administradores de qualquer escola que você frequenta. Caso alguém esteja se perguntando sobre as declarações factuais que fiz aqui, é o post sobre a mudança de currículo na CMU por um professor / administrador: Ensinar FP a calouros .

davidk01
fonte
11
-1 enganosa - embora eu tenha visto um tópico (via pesquisa do google) que alegava que a CMU retirou o OOP do currículo do primeiro ano do CS e o substituiu pela programação funcional, o currículo oficial da CMU começa com a linguagem de programação Alice, que é objeto orientado [veja enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
Steven A. Lowe
11
@ davidk01: (1) afirmação factualmente incorreta na resposta. (2) "Alice é uma ferramenta de ensino disponíveis gratuitamente projetado para ser a primeira exposição de um estudante de programação orientada a objetos " de alice.org
Steven A. Lowe
2
@ Steven A. Lowe: Direto da boca do cavalo: "A programação orientada a objetos é totalmente eliminada do currículo introdutório, porque é antimodular e antiparalela por sua própria natureza e, portanto, inadequada para um currículo moderno de computação em nuvem. Um novo curso proposto sobre metodologia de design orientado a objetos será oferecido no segundo ano para os alunos que desejam estudar este tópico ". - Ensino FP para calouros
davidk01 23/03
11
@ davidk01: excelente link, obrigado. Do artigo do comitê citado nesse artigo "Embora a programação orientada a objetos (em suas inúmeras formas) permaneça um tema dominante no desenvolvimento de software industrial, o uso de linguagens orientadas a objetos, como Java, no nível introdutório, introduz considerável complexidade e distrai dos objetivos principais no nível introdutório . Parece preferível fornecer uma cobertura mais completa da metodologia de projeto e implementação de OO mais adiante no currículo, para permitir uma concentração mais focada no básico no nível introdutório ". [ênfase minha] ...
Steven A. Lowe
11
@ davidk01: Fico feliz em concordar em discordar. Pode me chamar de pedante, se quiser, mas para mim há uma diferença significativa entre alterar a ênfase do nível introdutório e "jogar fora todo o currículo da OOP". Eu não chamaria reduzir o âmbito das aulas introdutórias uma "mudança radical" ;-)
Steven A. Lowe