Programação estruturada versus programação OO

11

Estou fazendo uma apresentação que mostra as diferenças entre programação estrutural e orientada a objetos e quero ilustrar por que as pessoas precisam de OOP com um exemplo em que a aplicação de conceitos de OOP tornará a codificação muito mais fácil, para que o público realmente sinta que precisa de OOP.

Alguma ideia ??

Ahmed
fonte
2
esta pergunta em programmers.stackexchange.com fornecerá mais respostas.
reggie
2
Qual é o seu público? Programadores experientes não OO (cobol, etc)? programadores com pouca experiência (estudantes, etc)? Executivos (não programadores)?
Eu não tinha ouvido falar sobre isso antes, mas li o FAQ e acho que é melhor perguntar lá.
Ahmed
pouco experiente.
Ahmed
4
Eu gostaria que alguns programas OO fossem estruturados melhor.
Scott Whitlock

Respostas:

17

Você pode querer dar uma olhada neste blog rápido em vídeo . O resultado é que a diferença entre programação estruturada e programação OO é uma questão do que eles tiram da programação, não do que eles adicionam. Disciplinas de software como Programação Estruturada e Programação Orientada a Objetos são restritivas, não habilitadoras. Aqui estão algumas definições. Aviso: você não vai gostar deles.

  • Programação estruturada é disciplina imposta ao goto (transferência direta de controle)

  • Programação OO é disciplina imposta aos ponteiros para funções (transferência indireta de controle)

  • A programação funcional é a disciplina imposta à atribuição.

    O primeiro não é muito difícil de entender. Dijkstra descobriu que era impossível criar provas gerais de correção quando goto era permitido em algoritmos. No entanto, se as estruturas de controle estavam limitadas à sequência, seleção e iteração, as provas de correção eram possíveis. É claro que nem tentamos provar que as coisas estão corretas hoje em dia, mas gostamos da simplicidade e elegância da programação estruturada.

É um pouco mais difícil de entender OO. Geralmente, definimos OO como encapsulamento, herança e polimorfismo. O que menos se sabe é que todos esses três atributos são alcançáveis ​​e freqüentemente foram alcançados em C. De fato, o C ++ começou como apenas um pré-processador compilado em C. Na verdade, não é difícil encapsular em C. Nem é difícil criar estruturas de dados que são subconjuntos, simulando herança. Polimorfismo, no entanto, é um pouco mais difícil. Requer indicadores para funções que, em C, são difíceis de gerenciar bem. O que linguagens como o C ++ nos deu foi a disciplina imposta a esses indicadores de funções. O compilador C ++ construiu as vtables para nós e inicializou os ponteiros dentro deles de acordo com um formalismo estrito. Então, em um sentido muito real, OO é simplesmente disciplina imposta atransferência indireta de controle, ou seja, ponteiros para funções.

A programação estruturada é sobre como não usar o goto. OO é sobre como não usar ponteiros para funções. E a programação funcional também é sobre o que não fazer. Na programação funcional, não atribuímos variáveis, exceto nos casos mais rigorosamente controlados.

Portanto, no final, todas essas "tecnologias" de Programação estão na verdade restringindo disciplinas, em vez de possibilitar tecnologias. Eles nos dizem o que não fazer mais do que eles nos dizem o que a fazer. E isso significa que o desenvolvimento de software não cresceu nos últimos 40 anos. Pelo contrário, encolheu. Torna-se cada vez mais constrangido à medida que aprendemos todas as coisas que não devemos fazer.

Aprender o que não fazer é bom; mas aqui está a pergunta perturbadora: que coisas novas aprendemos a fazer?

Tio Bob.
fonte
@Ahmed: +1 para "TL; DR, obrigado pelo vídeo" - comentário suspeito (brincadeira)
n611x007 23/06/12
link rot ... link morto
slashdottir 12/01
7

Existem três maneiras básicas de programar um computador:

  1. Programação não estruturada - com gotos, como nos antigos intérpretes do BASIC ou na linguagem assembly. Poucas pessoas programam mais dessa maneira.
  2. Programação imperativa estruturada - como em C ou PASCAL.
  3. Programação funcional estruturada - como em Haskell, ML ou Lisp.

Na minha opinião, a programação orientada a objetos é algo diferente. É sobre como organizar seu programa em uma escala maior. Ele não substitui ou obsoleta nenhum dos três paradigmas que mencionei acima - em um corpo de método, você ainda precisa escolher um dos três paradigmas da lista para escrever.

