Origem das estruturas e classes

8

Quais problemas de design e implementação os programadores tiveram que resolver quando decidiram primeiro usar estruturas e classes?

Quando isso aconteceu e quem foram os pioneiros por trás dessas idéias?

Observe que essa é uma pergunta dupla, porque estruturas e classes estão relacionadas. Eu percebo que as estruturas são bem mais antigas que as classes. Seria ótimo se a resposta falasse separadamente sobre os dois e citasse algumas fontes.

xralf
fonte
Eles não são tão relacionados como se costuma pensar, e o problema é confuso pelo fato de o C ++ ter implementado classes colocando açúcar sintático sobre estruturas contendo ponteiros de função. Para turvar ainda mais as águas, o C ++ expandiu estruturas para incluir definições reais de métodos e, em seguida, tornar a structpalavra - chave opcional quando a estrutura é usada.
Gort the Robot
1
O concurso de história não dura mais dois dias. :)
chrisaycock
Obrigado a todos por respostas. As respostas que mencionam a explicação pedagógica dos princípios da IBM 1620, COBOL, Simula 67 e Giorgio criam todo o núcleo do que eu aceito como resposta.
Xralf

Respostas:

5

A idéia de uma estrutura é agrupar uma coleção de variáveis ​​em um único contêiner. Por exemplo, se você tiver três coordenadas

int x;
int y;
int z;

convém vê-los como uma unidade de dados e agrupá-los:

struct point
{
    int x;
    int y;
    int z;
};

Você pode ver isso como uma maneira de modularizar seus dados. Agora você pode definir variáveis ​​contendo todos os três valores em uma unidade:

struct point p1, p2;

Na programação processual, você possui procedimentos ou funções que manipulam dados e, em particular, estruturas, por exemplo

void shiftX(struct point *p, int offset);

Você pode chamar a função em uma estrutura passando-a como argumento:

shiftX(&p1, -10);

O passo de estruturas para classes é dizer que procedimentos / funções devem ser agrupados com dados em unidades: como estruturas classificam entidades que possuem a mesma estrutura, classes classificam entidades que possuem a mesma estrutura e operações.

Então agora você pode escrever:

class Point
{
  public:
    void shiftX(int offset);

    int x;
    int y;
    int z;
 };

e depois:

 Point p;

 ...

 p.shiftX(-10);

Dessa maneira, é mais fácil agrupar operações que funcionam no mesmo tipo de dados. Por exemplo, você pode agrupar todas as operações que atuam em pontos na definição de classe, em vez de espalhá-las pelo seu código como funções que possuem um ou mais parâmetros do tipo point.

Além disso, você pode refinar a estrutura e o comportamento usando herança.

Resumindo: estruturas são um conceito que permite organizar / modularizar dados. As classes permitem organizar / modularizar dados e operações.

Giorgio
fonte
Eu gosto da abordagem pedagógica desta sua resposta. Portanto, se eu entendi direito, posso aprender mais sobre essa idéia ao ler algo sobre Simula 67como o WorldEngineer escreve e talvez algum lugar seja escrito por que essa idéia se tornou popular entre outras linguagens de programação.
Xralf
A ideia se tornou popular porque é uma excelente maneira de organizar o código. Os aplicativos se tornaram progressivamente maiores e mais complexos. Alguns sistemas operacionais possuem mais de 100 milhões de linhas de código. Embora uma avaliação bastante pobre avalie a complexidade real, exige grandes esforços organizacionais.
World Engineer
1
A alternativa é usar módulos (Modula-2), ou pacotes (Ada, Java, Scala, etc) ou unidades (alguns dialetos do Pascal). Dessa forma, você pode agrupar tipos e operações. No entanto, as classes oferecem uma integração mais rígida entre dados e operações, além de recursos adicionais, como herança.
Giorgio
@xralf: Talvez lendo o Simula 67 você possa descobrir mais sobre as motivações para o OOP. Aliás, pelo que me lembro, o Simula 67 já possui métodos virtuais. Portanto, os métodos virtuais são uma invenção muito antiga.
Giorgio
@WorldEngineer Pensei que os sistemas operacionais são escritos em linguagem Assembly e C e existem bibliotecas para organização de códigos.
Xralf
5

Estruturas são grupos de dados, tipicamente digitados. COBOL viu o primeiro uso generalizado deles. Embora existissem análogos a isso anteriormente. O problema de design aqui é agrupar vários conjuntos de dados, como um nome, uma ocupação e um número de telefone. A idéia de um "registro" é algo muito mais antigo que a computação e aparece na matemática e em várias outras disciplinas.

A Programação Orientada a Objetos foi originalmente projetada para lidar com a simulação em que você teria vários objetos em execução para simular um sistema. O Simula 67 foi o primeiro a implementar esse estilo de programação. Smalltalk foi a primeira linguagem totalmente orientada a objetos, onde tudo é um objeto, incluindo primitivos. O problema original que estava sendo resolvido era a simulação de sistemas complexos. O Simula 67 foi projetado por Ole-Johan Dahl e Kristen Nygaard. Alan Kay (que já respondeu a uma pergunta no Stack Overflow ) projetou o Smalltalk, que ainda é usado.

Estruturas e classes estão intimamente relacionadas aos tipos, pois ambas definem certos parâmetros para um conjunto de dados. As classes definem ainda mais as permissões e operações de acesso, permitindo tipos de dados abstratos totalmente implementados. As estruturas podem ser pensadas em um subconjunto de Classes em uma linguagem orientada a objetos. Eles seriam uma classe de wrapper que possui todos os campos definidos como públicos e nenhum método fora dos getters e setters para esses campos.

Engenheiro Mundial
fonte
4

Você pode encontrar informações sobre estruturas neste artigo da Wikipedia . Em resumo, eles parecem estar tão profundamente ancorados na ciência da computação que foram suportados primeiro por hardware (instruções especiais no IBM 1620, cartões perfurados basicamente como uma instância de registro e no Analytical Engine do Babbage (pelo menos de acordo com a wikipedia). primeira linguagem amplamente usada para apoiar a construção.

scarfridge
fonte
Eu gosto desta explicação para estruturas.
Xralf
3

"estruturas" são realmente completamente diferentes de "classes". Pense no estilo antigo "struct" como um registro. No QBASIC eles foram chamados assim. A necessidade disso é bastante óbvia e, embora eu não possa dizer quem o inventou ... eu imagino que surgiu quase imediatamente. As "classes" de POO parecem ter começado bastante bem com o Simula: http://en.wikipedia.org/wiki/Object-oriented_programming#History

Edward Strange
fonte
Em termos de intenção, sim, mas se você estiver falando sobre C ++, a única diferença entre a structe a classé o classpadrão, privateenquanto o structpadrão é public.
Gort the Robot
Os registros datam de pelo menos o século XIX, que antecede um pouco o C ++. Não acho que C ++ seja relevante aqui.
Jörg W Mittag
@ JörgWMittag: Eu acredito em você, mas tem alguma fonte ou exemplo para isso?
FrustratedWithFormsDesigner