21
Class Diagrams http://creativecommons.org/ licenses/publicdomain/

Jiemamy Uml4

  • Upload
    jiemamy

  • View
    533

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Jiemamy Uml4

Class Diagrams

http://creativecommons.org/licenses/publicdomain/

Page 2: Jiemamy Uml4

RootModel

1

DataSetModel

DomainModel0..*1

EntityModel

0..*

1

ColumnCheckConstraint

0..11

NotNullConstraint

0..11

ViewModel TableModel

AttributeModel0..*

1

IndexModel

0..*

1

IndexColumnModel

1..*1

ColumnRef«enum»SortOrder

0..1 11

ColumnModel

0..1

1

DataType

1

1

0..1

1

0..110..1

1

Primarykey

TableCheckConstraint

BuiltinDataTypeDomainRef

0..*1

0..*1 RecordModel

Map<ColumnRef, String>

11

«enum»DataTypeCategory

1

1

1

0..*

UniqueKey

ForeignKey

1

«enum»MatchType

«enum»Referential

Action

0..1

0..1

Deferrability

0..1

«enum»InitialyCheck

Time

0..1

モデル俯瞰図

Map.Entry

TableRef

List<RecordModel>

このページで、いきなり内容を覚えられなくても、理解できなくても大丈夫です。まずは全体がどんな感じになっているのか眺めて、後からまとめとして

見直すのが良いと思います。

Page 3: Jiemamy Uml4

RootModel

DataSet

DomainModel

EntityModel

AttributeModel

IndexModel

IndexColumnModel

ConstraintModel

RecordModel

jiemamy: Jiemamyid: UUID

JiemamyElement

ほぼ全てのモデルはJiemamyElementを実装。

つまり、IDを持っている。

ただし、DataTypeとElementReferenceだけは例外。

adapters: List<Object>

Adaptable

JiemamyElementはAdaptableを実装している。(アダプタを登録可能)

アダプタは「動的にinterfaceを追加する」という要件を擬似的に(言語仕様的には無理だから)実現するための仕組み。「Extension Objectパターン」とも呼ばれる。例えば Adaptable#registerAdapter(comparableImpl); とした場合、Adaptable#getAdapter(Comparable.class); でcomparableImplが取得できる。これらの操作は、registerAdapter が implements Comparable を意味し、getAdapter は Comparable へのキャストに相当する。

いきなりちょっと慣れないパターンで難解だと思いますが、ポイントです。

JiemamyElementと

Adaptable

Page 4: Jiemamy Uml4

1

DataSet DomainModel

0..*

1

EntityModel

0..*

1

ViewModel TableModel

0..*

dialectClassName: StringbeginScript: StringendScript: Stringdescription: StringschemaName: Stringdomains: List<DomainModel>entities: SortedSet<EntityModel>dataSets: List<DataSet>

RootModel

データモデルのRootある時点のDBの状態をあらわす

とにかく多用するクラス。

RootModelまわり

Page 5: Jiemamy Uml4

テーブル

カラム等の「属性」とインデックスで構成

AttributeModel0..*1

IndexModel

0..*

1

ColumnModelTableConstraint

ビューは、文字列で定義文を持つ。

CREATE VIEW hoge AS ...以降のSELECT文が定義文。

name: StringlogicalName: StringbeginScript: StringendScirpt: Stringdescription: String

EntityModel

definition: String

ViewModel

attributes:List<AttributeModel>indexes: List<IndexModel>

TableModel

ER図の「E」の要素Entity = 実態

要は、テーブルとビュー

RootModel 0..*1

Entity, Tableまわり

Page 6: Jiemamy Uml4

ColumnModelTableConstraint

PrimaryKeyUniqueKey

KeyConstraintTableCheckConstraint

name: StringlogicalName: Stringdescription: String

AttributeModel

テーブルが持つ属性

CREATE TABLE文の () の中にカンマ区切りで書かれるもの、という概念でOKです。

つまり、カラムと各種制約

TableModel 0..*1

RootModel EntityModel0..*1

LocalKeyForeignKey

属性まわり

Page 7: Jiemamy Uml4

ColumnCheckConstraint

NotNullConstraint

0..11

DataType11

0..11

PrimaryKey

0..1

1

UniqueKey

0..11