Ken Bloom
fonte
Eu não te entendo bem! Você quer dizer que devemos usar um dos três paradigmas, mas NÃO sabemos .. e OOP é apenas mais organização?
Ahmed
Você não pode programar sem aprender a programação imperativa estruturada ou a programação funcional estruturada. Esses dois paradigmas são sobre como fazer as coisas. OOP, por outro lado, trata da modularização de programas que só entra em ação quando o programa atinge um determinado tamanho. Embora definitivamente apareça nas bibliotecas que você usa ao programar o tempo todo, pode-se ter uma biblioteca de classes perfeitamente boa sem recursos de OO como herança, por exemplo, as bibliotecas de classes de Haskell, LISP ou Standard ML.
Ken Bloom
4

É tudo sobre como você antecipa a mudança.

Ambos os conceitos se prestam à reutilização, mas o OOP abre as portas para mudanças mais fáceis. OOP tem toda a capacidade de reutilização da programação estrutural, mas você também pode usá-lo para criar novas funcionalidades com menos esforço.

Você poderia dizer que OOP herda toda a funcionalidade da Programação Estrutural com a funcionalidade adicional de herança! :-D

corsiKa
fonte
Não gosto muito de herança neste momento.
4
Nem eu, mas é porque o governo tirou o meu avô da sua pensão. Em termos de POO, no entanto, a herança me serviu muito bem!
corsiKa
Na minha experiência, a herança é melhor evitar no POO. Com que frequência você realmente constrói uma superclasse em oposição a uma interface? Favorecer a composição como regra geral.
Janx
1
@Janx: "Com que frequência você realmente constrói uma superclasse em oposição a uma interface?" Hã? Você não "constrói superclasses"; você pega classes existentes e constrói subclasses a partir delas, e faz isso o tempo todo. Se você não está usando herança, não está obtendo os benefícios da substituição e do polimorfismo de Liskov, então o que você está fazendo em programação orientada a objetos em primeiro lugar? A composição é uma ferramenta diferente com um caso de uso diferente, não um substituto para a herança. Você não deve "favorecer" um sobre o outro; você deve usar os dois, cada um para o que é útil.
Mason Wheeler
1
@Mason - vale notar que Barbara Liskov (do Princípio da Substituição de Liskov) realmente disse (vídeo longo) que ela não gosta particularmente de herança.
Aidan Cully
2

Os conceitos são ortogonais. A programação estruturada trata da estruturação do código dentro de procedimentos / funções / métodos. É perfeitamente possível (e desejável) seguir os princípios da programação estruturada dentro dos métodos de classe ao fazer OOP.

Nemanja Trifunovic
fonte
1

Essa é uma espécie de expressão subjetiva - programação estruturada e POO são estilos de solução de problemas, e um nem sempre é melhor que o outro. Escrever uma biblioteca de métodos numéricos faz bastante sentido se feito em um estilo estruturado, no qual você está executando transformações nos dados de entrada. Um agente simples conduzido por uma máquina de estado, no entanto, pode ser facilmente expresso como uma classe independente em Java ou C ++. OOP pode ser uma maneira natural de expressar contêineres de armazenamento para estruturas de dados.

Falar sobre ocultação de informações e modularidade é uma boa maneira de motivar naturalmente a OOP como um estilo.

Uma abordagem interessante sobre esse assunto foi escrita por Steve Yegge - de certa forma, uma das melhores descrições das diferenças de abordagem entre os dois estilos.

user18014
fonte
0

OOP é mais fácil de entender quando você cria um modelo de negócios. Quando você pensa em elementos de aplicação, usa alguns OBJETOS e RELAÇÕES entre eles, por exemplo, o livro possui Autor (es), Título, ISBN. Livro é para deixar entrar na Biblioteca e pode ser emprestado pelo Estudante. A programação estrutural reforça o pensamento sobre processos específicos, implementações não abstraídas.

OOP é projetado para alterações fáceis. Mudança no programa estrutural é possível, mas deve ser descrita por código. A mudança no programa OO pode ser descrita pela mudança abstrata do modelo.


fonte
0

Escopo Variável:

Eu acho que um princípio das linguagens para garantir uma boa programação é restringir o escopo das variáveis. Em linguagens estruturadas como C, o escopo é principalmente de dois tipos -

  • Âmbito global
  • Escopo Local / Função / Método

Todos sabemos que o escopo global é prejudicial. Mas às vezes os escopos locais não são suficientes para executar o programa. Evitar escopos globais, então, tende a um uso mais amplo de ponteiros, o que permite o uso de variáveis ​​fora do escopo. Mas ponteiros são difíceis de entender e usar.

As linguagens OOP como C ++ adicionam um novo tipo de escopo - escopo de Classe / Objeto através do encapsulamento. Esse escopo é aprimorado ainda mais pelas variações privadas / públicas. E isso resolve muitos problemas de escopo variável. Os escopos são mais definidos no OOP. E ponteiros são menos necessários.

Este é um dos grandes recursos do OOP.

Gulshan
fonte