遅くなりましたが、参考になれば幸いです。ユーザーhuitseeker
は、ソフトウェア設計の観点から優れた回答を書きました。数学の観点からあなたの質問に答えたいと思います。ソフトウェアの世界に飛び込む前は、アレックス ステパノフは数学者であり、抽象代数と普遍代数を研究していました。そして彼はしばしば、厳密な数学的基礎をソフトウェアとアルゴリズムの設計の世界に持ち込もうとしました。彼の著書「数学から汎用プログラミングへ」および「プログラミングの要素」で、彼はこの設計手法を提唱しています。代数構造とソフトウェア設計の概念を混合するという彼のアイデアは、 の概念で実現されましたgeneric programming
。そして今、彼の引用について話しましょう:
実際の問題に対処するには、マルチソートされた代数 (複数の型にまたがるインターフェイスのファミリ) が必要です。
私の意見では、彼がここで言及したかった主な概念は 2 つあります。それは、抽象データ型( ADT
) と代数構造の概念です。最初のコンセプト: ADT
. ADT
- データ型がそのセマンティックによってのみ定義されるデータ型の数学的モデルです。Stepanov は、OOP の意味でADT
のアイデアを、のアイデアと対比させました。object
オブジェクトにはデータと状態が含まれますが、ADT には含まれません。ADT -データとbehavioural abstraction
のoperation cluster
相互作用を説明する です。振る舞いの抽象化は、抽象データ型の代数的仕様によって完全に記述されます。これについては、元のLiskov と Zillesの論文で詳しく読むことができます。ウィリアム R. クックによるオブジェクト指向プログラミングと抽象データ型の比較。
(免責事項:この段落は「数学的でそれほど重要ではない」ため、スキップできます) 最初に、いくつかの用語を明確にしたいと思います。私が について話すとき、algebraic structure
それは代数と同じです。この言葉algebra
は、代数構造にもよく使用されます。より正確に言えば、代数構造 (algebra) について話すときは、通常、代数理論よりも代数を意味します。代数の多様性という概念があります。これは、あるカテゴリのオブジェクトに関する代数構造の概念がいくつかあるためです。定義により、algebraic theory
(algebra over it) は、これらの操作が満たさなければならない操作と法則の仕様で構成されます。これは、使用する代数構造の作業定義であり、この定義は、ステパノフが暗黙のうちに引用で言及したと思います。
Stepanov が言及したかった2 番目の概念は、ADT の最も興味深い特性です。ADT は として直接モデル化できますmany-sorted algebraic structures
。もっと正式に話しましょう。代数構造 - carrier set
1 つまたは複数の有限演算が定義された です。これらの操作は通常、1 つのセットに対してではなく、複数のセットに対して定義されます。たとえば、文字列連結をモデル化する代数を定義してみましょう。この代数は、文字列の 1 つのセットではなく、文字列セットS
と自然数セットN
の 2 つのセットで定義されます。これは、文字列をそれ自体と有限回数連結できる操作を定義できるためです。S
したがって、この操作は、異なる基になる (キャリア) セットに属する 2 つのオペランドを使用します。N
. のセットと呼ばれる代数でこれらの異なるオペランド (それらの型) を定義するセットsorts
。Sort
型の代数的アナログです。マルチソート代数と呼ばれる、複数のソートを持つ代数。普遍代数では、asignature
は代数構造を特徴付ける演算のリストです。多ソート代数構造は、任意の数の定義域を持つことができます。種類は署名の一部であり、さまざまなドメインの名前の役割を果たします。多ソート署名はまた、多ソート代数構造の関数と関係がどのソートで定義されるかを規定します。1 種類の代数の場合、署名は集合であり、その要素は操作と呼ばれ、それぞれにアリティと呼ばれる基数 (0、1、2、…) が割り当てられます。マルチソート代数のシグネチャは、次のように定義できます。Σ = (S,OP,A)
、ここでS
– ソート名 (型) のセットOP
– 操作名とアリティA
のセットただし、アリティが単なる自然数 (長さリストの) 1 つの出力ソートと一緒に。これで、抽象データ型の代数仕様をトリプルとして作成できます。ADT
ADT = (N, Σ, E)
、ここでN
- 抽象データ型の名前Σ = (S,OP,A)
- マルチソート代数構造の署名 - 署名E = {e1, e2, …,en}
内の等値の有限集合。ご覧のとおり、ADT の厳密な数学的記述ができました。数学では、並べ替えられた代数構造は、少しの努力で回避できる場合でも、便利なツールとしてよく使用されます。一般化を明示的に実行するのは簡単であるため、多ソート代数構造が厳密な方法で定義されることはめったにありません。これが、多ソート代数の理論をソフトウェア設計にうまく適用できる理由です。
Alex Stepanov は、OOP よりも ADT とジェネリック プログラミングを好むと言いたかったのです。これにより、厳密な数学的/代数的基礎を備えたプログラムを作成できるからです。彼の努力にとても感謝しています。代数的設計は常に正確で、厳密で、美しく、単純であり、より良い抽象化をもたらすことは誰もが知っています。