構造とクラスの起源


8

プログラマーが最初に構造とクラスを使用することを決定したときに、プログラマーが解決しなければならない設計と実装の問題は何ですか?

これはいつ起こり、これらのアイデアの先駆者は誰でしたか?

構造とクラスは関連しているため、これは二重の質問です。構造はクラスよりもかなり古いことに気づきました。答えがそれらの両方について別々に話し、いくつかの出典を引用することは素晴らしいことです。


それらはしばしば考えられるほど関連性がなく、問題は、C ++が関数ポインタを含む構造体の上に構文糖衣を置くことによってクラスを実装したという事実によって混乱しています。さらに水を濁らせるために、C ++は実際のメソッド定義を含むように構造体を拡張structし、構造体が使用されるときにキーワードをオプションにしました。
Gort the Robot、

1
履歴コンテストは、別の2日間ではありません。:)
chrisaycock

皆様、お返事ありがとうございます。IBM 1620、COBOL、Simula 67、およびGiorgioの原理に関する教育的説明に言及する回答は、私が回答として受け入れるもののすべてのコアを作成します。
xralf

回答:


5

構造の考え方は、変数のコレクションを1つのコンテナーにグループ化することです。たとえば、3つの座標がある場合

int x;
int y;
int z;

それらをデータの単位として表示し、それらをグループ化することができます。

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

これは、データをモジュール化する方法として見ることができます。これで、3つの値すべてを1つの単位に含む変数を定義できます。

struct point p1, p2;

手続き型プログラミングでは、データ、特に構造を操作するプロシージャまたは関数があります。

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

引数として渡すことで、構造体の関数を呼び出すことができます。

shiftX(&p1, -10);

構造体からクラスへのステップは、プロシージャ/関数をデータと一緒にユニットにグループ化する必要があるということです。たとえば、構造体は同じ構造を持つエンティティを分類し、クラスは同じ構造と操作を持つエンティティを分類します。

だから今書くことができます:

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

    int x;
    int y;
    int z;
 };

その後:

 Point p;

 ...

 p.shiftX(-10);

このようにすると、同じ種類のデータを操作する操作をグループ化するのが簡単になります。たとえば、ポイント型の1つ以上のパラメーターを持つ関数としてコードに分散させるのではなく、クラス定義内のポイントに作用するすべての操作をグループ化できます。

さらに、継承を使用して構造と動作の両方を調整できます。

要約:構造体は、データの整理/モジュール化を可能にする概念です。クラスを使用すると、データと操作の両方を整理/モジュール化できます。


私はこのあなたの答えの教育学的アプローチが好きです。ですから、私が正しく理解していればSimula 67、WorldEngineerが書いているように何かを読んでいるときにこのアイデアについてさらに学ぶことができ、おそらくどこかでこのアイデアが他のプログラミング言語の間で人気になった理由が書かれるでしょう。
xralf

このアイデアは、コードを編成する優れた方法であるため、人気が出ました。アプリケーションは次第に大きく、複雑になっています。一部のオペレーティングシステムには、1億行を超えるコードがあります。かなり貧弱な実際の複雑さを測定する一方で、それは大規模な組織的な努力を必要とします。
ワールドエンジニア

1
別の方法としては、モジュール(Modula-2)、パッケージ(Ada、Java、Scalaなど)、またはユニット(一部のPascal方言)を使用します。このようにして、タイプと操作をグループ化できます。ただし、クラスは、データと操作のより緊密な統合、および継承などの追加機能を提供します。
ジョルジオ

@xralf:多分Simula 67を読んで、OOPの動機についてもっと知ることができます。ところで、私が覚えている限り、Simula 67にはすでに仮想メソッドがあります。したがって、仮想メソッドは本当に古い発明です。
ジョルジオ

@WorldEngineer私は、オペレーティングシステムはアセンブリとC言語で記述されていて、コードを整理するためのライブラリがあると思いました。
xralf

5

構造体はデータのグループで、通常は型付けされます。COBOLは、それらの最初の広範囲にわたる使用法を見ました。それと類似しているが、前もって存在した。ここでの設計上の問題は、名前、職業、電話番号など、複数のデータセットをグループ化することです。「記録」という概念は、コンピューティングよりもはるかに古いものであり、数学やその他の分野で現れます。

オブジェクト指向プログラミングはもともと、システムをシミュレートするために多数のオブジェクトを実行するシミュレーションを処理するために設計されました。Simula 67は、そのスタイルのプログラミングを最初に実装したものです。Smalltalkは、すべてがプリミティブを含むオブジェクトである最初の完全オブジェクト指向言語でした。解決された最初の問題は、複雑なシステムのシミュレーションでした。Simula 67はOle-Johan DahlとKristen Nygaardによって設計されました。Alan Kay(かつてStack Overflowに関する質問に答えた)は、まだ使用されているSmalltalkを設計しました。

構造体とクラスは、どちらも一連のデータの特定のパラメータを定義するという点で、タイプとかなり密接に関連しています。クラスは、アクセス許可と操作をさらに定義して、完全に実装された抽象データ型を許可します。構造は、オブジェクト指向言語のクラスのサブセットと考えることができます。それらは、すべてのフィールドがpublicに設定され、それらのフィールドのゲッターとセッター以外のメソッドを持たないラッパークラスになります。


4

このウィキペディアの記事で構造に関する情報を見つけることができます。要するに、それらはコンピュータサイエンスに深く根付いているようで、ハードウェア(IBM 1620の特別な指示、基本的に1つのレコードインスタンスとしてのパンチカード、およびBabbageの分析エンジン(少なくともWikipediaによると)によってサポートされていました。COBOLは、構造をサポートするために最初に広く使用された言語。


構造については、この説明が好きです。
xralf

3

「構造」は実際には「クラス」とは完全に異なります。古いスタイルの「構造体」をレコードと考えてください。QBASICでは、彼らはそれとさえ呼ばれていました。これの必要性はかなり明白であり、誰がそれを発明したかはわかりませんが...私はそれがほとんどすぐに思いついたと想像します。OOPの「クラス」はSimulaからかなりよく始まっているようです:http : //en.wikipedia.org/wiki/Object-oriented_programming#History


意図的にはそうですが、C ++について話している場合、a structとaの唯一の違いclassは、classデフォルトがであるのprivateに対し、structデフォルトはpublicです。
Gort the Robot、

レコードは、少なくとも 1800年代にさかのぼります。これは、C ++より少し古いものです。ここではC ++は関係ないと思います。
イェルクWミッターク

@JörgWMittag:私はあなたを信じますが、そのための情報源や例はありますか?
FrustratedWithFormsDesigner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.