確かに非常に興味深い質問です。このトピックに関する記事を見つけました。簡潔に次のように述べています。
抽象化は無関係な詳細を隠すことで複雑さを軽減しますが、一般化は、同様の機能を実行する複数のエンティティを 1 つの構造に置き換えることで複雑さを軽減します。
図書館の本を管理するシステムの古い例を見てみましょう。本にはたくさんのプロパティ (ページ数、重さ、フォント サイズ、表紙など) がありますが、私たちのライブラリの目的では必要なだけかもしれません。
Book(title, ISBN, borrowed)
ライブラリ内の実際の書籍から抽象化して、アプリケーションのコンテキストで関心のあるプロパティのみを取得しました。
一方、一般化は詳細を削除しようとはしませんが、機能をより広い (より一般的な) 範囲のアイテムに適用できるようにします。StringList
ジェネリック コンテナーは、その考え方の非常に良い例です。 、などの実装を記述したくないため、( Scalaのように) すべての型に適用されるジェネリックIntList
List を記述します。詳細や操作を削除していないため、リストを抽象化していないことに注意してください。すべてのタイプに一般的に適用できるようにしただけです。List[T]
ラウンド2
@dtldarekの答えは本当にとても良い例です! それに基づいて、さらに明確にする可能性のあるコードを次に示します。
私が言ったことを覚えてBook
いますか?もちろん、ライブラリには他にも借りることができるものがあります (Borrowable
おそらく単語でさえありませんが、これらすべてのオブジェクトのセットを呼び出します:D):
これらのアイテムはすべて、データベースとビジネス ロジックに抽象的な表現があり、おそらくBook
. Borrowable
さらに、すべての sに共通する特性を定義する場合があります。
trait Borrowable {
def itemId:Long
}
次に、すべての に適用される一般化されたロジックを記述できますBorrowable
(その時点では、それが本か雑誌かは気にしません)。
object Library {
def lend(b:Borrowable, c:Customer):Receipt = ...
[...]
}
要約すると、すべての書籍、雑誌、DVD の抽象的な表現をデータベースに保存しました。正確な表現は実行可能でも必要でもないためです。それから私たちは先に進み、言いました
本、雑誌、DVDの貸出は問いません。それはいつも同じプロセスです。
したがって、借りることができるすべてのものを s として定義することにより、アイテムを借りる操作を一般化Borrowable
しました。