負の可変性
書籍「マルチパラダイムデザイン」の紹介を聞いていて面白そうな概念だと思ったので調べてみた
第3章 可変性分析 · Issue #3 · phpmentors-jp/mpdosaka
PHP Mentors — Debasish Ghosh氏のブログ記事「ドメイン駆動設計:可変性の管理」を翻訳しました
2006年9月18日
マルチパラダイムデザイン
2000年8月 "Multi-Paradigm Design and Implementation in C++"
今回の記事に関連して,著者がオブジェクト指向シンポジューム2000(ソフトウェア工学研究会主催,2000年8月開催)などで使用してきたプレゼンテーション資料"Multi-Paradigm Design and Implementation in C++"の 翻訳 を許可してもらいました.この資料は,(著者自身が作成しているので当然といえば当然ですが(^^;;,) マルチパラダイムデザインの全容をコンパクトにうまく説明しています.
著者James O. Coplienによる資料の和訳
2005年時点でドメイン消滅
WebArchiveと同一のものがこちらにある
最も多い抽象とは「階層」である.システムがレイヤ構造や階層構造に分割できるほど単純な場合には,これは適切である.オブジェクトパラダイムでは,このように考えて,クラス階層と実装階層の両方を構築しようとする徴候がある.しかし,現代のシステムに内在する複雑な構造は,本質的に階層構造に帰すことができるというものでもない.まず,スケールの問題がある.コード行が100のオーダーかもしれないし,1000,あるいは,1億,10億,100億のオーダーかもしれない.このようなスケールのものを単純な階層構造で適切に分析することはできない.
リンク先のPDFはパスワードが掛かっている
時期と著者からするとこれかな PDF
博士論文みたいだから一般向け図書よりは厳密な書き方されてそう
書籍が1998年、こちらが2000年
Chapter 2 Commonality Analysis
3.3 Positive and Negative Variability
先に共通点を見出す分析をしてから違いを見る。例えばメッセージはヘッダーとボディを持ってるなーと思う。これが共通性。
だけど詳しく分析したら「ACKメッセージはボディを持ってないじゃん!」とかなる
こういう共通性を壊す可変性が負の可変性
この例だと「ACKは長さ0のボディを持つ」とすることで負の可変性を消すことができるが、それはよくない
「ACKのチェックサムは?」
必要のないインターフェースを持つことは認知的負荷を増やす
時間やメモリ消費にもオーバーヘッドが発生しうる
小さい負の可変性はifdefで扱えるが、スケールしないので、ドメインを分割することを考える
>マルチパラダイムデザインの負の可変性とリスコフ置換原則はセットで考えてもいいのかも。負の可変性をクラス継承で考えたときに、リスコフ置換原則が破られているはず。
負の可変性の現れは、新たなドメイン(さらにいえば存在)の創造のチャンスなんだと思います。
https://twitter.com/iteman/status/1171097073082486785
p.89に書いてある
Positive variability is the preferred mode of design under multi-paradigm design because it most often leads to design support by additional formalisms. For example, one can use the Liskov substitutability principle when applying inheritance to express positive variablity. Multi-paradigm accommodates negative variability as well, often by appealing to existing techniques such as inheritance with cancellation.
テンプレート, #ifdefというのは,本来オブジェクト指向言語要素ではありません.しかし,C++プログラマはこれを使いこなしている,もしくは使いこなすことが求められます.たとえば,どのような場合に通常のクラスを定義して,どのような場合にテンプレートを使えばいいのでしょうか.