EMF勉強会

2,549 views

Published on

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,549
On SlideShare
0
From Embeds
0
Number of Embeds
254
Actions
Shares
0
Downloads
6
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

EMF勉強会

  1. 1. Eclipse Modeling Project による MDA の実践 ©Actier, Inc. All rights reserved.
  2. 2. 自己紹介 名前 : 大島則人 所属 : 株式会社アクティア 代表取締役社長 URL : http://www.actier.co.jp 技術領域 Java アーキテクト モデル駆動型ソフトウェア開発 ©Actier, Inc. All rights reserved.
  3. 3. なぜモデル駆動型ソフトウェア開発なのか?動かないモデルはただのスケッチだ! ©Actier, Inc. All rights reserved.
  4. 4. 本日のアジェンダ MDA (Model-Driven Architecture) とは? Eclipse Modeling Project の活用  ATL (ATLAS Transformation Language) の利用  Acceleo の利用 まとめ ©Actier, Inc. All rights reserved.
  5. 5. MDA とは?©Actier, Inc. All rights reserved.
  6. 6. MDA とは? Wikipedia によると…  アーキテクチャから設計を分離し、設計とアー キテクチャがそれぞれ独立して変更できるよう な技術を確立するということ…(一部抜粋)  実装技術やソフトウェアアーキテクチャが変化 しても、機能的要求仕様の概念設計が依然とし て利用可能となることを意図している…(一部 抜粋) ©Actier, Inc. All rights reserved.
  7. 7. アーキテクチャと設計の分離 やりたいこと(設計) 注文 注文を登録する 顧客 顧客を検索する Java Tomcat エンジニアWebブラウ httpd Struts/Java ザ RDBMS 実現手段(アーキテクチャ) ©Actier, Inc. All rights reserved.
  8. 8. 新しいアーキテクチャへの対応 やりたいこと(設計) 注文 注文を登録する 顧客 顧客を検索する Scala エンジニアWeb Play/Scalaブラウ httpd ザ(JQuery) KVS 実現手段(アーキテクチャ) ©Actier, Inc. All rights reserved.
  9. 9. 概念設計が依然として利用可能 やりたいこと(設計)のライフサイクルは長い 実現手段(アーキテクチャ)のライフサイクルは短 い 新規開発よりも長年保守しているシステム  アーキテクチャが古くなる  機能追加や仕様変更も古い技術に頼る 全部新しい技術で作り直しは現実的でな い! ©Actier, Inc. All rights reserved.
  10. 10. MDA が目指すもの やりたいこと(設計) 注文 注文を登録する 顧客 顧客を検索する Java Generator TomcatWebブラウ httpd Struts/Java ザ RDBMS 実現手段(アーキテクチャ) ©Actier, Inc. All rights reserved.
  11. 11. 技術の変化に合わせて やりたいこと(設計) 注文 注文を登録する 顧客 顧客を検索する Scala モデル(設計)をコンパイル可能とすること GeneratorWeb Play/Scalaブラウ httpd ザ(JQuery) KVS 実現手段(アーキテクチャ) ©Actier, Inc. All rights reserved.
  12. 12. モデルから成果物ができるまで やりたいこと 実現手段の中間モデル(PIM:Platform Independent Model) (PSM:Platform Specification Model) ICustomer 顧客 モデル 変換 Customer テキス ト変換 実現手段の成果物 モデルコンパイラによる自動化 public interface ICustomer { } public class Customer implements ICustomer { } ©Actier, Inc. All rights reserved.
  13. 13. 何に対して独立か? Platform Independent Model  何を Platform と定めるか特に規程が無い… MDA が定めるモデルの役割  Computate Independent Model コンピュータ独立モデル(PIM の上位モデル)  Platform Independent Model プラットフォーム独立モデル  Platform Specification Model プラットフォーム特化モデル PIM はコンピュータを使って実現できるレベルのモデルということでも、言語や実行環境、OS、フレームワーク に依存しないレベルという 理解 → DAO とか DTO レベルのモデルは作るべし! ©Actier, Inc. All rights reserved.
  14. 14. そもそもモデルって? またまた Wikipedia…  物ごとを説明するための枠組み(一部抜粋)  幾何学的な図形を用いた概念や物体を用いた理 論(一部抜粋) オブジェクトモデルは… 識別子があって、属性があって、操作、関連がある UML クラス図はモデルの表現手段(見せ方)の一種でしかない ©Actier, Inc. All rights reserved.
  15. 15. MDA が定めるモデル MOF メタメタモデル定義 (Meta Object Facility) UML CWM メタモデル定義(Unified Modeling Language) (Common Wharehouse Metamodel) UML Instance CWM Instance モデル定義MOF によって定義されるメタモデルを持つモデルを MDA ではモデルとして扱う→ XMI (XML Metadata Interchange) により XML で表現できる! ©Actier, Inc. All rights reserved.
  16. 16. つまり MDA とは MOFで定義されたモデルをモデル変換、テ キスト変換を使って実現手段となる成果物を 自動生成する仕組みのガイドライン モデルから実現手段となる成果物を自動生成 するモデル駆動型開発のガイドライン (UML)モデルから実現手段となる(Java ) コードを自動生成するモデル駆動型開発を実 現する ©Actier, Inc. All rights reserved.
  17. 17. Eclipse Modeling Project の活用 ©Actier, Inc. All rights reserved.
  18. 18. Eclipse Modeling Project の活用 言うまでもなく、オープンソース Eclipse Modeling Framework  EMF 対応のモデル駆動型開発ツールの存在 Eclipse Modeling Tools Platform  モデル駆動型開発プラットフォームの提供  M2M プロジェクト  M2T プロジェクト  無料で使える! ©Actier, Inc. All rights reserved.
  19. 19. M2M (Model To Model) Project モデル駆動型開発のモデル変換部分を提供  ATL (Atlas Transformation Language)  Operational QVT  Declarative QVT OMG 標準は QVTo / QVTd  サンプルやドキュメントが見当たらない (極めて少ない) ATL は QVT Like  サンプルやドキュメントが多く実績ありそう ©Actier, Inc. All rights reserved.
  20. 20. M2T (Model To Text) Project モデル駆動型開発のテキスト変換部分を提供  JET  Acceleo  Xpand OMG 標準は Acceleo  フランスの Obeo 社で開発、実績共に問題なさそう JET / Xpand は EMF 独自?  テンプレートの書式が違うだけでテキスト変換は可能 ©Actier, Inc. All rights reserved.
  21. 21. ATL の利用©Actier, Inc. All rights reserved.
  22. 22. ATL Concepts ©Actier, Inc. All rights reserved.
  23. 23. もう少し分かり易く… Ecore は MOF の EMF 実装 UML CWM 変換プログラ ムUMLモデル CWMモデル UML 独自メタモデ ル 変換プログラ ム UMLモデル 独自モデル ©Actier, Inc. All rights reserved.
  24. 24. 弊社のアプローチ案ステレオタイプ ステレオタイプ タグ付き値 タグ付き値 UML UML UML UMLProfile(PIM) Profile(PSM) 変換プログラ ム UMLモデル UMLモデル ステレオタイプとタグ付き値の変換で実現 ©Actier, Inc. All rights reserved.
  25. 25. ATL による変換例 PIM rule Entity { from <<entity>> source : UML2!Class (source.isEntity()) 商品 <<entity>> to {name = 商品 } “item” target : UML2!Class( {name = “item” } name <- source.name2java() , -<<identity>>商品ID : 文字列 {name = “item_id”} -<<name>>商品名 : 文字列 {name = “item_name”} -<<identity>>商品ID : 文字列 {name = “item_id”} ownedAttributes <- source.ownedAttributes -<<name>>商品名 : 文字列 {name = “item_name”} ) do { // 後処理 } } rule Property { from source : UML2!Property PSM to target : UML2!Property ( <<jpaEntity>> name <- source.name2java().toLowerFirst(), <<jpaEntity>> Item {tablename = “item”, doc=“商品”} Item type <- source.type2java() {tablename = “item”, doc=“商品”} )-<<id>>itemId : String {col =“item_id”, doc=“商品ID”}-<<column>>itemName : String {col =“item_name”, doc=“商品名”} do { -<<id>>itemId : String {col =“item_id”, doc=“商品ID”} -<<column>>itemName : String {col =“item_name”, doc=“商品名”} // 後処理 } } ©Actier, Inc. All rights reserved.
  26. 26. PSM で表現されるもの フレームワークが求める継承関係を構築  Struts の ActionForm を継承する… フレームワークが求めるインタフェースを構 築  Spring 等の DI コンテナが求めるインタフェース … ステレオタイプ/タグ付き値  JavaDocに埋め込みたい情報 例)PIM の設計情報…  Javaクラスの annotation 情報 例)JPA の annotaion ( Entity / Table / Column…) ©Actier, Inc. All rights reserved.
  27. 27. Acceleo の利用 ©Actier, Inc. All rights reserved.
  28. 28. Acceleo の概要 User テキスト変換言語-userId : String [public template genClass(aClass : Class)]-userName : String public class [aClass.name/] { [for (p : Property | aClass.ownedAttributes)] private [p.type.name/] [p.name/]; Item [/for] }-itemId : String [/template]-itemName : String public class User { public class Item { private String userId; private String itemId; private String userName; private String itemName; } } ©Actier, Inc. All rights reserved.
  29. 29. Acceleo による変換 create table item ( item_id varchar(255) not null primary key, <<jpaEntity>> item_name varchar(255) not null Item ); {tablename = “item”, doc=“商品”}-<<id>>itemId : String {col =“item_id”, doc=“商品ID”}-<<column>>itemName : String {col =“item_name”, doc=“商品名”} @Entity @Table(name = “item”) public class Item { @Id(name = “item_id”) private String itemId; @Column(name = “item_name”) private String itemName; ); <<daoInterface>> public interface ItemDao { ItemDao public Item findById(String itemId); {doc=“商品DAO”} );+findById(itemId : String) : Item {doc = “商品IDで検索する”} public abstract class ItemDaoBase implements ItemDao { @PersistenceContext <<dao>> private EntityManager entityManager; ItemDaoBase public EntityManager getEntityManager() { {doc=“商品DAO”} return entityManager;-entityManager : EntityManager {readonly} }+findById(itemId : String) : Item {doc = “商品IDで検索する”} ); ©Actier, Inc. All rights reserved.
  30. 30. 実際のビジネスロジックはどうするか? サブクラス化が困難な場合は Hook Operation パターンを利用して委譲する @Entity <<jpaEntity>> @Table(name = “user”) User public class User { -<<id>>userId : String @Id(name = “user_id”) -<<column>>password : String private String userId; +<<operation>>authenticate(password : String) : Boolean @Column(name = “password”) private String password; @Transient private UserOperation ope; <<businessRule>> public Boolean authenticate(String password) { UserOperation return ope.authenticate(); } ); +<<operation>>authenticate(password : String) : Boolean public class UserOperationImpl implements UserOperation {public interface UserOperation { @Override public Boolean authenticate(String password); public Boolean authenticate(String password) {); return user.getPassword().equals(password); } ); UserOperationImpl は自動生成しない ©Actier, Inc. All rights reserved.
  31. 31. 実際のビジネスロジックはどうするか? サブクラス化が可能な場合は Generation Gap パターンを利用して継承する <<daoInterface>> public interface ItemDao { ItemDao public Item findById(String itemId); {doc=“商品DAO”} );+findById(itemId : String) : Item {doc = “商品IDで検索する”} public abstract class ItemDaoBase implements ItemDao { @PersistenceContext <<dao>> private EntityManager entityManager; ItemDaoBase public EntityManager getEntityManager() { {doc=“商品DAO”} return entityManager;-entityManager : EntityManager {readonly} }+findById(itemId : String) : Item {doc = “商品IDで検索する”} ); public class ItemDaoImpl extends ItemDaoBase { @Override public Item findById(String itemId) { return getEntityManager().find(Item.class, itemId); } ); ItemDaoImpl は自動生成しない ©Actier, Inc. All rights reserved.
  32. 32. 繰り返し型開発に耐える やりたいこと 実現手段の中間モデル(PIM:Platform Independent Model) (PSM:Platform Specification Model) ICustomer 顧客 モデル 変換 Customer テキス ト変換 実現手段の実装 実現手段の成果物 (上書きされない) public interface ICustomer { public class CustomerImpl } extends Customer { } public class Customer implements ICustomer { } ©Actier, Inc. All rights reserved.
  33. 33. まとめ©Actier, Inc. All rights reserved.
  34. 34. MDA でモデルは動作したか? 実際には動作まで実現できていない  静的構造は設計書の通り維持される! → 保守フェーズで有効活用が期待できる モデルを動作させるために  シーケンス図や状態マシンを活用するか? → 実装作業の効率を下げないか不安 → 新しい仕組みが出てきた時に即時対応しづらいので は? ビジネスロジックを編み込む  継承可能なものはGeneration Gap パターン  継承不可能なものは Hoop Operation パターン ©Actier, Inc. All rights reserved.
  35. 35. 効率アップのための MDA 劇的に効率上がったか?  規模が小さいとそれほど効果的ではない気がする → 仕様変更の対応はやり易い 自動生成だけでは効率上がらない(開発全体を考えろ)  やるべきことはやる! → 継続的インテグレーション、単体テスト、構成管理、作業管理  自動生成に効果的な開発方法論 → 何を自動生成対象として UML で表現するか  繰り返し型開発に耐える → 実装したコードを上書きしないデザインパターン  自動生成コードは Jar にパッケージ化して提供 → 実装者が設計部分を変更できないように  設計ドキュメントの効果的な提示 → UML ツール起動しないと何もわからないのはダメ  少数精鋭の小さなプロジェクトチーム → 開発方法論を実践できるチームビルド ©Actier, Inc. All rights reserved.
  36. 36. モデルは動かなかったでもスケッチからは脱却した! ©Actier, Inc. All rights reserved.
  37. 37. ご清聴ありがとうございました ©Actier, Inc. All rights reserved.

×