dataType: DataTypedefaultValue: StringcheckConstraint: ColumnCheckConstraintnotNullConstraint: NotNullConstraintprimaryKey: PrimaryKeyuniqueKey: UniqueKey

ColumnModel

カラム

名前やデータ型、各種制約を持つ。

カラム定義に伴って設定できる制約

CREATE TABLE FOO ( COL1 INTEGER UNIQUE, COL2 INTEGER PRIMARY KEY, COL3 INTEGER NOT NULL, COL4 INTEGER CHECK (COL4 > 0));ちなみに、それぞれ1個ずつしか定義できない。

TableModel 0..*1

RootModel EntityModel0..*1

name: StringlogicalName: Stringdescription: String

AttributeModel

カラムまわり

Page 8: Jiemamy Uml4

DomainModelTableModel

ColumnRef

ColumnModel

DomainRefTableRef

jiemamy: JiemamyreferenceId: UUID

ElementReference<T extends JiemamyElement>

T - TableModelT - ColumnModel

T - DomainModdel

とあるJiemamyElementへの参照オブジェクト

Declaration = 宣言Reference = 参照

例えば、以下における2行目のCOL1は宣言、3行目のCOL1、及びCOL2は参照である。

CREATE TABLE FOO ( COL1 INTEGER NOT NULL, FOREIGN KEY COL1 REFERENCES BAR(COL2));

ちなみに、BARはテーブルに対するReference、FOOはDeclarationです。

DeclarationとReference

Page 9: Jiemamy Uml4

1..*

1

ColumnRef

0..1 1

1

RootModel EntityModel0..*1

TableModel 0..*1name: Stringunique: booleanindexColumns: List<IndexColumnModel>

IndexModel

columnRef: ColumnRefsortOrder: SortOrder

IndexColumnModel

ASCDESC

«enumeration»SortOrder

インデックス

インデックス名、一意indexかどうか、

カラムの組み合わせ(参照)、ソート順

を持つ。

インデックスまわり

Page 10: Jiemamy Uml4

TableModel 0..*1

RootModel EntityModel0..*1

keyColumns: List<ColumnRef>deferrability: Deferrability

KeyConstraintColumnRef 1..* 1

TableConstraint

name: StringlogicalName: Stringdescription: String

AttributeModel

このカラムが制約を受ける。

0..1

0..1

deferrable: booleaninitiallyCheckTime: InitiallyCheckTime

Deferrability

IMMEDIATEDEFERRED

«enumeration»InitialyCheck

Time

LocalKey

PrimaryKey UniqueKey

外部キーではないキー制約。

遅延評価の設定

INSERTしたら即座にキー制約違反としてエラーにするのか、COMMITするまで制約の評価を遅延させるのか、

を設定する

キー制約

Page 11: Jiemamy Uml4

ColumnRef 1..* 1

0..1

TableModel 0..*1

RootModel EntityModel0..*1

matchType: MatchTypeonDelete: ReferentialActiononUpdate: ReferentialActionreferenceColumns: List<ColumnRef>

ForeignKeyModel

keyColumns: List<ColumnRef>deferrability: Deferrability

KeyConstraint

CASCADESET_NULLSET_DEFAULTRESTRICTNO_ACTION

«enumeration»Referential

Action

0..1

SIMPLEFULLPARTIAL

«enumeration»MatchType

ColumnRef 1..* 1

TableConstraint

name: StringlogicalName: Stringdescription: String

AttributeModel

外部キー

制約名制約を受ける(キーとなる)カラム制約する(参照する)カラム

マッチ型ON DELETE/UPDATEの設定

を持つ。

ER図の「R」の要素Relation = 関連

このカラムによって(↓に続く)

このカラムが制約を受ける。

外部キー制約

Page 12: Jiemamy Uml4

ColumnCheckConstraint0..11

NotNullConstraint0..11

DataType

BuiltinDataTypeDomainRef

1

1

RootModel 0..*1

name: StringlogicalName: StringdataType: BuiltinDataTypedescription: StringcheckConstraint: ColumnCheckConstraintnotNullConstraint: NotNullConstraint

DomainModel

ドメイン(ユーザ定義型)

ドメイン名、実体の型、

設定できる制約(NNとCHECK)

を持つ。

