-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第2章 共通性分析 #2
Comments
2.1 共通性:抽象のエッセンスp.38
基本的な立場 2.1.1 演繹的共通性と帰納的共通性p.39
アスペクト(様相)=相貌 2.2.2 設計の認識論p.46 2.3 共通性次元と共通性カテゴリp.50
2.3.1 データ構造p.53
"locus" (Latin for "place" or "location") ここで言っている「座」がよく分かりません。 2.4.2 名前と振る舞いp.63
この記述から、「ドメイン」と「ファミリ」という言葉を理解できる。図2.4(p.50)左側で、Numberを頂点とする階層全体が「Numberドメイン」である。
疑問「共通性分析によって得られるカテゴリ」=「ドメイン」とするならば、共通性分析には様々な次元があって、1つの対象に対して次元ごとにいろいろなドメインを見いだしうる。上の例では、Numberという構造から見たドメインと、operatorという振る舞いから見たドメイン、と言えることになる。この後者をドメインと呼ぶのかどうか、本の用例などを見ると曖昧なように思う。 2.5 共通性分析のレビューp.67
共通性分析によって得られるカテゴリ = ドメイン 共通性分析における、自問自答
2.6 共通性とシステム拡張p.68
時間的にも安定している共通性を探し出すということ p.69
|
@hidenorigoto ここではカテゴリ=ファミリであると思いますが、ドメインとファミリの関係は1.3.5 ファミリと共通性分析 (pp.11-12)に書かれていて、ファミリはドメインといえるが、ドメインはファミリを形成しないものがあるため、必ずしもファミリとはいえない、と理解しました。 |
@iteman ありがとうございます。ファミリとドメインは、その言葉が指す対象が似ているけれども、表している事柄は違いますね。 |
分析の基礎的ツールとしての抽象
|
抽象とパラダイム
抽象はオブジェクトパラダイムのみに由来するものではない。 |
共通性と抽象ソートすること
行列
|
p.57の以下の2つの箇所、英語ではどういう文章なのか分かりますか?
|
@hidenorigoto 博士論文のバージョンになりますが、以下のようになります。
|
@iteman ありがとうございます。 |
こちらのリンクもなかなかおもしろかったです。 http://web.cc.yamaguchi-u.ac.jp/~ysekigch/qual/grounded.html これを読むと、グラウンデッドセオリーも、カテゴリー理論との関わりが大きいのかなと。 |
→ 文章が難解に感じるのですが、「経験的に分からない場合もあるよね」というような単純な話をしていると思っていて良いでしょうか・・・。 |
→ 言い換えると、人が理解しやすいもともとの概念レベルでのグルーピングと、構造化したモジュールの境界とでは、成り立ち方がそもそも違うので、自然に一致したりはしない。 |
【不明点の質問】 |
今まで、自分の中では「アルゴリズム」と「振る舞い」を同じような意味の言葉としてに一緒くたに使っていた(どちらも、手続き、機能、動的、というようなイメージだった)ので、意味を確認。
overloadScala例(メソッドの多重定義。分数と整数の間で加算を行うメソッド): class Rational(n: Int, d: Int) {
private val g = gcd(n.abs, d.abs)
val numer = n / g // 分子
val denom = d / g // 分母
def + (that: Rational): Rational =
new Rational(
numer * that.denom + that.numer * denom,
denom * that.denom
)
def + (i: Int): Rational =
new Rational(number + i * denom, denom)
// 中略
} |
p. 42
帰属させる?という言葉が分かりにくかったのですが、原文を見て理解しました。 英語論文
ascribe の単語の意味(English Theasaurus)
→ 辞書を使うことにより、ドメインのピース群や、全体としてのドメインに対して、意味を与えることができる。 という意味と分かりました。 |
英語バージョンはこちら↓ですね。翻訳でよく分からなかったときに見てみようと思います。 |
p.60 CRCカード
|
2.3.2 名前と振る舞いp.60
5.1.4節にこれは「共通のセマンティクス、すなわち意味を背景とする「振る舞いの可変性」である」という記述があります。(p.115) セマンティクス、意味 = 共通性 というくくりになるのかと。 |
共通性分析の重要な点
二つの共通性の認知方法
ソフトウェアファミリ
データ構造と機能(function)を、構造(structure)、名前(name)、振る舞い(behavior)といった評価基準(共通性次元)に基づいてグルーピングしたもの。 ドメインとモジュール
複数のモジュールにまたがるドメインの例としては、フレームワークモジュールがあるドメインの基底クラスを提供し、アプリケーションモジュールがその拡張クラスを作成する、というものが考えられる。OSGiバンドルのような拡張ポイント(例: 問題ドメインの構造に沿った解決ドメインの構造
これは解決ドメインにおいて問題ドメインの構造(アーキテクチャ)を直接的に表現する(解決ドメインにそのような部分を作る)ことを目指すことだと思う。このことはドメイン駆動設計におけるモデル駆動設計に相当する。 共通性から問題ドメインの構造を導く
共通性分析によって問題ドメインの構造(アーキテクチャ)を作る。 ドメインの語彙
ドメイン辞書
ファミリのために設計する
広い領域に適用できるソリューションを考えるには、この制約を打ち破らなければならない。
あるアプリケーションを作る際に、そのアプリケーションをフレームワーク(手作りでもよい)とその最初のクライアントという構成に意図的に持ち込むことで、共通性を見つける機会の制約を打ち破り、広い領域に適用できるソリューションを作り出そうということである。このときアプリケーション分析ではなくドメイン分析を行うことになる。 ドメイン分析のメリット
ライブラリ・フレームワークとドメイン分析多くのライブラリやフレームワークの開発においては実質的にドメイン分析が行われているといえると思う。 可変性分析
汎用性とトレードオフ
汎用性の高いソフトウェアは柔軟性に欠けるという意見をよく見かけるが、決してそうではないということ。 用語のトレーサビリティ
問題ドメイン分析と解決ドメイン分析
例えば、DOAをソリューションドメインと見ると、DOAの形をしたナイフを使って、アプリケーションドメインを切り取っているということになる。その結果作られる概念モデルはソリューションから独立したものではないと思う。 共通性分析・可変性分析と共通性カテゴリ
共通性分析と可変性分析の実施タイミング
抽象データ型
責務駆動とデータ構造
共通性カテゴリと現代のカテゴリ理論
共通性分析が生み出すカテゴリ(ドメイン)は古典的モデルに見られる数多くの特性(カテゴリ同士は連結しないのが普通で、すべてのカテゴリ構成員に傑出してみられるような特性)を有しているが、この結果に対してプロトタイプ理論や基本的カテゴリ等に立脚する分類から得られる特性を持たせることができる。 時間が経過しても安定している抽象を切り出す
|
読書会での説明が言葉足らずだった部分もあるかと思いましたので、C/C++コードに関しての補足を置いておきます。 はじめに
class Foo {
void bar(); // メンバ関数
};
void buzz(); // フリー関数
...
Foo f;
f.bar(); // メソッド呼び出し。objectが必要
buzz(); // フリー関数 2.4.1 構造p.61 typedeftypedef struct _Point { int xpos; int ypos; } Point;
という2つを行っている。以下の(1)(2)はまったく同じ意味。 struct _Point p; // (1), C言語時代のdefault syntax
Point p; // (2), typedefするとこう書ける こういった構造体定義の書き方をするのはC言語のみで、C++では素直に以下のように書く。 struct Point { int xpos; int ypos; };
Point p; p.62 Listhttp://ja.wikipedia.org/wiki/連結リスト class Node {
int data;
Node *next;
};
class List {
public:
...
private:
Node* first_node;
}; 何を格納するのかによってint dataの箇所だけ変える必要があり、それに依存してNode型のサイズも変わるが、他の部分はすべてのListで共通している。こういった場合、テンプレートクラスを使うことで類似性を表現できる。
Listを使う場所ではXがどの型なのかを明示する必要がある。 List<int> int_list;
List<Point> point_list; 人間がIntList, PointList...といったコピペクラスを量産する代わりに、コンパイラが内部でListのコピペを生成している。所詮ただのコピペなので、実体化したクラスの数に比例してオブジェクトコードは膨張するし、ListとListの間は何の関係も無い別クラスとみなされる。 2.4.2 名前と振る舞い(C++コード的な意味で)2章最難関。 p.63 operator +とoperator +=
フリー関数の呼び出しは静的に解決されるため、どのoperator +が呼ばれるのかはコンパイル時点で決まってしまう。実行時バインドを実現するためにoperator+から仮想メンバ関数のoperator+=を呼び出すことで、実行時の型に合わせて加算アルゴリズムを呼び分けている(p.64中段のコード)。 p.64 多重定義アプローチ
operator+=は左辺に対して定義する必要があるが、C++ではintなど組み込みの型に対してメソッドを定義できないため、そのままでは上手く扱えない。 class Complex {
public:
Complex(); // (1) デフォルトコンストラクタ
Complex(int n); // (2)
};
void foo(const Complex& c);
Complex operator + (const Complex &n1, const Complex &n2); // (3)
...
int i;
Complex a; // (1) が実行
Complex c(2); // (2)が実行
a = i + c; // (2)が実行、int=>Complexの暗黙変換が発生。その後(3)が実行 ここでいう多重定義アプローチは、p.63で挙げていたoperator+の多重定義ではなく、Complexのコンストラクタの多重定義の話。 2.4.3 アルゴリズムp.65
"戻り値無し、引数無しのFloorPlanクラスのメソッド"を引数にとるメソッド。fは仮引数。 p.66 バインディング時期C++では「値」「参照」「ポインタ」の3通りの方法でオブジェクトにアクセスできる。
メソッドが仮想関数で、かつ参照/ポインタ経由で呼び出した場合にのみ実行時バインディング。それ以外のケースではコンパイル時バインディング。 FloorPlan *q = new FloorPlanWithArrows():
q->redraw(); と書くと、コンパイラの最適化でコンパイル時にバインドする場合があります。(qが明らかにFloorPlanWithArrowsを指しているため) |
@nyanp ありがとうございます。大変参考になります。 |
共通性分析の目標
|
オフトピックですが、自分が日本語で馴染みのなかった言葉の原文を確認しました。 p.39 抽象を「定式化」?↓ ドメインの語彙を「形式化」?↓ |
データ分析とオブジェクト指向分析
データ構造という設計次元に対して、データ分析のデータ構造とオブジェクト指向分析のデータ構造として分離し、それぞれ別に扱っていく必要があるということだろうか。 |
オブジェクト指向分析はデータ分析よりもデータ設計に優れているか?
|
未知の構造の認知
|
The text was updated successfully, but these errors were encountered: