More Related Content Similar to Pythonを含む多くのプログラミング言語を扱う処理フレームワークとパターン、鷲崎弘宜、PyConJP 2016 招待講演 (20) More from Hironori Washizaki (20) Pythonを含む多くのプログラミング言語を扱う処理フレームワークとパターン、鷲崎弘宜、PyConJP 2016 招待講演1. Pythonを含む多くのプログラミング言語を
2016年9月21日 PyCon JP 2016 招待講演
Pythonを含む多くのプログラミング言語を
扱う処理フレームワークとパターン扱う処理フレームワークとパターン
鷲崎 弘宜
わしざき ひろのり
鷲崎 弘宜
早稲田大学グローバルソフトウェアエンジニアリング研究所長・教授
国立情報学研究所 客員教授、株式会社 システム情報 社外取締役
ISO/IEC/JTC1/SC7/WG20 Convenor, SEMAT Japan Chapter ChairISO/IEC/JTC1/SC7/WG20 Convenor, SEMAT Japan Chapter Chair
IEEE CS Japan Chapter Secretary http://www.washi.cs.waseda.ac.jp/
研究遂行・資料協力: 坂本一憲、李 菊花ほか研究遂行・資料協力: 坂本一憲、李 菊花ほか
5. Guide to the Software Engineering Body of Knowledge
(SWEBOK) http://www.swebok.org/ http://swebokwiki.org/
要求 構築設計 テスティング 保守
設計原則
(SWEBOK) http://www.swebok.org/ http://swebokwiki.org/
要求 構築設計 テスティング 保守
要求の基礎
要求プロセス
設計の基礎
設計の主要問題
構築の基礎
構築の管理
テストの基礎
テストレベル
保守の基礎
保守の主要問題要求プロセス
要求抽出
要求分析
要求仕様
要求妥当性確認
設計の主要問題
構造とアーキテクチャ
ユーザインタフェース設計
設計品質の分析評価
設計の表記
構築の管理
実践上の考慮事項
構築技法
構築ツール
テストレベル
テスト技法
テスト関連計量尺度
テストプロセス
テストツール
保守の主要問題
保守プロセス
保守技法
保守ツール
要求妥当性確認
実践上の考慮事項
設計の表記
設計戦略・手法
設計ツール
テストツール
デザインパターン
フレームワークフレームワーク 再利用
マネジメント プロセス構成管理 モデル・手法 品質
SCMプロセスのマネ 開始と範囲定義 プロセス定義 モデリング 品質の基礎SCMプロセスのマネ
ジメント
構成の識別
構成制御
構成状態記録・報告
開始と範囲定義
プロジェクト計画
プロジェクト実施
レビュー・評価
終結
プロセス定義
ライフサイクル
プロセス
査定・改善
計量
モデリング
モデル種別
モデルの分析
開発手法
品質の基礎
品質マネジメントプ
ロセス
実践上の考慮事項
品質ツール構成状態記録・報告
構成監査
リリース管理・配布
構成管理ツール
終結
計量
マネジメントツール
計量
プロセスツール
品質ツール
5経済
プロフェッショナル
実践
計算基礎 数学基礎
エンジニアリング
基礎
6. 再利用の技術と期待
• 60%再利用すれば生産性2-10倍、信頼性2-3倍 [Marciniak94]
– 潜在的に再利用可能な部分は15-85% [McClure92]
サブシステムサブシステム クラス メソッド* * * *
– 15-85% [McClure92]
– 国内企業の再利用への取り組み 40% [@IT02]
サブシステムサブシステム
/パッケージ
クラス
(ファイル) 属性
メソッド
(関数)/属性
システムシステムドメイン * * * *
全体 部分全体 部分
抽象的
(汎用)
設計原則(根本指針)
たいてい
アーキテクチャアーキテクチャ
(汎用)
設計原則(根本指針)
たいてい
使える
パターン
アーキテクチャ
パターン
デザインパターン
使えるかも使えるかも
フレームワーク(半完成の実装)
あてはまれ
使えるかも
特定の場合に
使えるかも
プロダクトラインプロダクトライン 6クラス・関数ライブラリ
具体的
(特化)
あてはまれ
ば使える
特定の場合に
限り使える
8. 多プログラミング言語時代多プログラミング言語時代
• 環境や要求の多様化に伴い言語数増大• 環境や要求の多様化に伴い言語数増大
– TIOBE Index上位15言語シェア: 86%(‘12) 70%(‘15)
– 開発者によっては1プロジェクト4言語以上– 開発者によっては1プロジェクト4言語以上 [Karus11]
• 多言語時代のツールフレームワーク
1. テストカバレッジ測定フレームワーク Open Code1. テストカバレッジ測定フレームワーク Open Code
Coverage Framework (OCCF) [Sakamoto11]
2. 汎用コード処理フレームワーク UNIfied Source COde2. 汎用コード処理フレームワーク UNIfied Source COde
ENgineering framework (UNICOEN) [坂本13]
TIOBE Index http://www.tiobe.com/
[Karus11] S. Karus, et al., A study of language usage evolution in open source software, MSR,2011
[Sakamoto11] Kazunori Sakamoto, Fuyuki Ishikawa, Hironori Washizaki, and Yoshiaki Fukazawa, “Open Code Coverage
Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple
8
Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple
Programming Languages,” IEICE Transactions on Information and Systems, Vol.E94-D, No.12, pp.2418-2430, 2011.
[坂本13] 坂本 一憲, 大橋 昭, 太田 大地, 鷲崎 弘宜, 深澤 良彰, “UNICOEN: 複数プログラミング言語対応のソースコー
ド処理フレームワーク”, 情報処理学会論文誌, Vol.54(No.2), pp.945-960, 2013
9. 1. 問題と解決:コストと統一性
フレームワークによる支援
1.
• 開発と保守コストが大きい
– 新言語への対応が困難
フレームワークによる支援
共通処理の再利用
– 新言語への対応が困難
• カバレッジの種類がばらばら
カバレッジ種類数の統一
柔軟な機能拡張• カバレッジの種類がばらばら
– 複数言語での開発が困難
柔軟な機能拡張
コード埋め込みによる測定
実装の簡略化対応するカバレッジ
種類の差異
カバレッジ種類
数の統一
実装の簡略化
(Cobertura)
(Statement
共通処理
Java
Python
機能追加
Java
(Cobertura)
(COVTOOL)
Python
(Statement
Coverage)
共通処理
Java
C
Python
9
(Cobertura)
C
(COVTOOL)
Python
(Statement
Coverage)
OCCF
(COVTOOL)
[Sakamoto11] Kazunori Sakamoto, Fuyuki Ishikawa, Hironori Washizaki, and Yoshiaki Fukazawa, “Open Code Coverage
Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple
Programming Languages,” IEICE Transactions on Information and Systems, Vol.E94-D, No.12, pp.2418-2430, 2011.
10. 1. OCCFの構成
テストカバレッジ
:外部プログラム(ライブラリなど)
:言語固有処理(.NETかスクリプト言語)
カバレッジ
テストカバレッジ
測定用コード
:外部プログラム(ライブラリなど)
:フレームワーク(.NET言語で実装)
カバレッジ
データソースコード ソースコード
コ
ー
ド
埋
実
行
部
カ
バ
レ
ッ
ジ~~~~
~~~~
~~~~
0101
0001
埋
め
込
み
実
行
部
(
処
理
系
カ
バ
レ
ッ
ジ
表
示
部
~~~~
~~~~
~~~~
~~~~
~~~~
~~~~
測定結果
0001
1110
1010
み
部
処
理
系
)
表
示
部
測定結果
AST AST AST
ソースコードソースコード コ
ー
ド
ソースコード
~~~~
~~~~
~~~~
~~~~
ソースコード
~~~~
~~~~
~~~~
AST
生
成
部
AST
整
形
部
AST
操
作
部
コ
ー
ド
生
成
部
10
~~~~
~~~~
生
成
部
整
形
部
操
作
部
生
成
部
10
[Sakamoto11] Kazunori Sakamoto, Fuyuki Ishikawa, Hironori Washizaki, and Yoshiaki Fukazawa, “Open Code Coverage
Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple
Programming Languages,” IEICE Transactions on Information and Systems, Vol.E94-D, No.12, pp.2418-2430, 2011.
11. 1. カバレッジ測定用コードの埋め込み1. カバレッジ測定用コードの埋め込み
int func(int a) { int func(int a) {int func(int a) {
if (a == 0) {
printf("a == 0");
}
int func(int a) {
if (a == 0) {
stmt_cov(0);
printf("a == 0");}
else {
printf("a != 0");
printf("a == 0");
}
else {printf("a != 0");
}
}
else {
stmt_cov(1);
printf("a != 0");
}}
}Function
int func(int a) • 自動的に挿入
Statement Statement
• 副作用なし
• カバレッジ情報
をファイルに出力
printf("a == 0") printf("a != 0")
Statement
stmt_cov(0) stmt_cov(1)
Statement
Statement
Statement をファイルに出力
11
stmt_cov(0) stmt_cov(1)
[Sakamoto11] Kazunori Sakamoto, Fuyuki Ishikawa, Hironori Washizaki, and Yoshiaki Fukazawa, “Open Code Coverage
Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple
Programming Languages,” IEICE Transactions on Information and Systems, Vol.E94-D, No.12, pp.2418-2430, 2011.
12. 2. UNICOEN: 汎用の多言語対応処理FW
(Java, JavaScript, C#, C, Python, Ruby, VB)(Java, JavaScript, C#, C, Python, Ruby, VB)
言語変換 コード補完
特化API
バグ検出 品質測定
ツール開発者向け汎用API
バグ検出 品質測定
対応言語拡張者向けAPI
ツール開発者向け汎用API
対応言語拡張者向けAPI
C Java RubyC Java Ruby
コンパイラコ
ンパイラ利用 オ
ブ
ジ
ェ
ク
ト
2000~3000行
12ソースコード
C
If文
統合コード
モデル
構
文
解
析
部
オ
ブ
ジ
ェ
ク
ト
生
成
部
C 条件式 True処理 False処理
モデル
構
文
解
析
部
オ
ブ
ジ
ェ
ク
ト
生
成
部
13. 2. 統合コードモデル(メタモデル)2. 統合コードモデル(メタモデル)
if (a == 0) Java 統合コードモデルif (a == 0)
puts(“a == 0“);
Java
If文
統合コードモデル
puts(“a == 0“);
else
puts(“a != 0“); 条件式 True Falseputs(“a != 0“);
Ruby
条件式 True False
class IfStatement {
Expression Condition;
if a == 0
puts “a == 0“
Ruby
Expression Condition;
Block TrueProcess;
Block FalseProcess;
puts “a == 0“
else
}
Block FalseProcess;
}puts “a != 0“
end
13
end
[坂本13] 坂本 一憲, 大橋 昭, 太田 大地, 鷲崎 弘宜, 深澤 良彰, “UNICOEN: 複数プログラミング言語対応のソースコー
ド処理フレームワーク”, 情報処理学会論文誌, Vol.54(No.2), pp.945-960, 2013
14. 2. 例: 1分で複雑度測定ツール
14[坂本13] 坂本 一憲, 大橋 昭, 太田 大地, 鷲崎 弘宜, 深澤 良彰, “UNICOEN: 複数プログラミング言語対応のソースコー
ド処理フレームワーク”, 情報処理学会論文誌, Vol.54(No.2), pp.945-960, 2013
15. 2. 例: 翻訳による言語学習2. 例: 翻訳による言語学習
(Translation-based Lang. Learning)
15
Juhua Li, Kazunori Sakamoto, Hironori Washizaki, Yoshiaki Fukazawa, “Promotion of Educational Effectiveness by Translation-based
Programming Language Learning Using Java and Swift,” 50th Annual Hawaii International Conference on System Sciences (HICSS-
50), Waikoloa, Hawaii, Jan 4-7, 2017.
17. フレームワークとデザインパターン
17
フレームワークとデザインパターン
• 再利用、拡張実現の定石がデザインパターン
– ホットスポット&コールドスポット– ホットスポット&コールドスポット
– 制御の逆転、ハリウッドの原則 (Don’t Call us)
– パターンを理解することでフレームワークの理解促進– パターンを理解することでフレームワークの理解促進
• デザインパターン: 設計の特定状況下で頻出の問題&解決
– 変更や再利用のための設計– 変更や再利用のための設計
– 共通言語、共通指針
– Gang of Four(GoF) デザインパターン [GoF00]– Gang of Four(GoF) デザインパターン [GoF00]
ユーザソフトウェア フレームワーク
ライブラリ ユーザソフトウェア
[GOF00] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides(著), 本位田真一, 吉田和樹 (監訳), “オブジェクト
指向における再利用のためのデザインパターン改訂版", ソフトバンクパブリッシング, 2000.
18. OCCFにおける命令網羅のPython用実装OCCFにおける命令網羅のPython用実装
public class フレームワーク
AtomicStatementSelectorForPython
: AtomicStatementSelector
{{
protected override bool
IsStatementElement(XElement e)
{{
return e.Name.LocalName
== "simple_stmt";
}}
protected override bool
IsStatementSepartor(XElement e)
{
return e.Name.LocalName
== "SEMI";== "SEMI";
}
}
Pythonの実装例
18
言語固有の処理Pythonの実装例
Kazunori Sakamoto, Hironori Washizaki, Yoshiaki Fukazawa, “Reporting the Implementation of a Framework for Measuring Test
Coverage based on Design Patterns”, Proc. 3rd International Workshop on Software Patterns and Quality (SPAQu’09)
19. Template Methodパターン [GoF00]より
19
Template Methodパターン [GoF00]
• 問題: アルゴリズムの構造を変えずに、場合によっ
て処理内容を変更したい
• :• 解決:以下の構成・協調動作として設計
テンプレートメソッド
TemplateMethod(){ ホットスポットTemplateMethod(){
・・・
PrimitiveOperation1()
・・・
ホットスポット
フックメソッドを定義・・・
PrimitiveOperation2()
}
フックメソッドを定義
フックメソッドの実装は、
サブクラスで実施
20. Command + Composite = Macroパターン
if( a == b ) { ... }if( a == b ) { ... }
20Kazunori Sakamoto, Hironori Washizaki, Yoshiaki Fukazawa, “Reporting the Implementation of a Framework for Measuring Test
Coverage based on Design Patterns”, Proc. 3rd International Workshop on Software Patterns and Quality (SPAQu’09)
21. 21何を実現しているでしょう?[Joshua05]改変
interface MessageStrategy { public class Main {interface MessageStrategy { public class Main {
public void sendMessage(); public static void main(String[] args) {
} MessageBody mb =
new MessageBody();
abstract class AbstractStrategyFactory { mb.configure(“Hello World!”);
public abstract MessageStrategy AbstractStrategyFactory asf =public abstract MessageStrategy AbstractStrategyFactory asf =
createStrategy(MessageBody mb); DefaultFactory.getInstance();
} MessageStrategy strategy
class MessageBody { = asf.createStrategy(mb);
object payload; mb.send(strategy);
public Object getPayload() { }
object payload; mb.send(strategy);
public Object getPayload() { }
return payload; }
}
public void configure(Object obj) {
payload obj;
}
payload obj;
}
public void send(MessageStrategy ms) {
ms.sendMessage();
}
}
class DefaultFactory extends AbstractStrategyFactory {
}
class DefaultFactory extends AbstractStrategyFactory {
private DefaultFactory() {}
static DefaultFactory instance;
public static AbstractStrategyFactory getInstance() {
if(instance == null) instance = new DefaultFactory();if(instance == null) instance = new DefaultFactory();
return instance;
}
public MessageStrategy createStrategy(final MessageBody mb) {
return new MessageStrategy() {
MessageBody body = mb;MessageBody body = mb;
public void sendMessage() {
Object obj = body.getPayload();
System.out.println(obj);
} }; } }
[Joshua05] Joshua Kerievsky著,小黒直樹 他訳: パターン指向リファクタリ
ング入門~ソフトウエア設計を改善する27の作法, 日経BP社, 2005.
22. 22デザインパターンの落とし穴
• 「解決を知っておけばよい」• 「解決を知っておけばよい」
– 解決はパターンの一部にすぎない。
「問題」の本質
を捉えよう–
• 「とにかく使えばOK」
を捉えよう
品質との関係を• 「とにかく使えばOK」
– 複雑なパターンは欠陥率 増大 [Vokac]
– 知識不足で作業時間 増大 [Prechelt]
品質との関係を
抑えよう
– 知識不足で作業時間 増大 [Prechelt]
• 「そのまま使わなければならない」
設計原則を抑え
る(例: 開放閉鎖、置換)• 「そのまま使わなければならない」
– 書かれた構造は一例に過ぎない。
リファクタリング
る(例: 開放閉鎖、置換)
[鷲崎07]
• 「最初から使わなければならない」
–
リファクタリング
していこう [Kerievsky]
– 未来は誰にもわからない
していこう [Kerievsky]
Marek Vokac, Defect Frequency and Design Patterns: An Empirical Study of Industrial Code, TSE 30(12), 2004
Lutz Prechelt, et al. Two Controlled Experiments Assessing the Usefulness of Design Pattern Documentation inLutz Prechelt, et al. Two Controlled Experiments Assessing the Usefulness of Design Pattern Documentation in
Program Maintenancem, TSE 28(6), 2002
鷲崎、丸山、山本、久保: ソフトウェアパターン- パターン指向の実践ソフトウェア開発. 近代科学社, 2007.
Joshua Kerievsky著: パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法, 日経BP社, 2005.
23. PythonとデザインパターンPythonとデザインパターン
• GoF デザインパターンのPython実装+α• GoF デザインパターンのPython実装+α
– doloopwhile, “Pythonによるデザインパターン
http://doloopwhile.hatenablog.com/entry/20110207/12http://doloopwhile.hatenablog.com/entry/20110207/12
97068455
– Bruce Eckel, “Python 3 Patterns, Recipes and Idioms”
http://www.mindviewinc.com/Books/Python3Patterns/http://www.mindviewinc.com/Books/Python3Patterns/
– Gennadiy Zlobin, “Learning Python Design Patterns”
• 言語特性に留意• 言語特性に留意
– ダックタイピング、メタプログラミング・・・– ダックタイピング、メタプログラミング・・・
– よりシンプルな記述、不要な可能性、新パターン(例:
Borg)Borg)
23
25. 再掲: SWEBOK V3 (2014): 15の知識領域
設計原則
要求 構築設計 テスティング 保守
設計原則
要求 構築設計 テスティング 保守
要求の基礎
要求プロセス
要求抽出
設計の基礎
設計の主要問題
構造とアーキテクチャ
構築の基礎
構築の管理
実践上の考慮事項
テストの基礎
テストレベル
テスト技法
保守の基礎
保守の主要問題
保守プロセス要求抽出
要求分析
要求仕様
要求妥当性確認
実践上の考慮事項
構造とアーキテクチャ
ユーザインタフェース設計
設計品質の分析評価
設計の表記
設計戦略・手法
実践上の考慮事項
構築技法
構築ツール
テスト技法
テスト関連計量尺度
テストプロセス
テストツール
保守プロセス
保守技法
保守ツール
デザインパターン実践上の考慮事項 設計戦略・手法
設計ツール
デザインパターン
フレームワークフレームワーク 再利用
マネジメント プロセス構成管理 モデル・手法 品質
SCMプロセスのマネ 開始と範囲定義 プロセス定義 モデリング 品質の基礎SCMプロセスのマネ
ジメント
構成の識別
構成制御
構成状態記録・報告
開始と範囲定義
プロジェクト計画
プロジェクト実施
レビュー・評価
終結
プロセス定義
ライフサイクル
プロセス
査定・改善
計量
モデリング
モデル種別
モデルの分析
開発手法
品質の基礎
品質マネジメントプ
ロセス
実践上の考慮事項
品質ツール構成状態記録・報告
構成監査
リリース管理・配布
構成管理ツール
終結
計量
マネジメントツール
計量
プロセスツール
品質ツール
25経済
プロフェッショナル
実践
計算基礎 数学基礎
エンジニアリング
基礎
26. まとめ&告知
• 正当なエンジニアリングであるために
– SWEBOK&プロフェッショナリズム– SWEBOK&プロフェッショナリズム
• 多言語時代のフレームワーク
– テストカバレッジ測定、汎用のコード処理– テストカバレッジ測定、汎用のコード処理
– 抽象構文木の操作、統一メタモデル
• デザインパターン: フレームワークの設計を起源• デザインパターン: フレームワークの設計を起源
– 共通性と可変性、「落とし穴」に注意!–
10th IEEE International Conference on
Software Testing, Verification and Validation
IPSJ International AI Programming Contest
Mar 13-18 (due Sep 2016)
26
samuraicoding.infoMar 13-18 (due Sep 2016)
aster.or.jp/conference/icst2017/