ドメインの参照は、データ型としてふるまう事ができる。

これ、難解なのでポイントです。

ドメインまわり

Page 13: Jiemamy Uml4

アダプタ

RootModel DomainModel0..*1

EntityModel

0..*

1

TableModel AttributeModel0..*1

ColumnModel 11

DomainRef

«enumeration»DataTypeCategory

1

11

toBuiltinDataType(): BuiltinDataType

DataType

category: DataTypeCategorytypeName: String

BuiltinDataType

DataType型は、必ずいずれかのBuiltinDataTypeに還元できる。

自分がBDTならば、自分自身を返し、DomainRefならば、対応する

DomainModelが持つBDTを返す。

DB組み込み(ビルトイン)つまり元からDBが備えているデータ型。primitiveな型。

Adaptableを実装している。(DataTypeはJiemamyElementではないから)

adapters: List<Object>

Adaptable

BuiltinDataTypeに対するoptionalなモデルVARCHARのサイズなど、型に依存した付加的な情報はここに保持される。

size: Integer

SizedDataTypeAdapter

0..*

1

precision: Integerscale: Integer

PrecisionedDTAdapter

serial: Boolean

SerialDataTypeAdapter

等。自由

データ型とアダプタ

Page 14: Jiemamy Uml4

Map.Entry

Map.Entry

TableRef

0..*

1

RecordModel

RootModel

0..*

1

name: Stringrecords: Map<TableRef, RecordModel>

DataSetModel

ColumnRef

String

List<RecordModel>

データセット

INSERT文用のデータモデル。RootModelは複数のデータセットを

保持することができる。

0..*1

0..*1

データセット

Page 15: Jiemamy Uml4

ColumnCheckConstraint

NotNullConstraint

TableConstraint

PrimaryKey UniqueKey

ConstraintModel

KeyConstraint

ColumnConstraint

ValueConstraint

CheckConstraintForeignKey LocalKey

TableCheckConstraint

制約この型を頂点に、結構カオスなのでポイントです。

テーブルにsetできる制約 カラムにsetできる制約

値の制約他のテーブル/カラムのデータに影響されない系。

各種キー制約他のテーブル/カラムのデータに影響される系。

制約モデルクラス俯瞰図

Page 16: Jiemamy Uml4

adapters: List<Object>

RootModelrootModel: RootModelpresentations: List<DiagramPresentationModel>

DiagramPresentations11

1 1

name: StringnodeProfiles: Map<NodeAdapter, NodeProfile>connectionProfiles: Map<ConnectionAdapter, ConnectionProfile>mode: Modelevel: Level

DiagramPresentationModel0..*

1

Map.Entry Map.Entry

entityModel: EntityModel

NodeAdapter

color: JmColorboundary: JmRectangle

NodeProfile

0..*1

0..*1

coreForeignKey: ForeignKey

ConnectionAdapter

color: JmColorbendpoints: List<JmPoint>

ConnectionProfile

PHYSICALLOGICAL

«enumeration»Mode

ENTITYKEYATTRATTRTYPE

«enumeration»Level

adapters: List<Object>

EntityModel

Adapter

adapters: List<Object>

ForeignKey11

Adapter

11

Adapter

1 1 11

red: intgreen: intblue: int

JmColor

x: inty: intwidth: intheight: int

JmRectangle

x: inty: int

JmPoint

1枚のER図をあらわす

複数のER図をあらわす。

RootModelのアダプタとして保持される。

ERにおける実体ではなく、ダイアグラムにおけるノードをあらわす。

モノは一緒なんだが、概念的意味的・責務的に微妙に違う。

EntityModelのアダプタとして保持される。

ERにおける関連ではなく、ダイアグラムにおける

コネクションをあらわす。

モノは一緒なんだが、概念的意味的・責務的に微妙に違う

ForeignKeyのアダプタとして保持される。

Jiemamy viewまわり

Page 17: Jiemamy Uml4

Map.Entry

Jiemamy JiemamyImplementation11

InstanceProvider<Dialect>

1

1

ReferenceResolver11

EventBroker1

1

Map<Jiemamy, JiemamyFactory>

11

JiemamyFactory

0..*1

0..*

1

Map<UUID, JiemamyElement>11

CommandListener

0..*

1

1

1

1

1

RootModel1

