プログラマーが最初に構造とクラスを使用することを決定したときに、プログラマーが解決しなければならない設計と実装の問題は何ですか?
これはいつ起こり、これらのアイデアの先駆者は誰でしたか?
構造とクラスは関連しているため、これは二重の質問です。構造はクラスよりもかなり古いことに気づきました。答えがそれらの両方について別々に話し、いくつかの出典を引用することは素晴らしいことです。
プログラマーが最初に構造とクラスを使用することを決定したときに、プログラマーが解決しなければならない設計と実装の問題は何ですか?
これはいつ起こり、これらのアイデアの先駆者は誰でしたか?
構造とクラスは関連しているため、これは二重の質問です。構造はクラスよりもかなり古いことに気づきました。答えがそれらの両方について別々に話し、いくつかの出典を引用することは素晴らしいことです。
回答:
構造の考え方は、変数のコレクションを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が書いているように何かを読んでいるときにこのアイデアについてさらに学ぶことができ、おそらくどこかでこのアイデアが他のプログラミング言語の間で人気になった理由が書かれるでしょう。
構造体はデータのグループで、通常は型付けされます。COBOLは、それらの最初の広範囲にわたる使用法を見ました。それと類似しているが、前もって存在した。ここでの設計上の問題は、名前、職業、電話番号など、複数のデータセットをグループ化することです。「記録」という概念は、コンピューティングよりもはるかに古いものであり、数学やその他の分野で現れます。
オブジェクト指向プログラミングはもともと、システムをシミュレートするために多数のオブジェクトを実行するシミュレーションを処理するために設計されました。Simula 67は、そのスタイルのプログラミングを最初に実装したものです。Smalltalkは、すべてがプリミティブを含むオブジェクトである最初の完全オブジェクト指向言語でした。解決された最初の問題は、複雑なシステムのシミュレーションでした。Simula 67はOle-Johan DahlとKristen Nygaardによって設計されました。Alan Kay(かつてStack Overflowに関する質問に答えた)は、まだ使用されているSmalltalkを設計しました。
構造体とクラスは、どちらも一連のデータの特定のパラメータを定義するという点で、タイプとかなり密接に関連しています。クラスは、アクセス許可と操作をさらに定義して、完全に実装された抽象データ型を許可します。構造は、オブジェクト指向言語のクラスのサブセットと考えることができます。それらは、すべてのフィールドがpublicに設定され、それらのフィールドのゲッターとセッター以外のメソッドを持たないラッパークラスになります。
このウィキペディアの記事で構造に関する情報を見つけることができます。要するに、それらはコンピュータサイエンスに深く根付いているようで、ハードウェア(IBM 1620の特別な指示、基本的に1つのレコードインスタンスとしてのパンチカード、およびBabbageの分析エンジン(少なくともWikipediaによると)によってサポートされていました。COBOLは、構造をサポートするために最初に広く使用された言語。
「構造」は実際には「クラス」とは完全に異なります。古いスタイルの「構造体」をレコードと考えてください。QBASICでは、彼らはそれとさえ呼ばれていました。これの必要性はかなり明白であり、誰がそれを発明したかはわかりませんが...私はそれがほとんどすぐに思いついたと想像します。OOPの「クラス」はSimulaからかなりよく始まっているようです:http : //en.wikipedia.org/wiki/Object-oriented_programming#History
struct
とaの唯一の違いclass
は、class
デフォルトがであるのprivate
に対し、struct
デフォルトはpublic
です。
struct
し、構造体が使用されるときにキーワードをオプションにしました。