Conceitos de programação orientada a objetos

5

Specifically, programming without inheritance is distinctly not object-oriented; we call it programming with abstract data types.

Encontrei esta excelente linha do livro "Análise e design orientado a objetos com aplicações" de Grady Booch . Então, para que um programa seja um OO, a herança, a abstração, o encapsulamento e o polimorfismo (?) Devem ser feitos?

Alguém poderia me explicar?

    
por Prakash Bala 10.01.2012 / 11:49
fonte

5 respostas

2

Abstração e Encapsulamento são realmente as únicas coisas necessárias para que algo seja orientado a objetos.

Herança e polimorfismo são estratégias para tirar vantagem de NÃO "reinventar a roda", o que é um benefício para o uso de projetos OO.

A idéia básica por trás do projeto OO é fazer com que uma grande quantidade de programadores trabalhe junto no projeto X sem incorrer em sobrecarga de comunicação, e quebrar um projeto em objetos com comunicação definida entre eles é uma solução elegante.

    
por 10.01.2012 / 20:42
fonte
1

Resposta breve rápida

A resposta é que é muito subjetivo para o Analista de Software ou o Modelador de Software.

Resposta enfadonha estendida

Existem vários conceitos relacionados ou parte do Paradigma Orientado a Objetos. Você já mencionou a maioria deles.

Por exemplo, um conceito que você não mencionou é o envio de mensagens, que está faltando na maioria das OOs atuais. linguagens de programação, e estava disponível, juntamente com o encapsulamento e herança no início OO. linguagens de programação ("Simula").

Eu trabalhei algumas vezes com várias variantes ou "idiomas" do Object Oriented Pascal, que tinha vários desses recursos, e havia uma variante que permitia usar "mensagens", como parte da linguagem de programação (palavra-chave "message"), semelhante às exceções "try catch", mas sem interromper a execução.

Enquanto, outras variantes e outras linguagens de programação são fornecidas como bibliotecas opcionais (funções e não palavras-chave).

Resumo

Você pode achar que, às vezes, uma linguagem de programação pode pular algumas delas e ainda ser considerada por algumas pessoas como O.O., enquanto outras não. É muito subjetivo.

Você está pedindo pura curiosidade intelectual?

Você se pergunta se a linguagem de programação que você está usando é totalmente OO. ?

Você está trabalhando com um colega de trabalho / universitário personalizado OO. linguagem de programação?

Você está trabalhando com um hobbyst, projeto de animal de estimação, personalizado OO. linguagem de programação?

Estas perguntas, é minha própria curiosidade, mas também para saber como tornar minha resposta mais clara; -)

Existem algumas linguagens de programação & cursos de comparação de paradigmas de programação em colegas e universidades, que tratam desse assunto.

Felicidades.

    
por 10.01.2012 / 18:52
fonte
0

Citações úteis do C ++ Faq Lite (não se incomode com sua relação com o C ++, os conceitos são os mesmos em qualquer linguagem OOP):

" Herança é o que separa a programação do tipo de dados abstratos (ADT) de Programação OO. "

" A programação com classes, mas sem ligação dinâmica, é chamada de objeto, mas não orientado a objetos. " Observe que a ligação dinâmica é outro termo para o polimorfismo. A herança do AFAIK também é necessária para implementar classes polimórficas.

Então, para responder à sua pergunta principal, sim, todas as coisas que você mencionou são "obrigatórias" para escrever um bom código de POO.

    
por 10.01.2012 / 20:56
fonte
0

Você poderia modelar qualquer domínio sem herança. A herança ajuda, às vezes, a ser mais clara sobre as classes, mas não é uma coisa obrigatória na orientação a objetos, apesar da citação de Booch.

    
por 10.01.2012 / 19:44
fonte
0

A programação com tipos de dados abstratos significa que, quando você escreve:

struct A { int i; float k; };

Você pode usar A a; como abstração de alguns bits como [00000000] [00000000] (com o número adequado de bits).

A herança adiciona o seguinte recurso:

class A { public: virtual void f()=0; };
class B1 : public A { public: void f() { ... } int a; int b; };
class B2 : public A { public: void f() { ... } int i; float k; };
void algo(A &a) { a.f(); a.f(); }
int main() { B1 b; algo(b); B2 b2; algo(b2); }

i.e. Quando há várias classes como B1,B2,B3 , os algoritmos como algo() podem trabalhar com todos eles, mesmo que o formato dos bits esteja mudando entre B1 e B2 , como o { int a; int b; } é diferente de { int i; float k; } . Apenas f() precisa ser reescrito, não o todo algo() .

    
por 10.01.2012 / 23:38
fonte