1

DispatchStrategy

Dialectのインスタンスを引き当てる

Jiemamyの実装をあらわす

モデルIDから実体を引き当てる

モデルに変化があった時にリスナーに通知する

コンテキストオブジェクト

モデル、その他のインスタンスを生成する

JiemamySerializer

JiemamyFacade

«create»

«create»

«create»

JiemamyElement Element

Reference<T>

«create»

DataType

«create»

adapter:Object

«create»

ロジッククラス俯瞰図

通知を受けるクラス

どんな条件の時(どの値が変わった時等)通知を受けたいのか?判断する戦略クラス。

ArtemisExtender

0..*1

JiemamyImplementationを拡張するオブジェクト(ArtemisView が代表例)このExtenderによって、JiemamyFactoryの機能がenhanceする(増える/変化する)。通常はDiagramPresentationModelの生成できないが、Extenderによって生成できるようになる。また、拡張なしではRootModelはDiagramPresentationsをアダプタとして持っていないが、拡張することにより生成時に自動的にアダプタ追加が行われる。EntityModelに対するNodeAdapterやForeignKeyModelに対するConnectionAdapterも同様。このページでこのExtenderだけは仕様外。

Page 18: Jiemamy Uml4

adapters: List<Object>

Adaptable0..* 1

JiemamyFactory

«create»

Class<T extends JiemamyElement>

«reference»

JiemamyElement

JiemamyFactoryがJiemamyElementを作る時は、Classを参照して、その指定されたクラスのインスタンスを生成する。

JiemamyElement生成時、FactoryExtension + ArtemisExtenderの

ロジックに従って、生成する実装クラスを選び、さらに自動的に必要なアダプタのみを登録する。

JiemamyElement生成ロジック

アダプタ

NodeAdapter

DiagramPresesntations

ConnectionAdapter

FactoryExtension«use»

Page 19: Jiemamy Uml4

«enumeration»DataTypeCategory

adapters: List<Object>category: DataTypeCategorytypeName: String

BuiltinDataType

0..* 1

アダプタ

size: Integer

SizedDataTypeAdapter

precision: Integerscale: Integer

PrecisionedDTAdapter

serial: Boolean

SerialDTAdapter

1

JiemamyFactory

«create»

DataTypeMold<T extends DataType>

T - BuiltinDataType

category: DataTypeCategoryname: Stringaliases: String[]supportedAdapterClasses: Class<?>[]

BuiltinDataTypeMold DomainModel

T - DomainRef

«reference»

DataType

DomainRef

JiemamyFactoryがDataTypeを作る時は、

DataTypeMoldを参照して、DataType型のインスタンスを生成する。

MoldがDomainModelであればDomainRefを、BuiltinDataTypeMoldであればBuiltinDataTypeを

生成する。

BuiltinDataType生成時、BuiltinDataTypeMold#supportedAdapterClasses

に従って、自動的にアダプタを登録する。データ型生成ロジック

Page 20: Jiemamy Uml4

Dialect

DataTypeResolver

ConnectionAdvisor

SqlEmitter

MoldManager

EntityImportVisitor

ForeignKeyImportVisitor

1

1

1

11

1

1

1

1

1

1

1

SQL方言

RDBMSごとの差異を吸収する戦略クラス

1. DatabaseMetadataから読み込んだ データをBuiltinDataTypeに解決2. DataTypeをSQL用の型文字列に解決

BuiltinDataTypeMold1..*1

BuiltinDataTypeからBuiltinDataTypeMoldの解決

RootModelからSqlStatementのリストを生成

DatabaseMetadataからRootModelに情報を読み込む

仕様内

仕様外

Dialectまわり

現在、あまり気にしなくてよいw

Page 21: Jiemamy Uml4

SqlEmitter 仕様外

SQL生成まわり

TokenResolver11

0..*1

IdentifierKeyword Literal OperatorSeparator

SQL文 単語

予約語識別子(カラム名テーブル名など)

リテラル 括弧等 演算子

ReferentialAction,MatchType, SortOrder

InitialyCheckTime等をToken列に変換する

仕様内

RootModel

«create»«reference»

List<SqlStatement>

0..*

1

toString(): String

Token

toString(): String

tokens: List<Token>

SqlStatement

SqlFormatter «use»