ソースコードから構造と意図を発掘する caseツール:atscopeの紹介
DESCRIPTION
ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介をします。TRANSCRIPT
ソースコードから構造と意図を発掘する
CASEツール:AtScopeの紹介
ET2013
2013年11月
ビースラッシュ株式会社
1 Copyright BACKSLASH DESIGN Co., Ltd.
トップページの文言
Copyright BACKSLASH DESIGN Co., Ltd. 2
開発現場が抱える課題の解決をお手伝い
既存のソースコードをファイル単位で部品化を行い、設計ドキュメントとして図面化を行うサービスを提供します。
設計意図を発掘
ソースコード(C言語)から設計構造を導出します。
引継ぎ時のリードタイム、影響範囲の検索時間、などを大幅に短縮できます。
AtScopeの基本機能
AtScope(アットスコープ)は、C言語のソースコードから様々な構造図を出力するツールです。
C言語の入っているフォルダを指定することで、以下の構造図を出力できます。
①フォルダ単位のコンポーネント構造図
②ファイル単位でのクラス構造図
③関数とデータのモジュール構造図
また、設計構造の得点化機能もございます。
④リファクタリングスコア
Copyright BACKSLASH DESIGN Co., Ltd. 3
AtScopeが解決したいこと
シンプルで美しいソースコードを作り、ソフトウェア資産化します。
その結果、開発のスピードアップと品質の安定がもたらされます。
エンジニアは“もっと速く、もっと楽に”開発を進めることができます。
Copyright BACKSLASH DESIGN Co., Ltd. 4
コードを追いかけて動きを理解
grep検索で関連部分を探す
局所的な修正の積み重ね
在庫
残業
バグ
コードの複雑さが増大する 負のスパイラル
設計構造と設計意図を理解
依存線と配置で関連を追跡
大局を見て勘所を押さえた修正
コードがシンプルで美しくなる 正のスパイラル
スピードアップ
品質安定
ソフトウェア資産
AtScopeの3つの機能+1
アーキテクトのための、ソフトウェア全体を俯瞰する『アーキテクチャ解析』
エンジニアのための、ファイル単位の入出力を設計する『クラス解析』
データアクセスのきわどい部分を推測する『モジュール解析』
ソースコードのリファクタリング度を示す『リファクタリングスコア』
Copyright BACKSLASH DESIGN Co., Ltd. 5
func() { ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ } func() { ・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ } } ・・・・・() { { ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ } } ・・・・・() { { ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ } }
func() { ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・・・ } }
static char time_tick; main () { time_tick = 0; while(1){ if(time_tick == 1){ time_tick = 0; top_module(); } } } void ta0int() { time_tick = 1; }
clas s ファイル単位構造(アーキテクチャマッピング)
全体管理 アプリ層
ミドル層
デバイス層
ユーザインターフェース
TimerTimer VolSensorVolSensor EepRomEepRom LedLed LcdLcd BuzzerBuz zer SwSw
BuzzerSoundBuzzerSound PushBut t onPushBut t on
Ma int ePanelMa int ePanelVolMet erVolMet er
PanelDis p layPanelDis p lay
Opera t ionF lowOpera t ionF low
CurrentMet erCurrentMet er
Prog ramConfirmat ionProg ramConfirmat ionLcdInspect ionLcdInspect ion
VolInspect ionVolInspect ionHis t Inspect ionHis t Inspect ion
Inspect ionHis tInspect ionHis t
Inspect orInspect or
Inspect ionProcessInspect ionProcess
Diagnos isSt epDiagnos isSt ep UserPersonUserPersonRecept ionis tRecept ionis t
SysCt rlSysCt rl
SysNot iceSysNot ice
Not icePanelNot icePanel
clas s ファイル単位構造図
InspectionHistInspectionHist
ReceptionistReceptionist
UserPersonUserPerson CurrentMeterCurrentMeter InspectionProcessInspectionProcess
BuzzerBuzzer
EepRomEepRom
LcdLcd
LedLed
SwSw
DiagnosisStepDiagnosisStep
VolSensorVolSensor
PushButtonPushButton
InspectorInspector
MaintePanelMaintePanel VolMeterVolMeter
SysCtrlSysCtrl
SysNoticeSysNotice
BuzzerSoundBuzzerSound NoticePanelNoticePanel
OperationFlowOperationFlow
PanelDisplayPanelDisplay
TimerTimer
アーキテクチャ解析
クラス解析
C言語
モジュール解析
コンポーネント単位
ファイル単位
関数とデータの単位
rc_execrc_exec
cm_chg_stacm_chg_sta
ip_start_gripip_start_grip ip_chk_grip_resultip_chk_grip_result
cm_chk_gripcm_chk_grip
cm_execcm_exec
<<デー...cmSt aMode
ds_execds_exec
<<デー...cmSt aTime
sc_execsc_exec
mainmain
ip_chk_measure_resultip_chk_measure_result
cm_chk_measurecm_chk_measure
cm_measurecm_measure
cm_chk_stacm_chk_sta
ip_execip_exec
11
1 1 1
1
1
1
1
1
1
1
1
1
1
1 1
1
再配置
<<...s ys
<<...ma int e
<<...drv
<<...ct rl
<<...h is t
<<...u i
<<...app
3
3
3
8
5
3
3
15
5
8
2
2
4
15
再配置
指定したデータから 関数コールを遡ります
EnterpriseArchitect で動きます
設計ルール違反が 色付きで表示されます
再配置することで 設計意図が分かります
設計意図を発掘する その1:コンポーネント単位
コンポーネント図やクラス図は、配置を変えることで、設計の意図や設計上の課題が見えてきます。
下の例は、アプリ層・ミドル層・ドライバ層による垂直レイヤリングと、システム全体およびUI部の垂直パーティショニングをした例です。
Copyright BACKSLASH DESIGN Co., Ltd. 6
<<コンポーネント>>app
<<コ...sys
<<コ...mainte
<<コンポーネント>>drv
<<コンポーネ...ctrl
<<...hist
<<コ...ui
7
8
2
2
4
15
3
3
3
8
5
3
3
15
<<...app
<<...s ys
<<...ma int e
<<...drv
<<...ct rl
<<...h is t
<<...u i
7
8
2
2
4
15
3
3
3
8
5
3
3
15 再配置
循環
階層を飛び越えた依存はない
階層を飛び越えた依存はない
設計意図を発掘する その2:クラス単位
ファイル単位の入出力を図面化します
●印が、ひとつのファイルになります
赤線が双方向依存、色付きの●が大きなファイル、を示しており、それぞれリファクタリング候補になります
再配置することで、設計の意図が浮き上がります
7
clas s ファイル単位構造図
InspectionHistInspectionHist
ReceptionistReceptionist
UserPersonUserPerson CurrentMeterCurrentMeter InspectionProcessInspectionProcess
BuzzerBuzzer
EepRomEepRom
LcdLcd
LedLed
SwSw
DiagnosisStepDiagnosisStep
VolSensorVolSensor
PushButtonPushButton
InspectorInspector
MaintePanelMaintePanel VolMeterVolMeter
SysCtrlSysCtrl
SysNoticeSysNotice
BuzzerSoundBuzzerSound NoticePanelNoticePanel
OperationFlowOperationFlow
PanelDisplayPanelDisplay
TimerTimer
循環 リファクタリング候補
clas s パッケージ構造図(あるべき姿)
ユーザインターフェース
デバイス層
ミドル層
アプリ層全体管理
InspectorInspector
ReceptionistReceptionist
UserPersonUserPerson
CurrentMeterCurrentMeter
InspectionProcessInspectionProcess
BuzzerBuzzerEepRomEepRom LcdLcdLedLed SwSwTimerTimer VolSensorVolSensor
DiagnosisStepDiagnosisStep
HistInspectionHistInspection
PushButtonPushButton
LcdInspectionLcdInspection
MaintePanelMaintePanel
ProgramConfirmationProgramConfirmationVolInspectionVolInspection
VolMeterVolMeter
SysCtrlSysCtrl
SysNoticeSysNotice
BuzzerSoundBuzzerSound
NoticePanelNoticePanel
OperationFlowOperationFlow
PanelDisplayPanelDisplay
InspectionHistInspectionHist再配置
設計意図を発掘する その3:モジュール単位
変数を指定して、そのアクセスを遡ります
変数のカプセル化の状況と異なるスレッドからの衝突が見えてきます
Copyright BACKSLASH DESIGN Co., Ltd. 8
ds_startds_start
<<...cmMode
up_start_inputup_start_input
up_set_weightup_set_height
up_rq_chg_modeup_rq_chg_mode
rc_start_diagrc_start_diag
ds_finish
rc_rq_chg_moderc_rq_chg_mode
rc_initrc_init
ds_rq_chg_modeds_rq_chg_mode
ip_startip_start
ip_notify_failip_notify_fail
ip_rq_chg_modeip_rq_chg_mode
ip_start_gripip_start_grip
cm_start_chk_gripcm_start_chk_grip
rc_request
cm_chk_gripcm_chk_grip cm_start_measurecm_start_measure
cm_measurecm_measure
cm_chk_measurecm_chk_measure
ip_chk_measure_resultip_chk_measure_result rc_execrc_exec
ds_execds_exec
rc_finish_diagrc_finish_diag
cm_execcm_exec
ip_start_measureip_start_measure
ip_chk_grip_resultip_chk_grip_result
ip_notify_resultip_notify_result
ds_chk_inspection_resultds_chk_inspection_result
ds_start_diag main
sc_execsc_exec
ip_execip_exec
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
111
1
1
1
1
1
1
11
1
1
1
1
1
1
1
1
1 1 1
1
1
1
1
1
1
このデータへのアクセス構造
●の色はコンポーネント単位であり、複数の色からアクセスされちる場合は、カプセル化が不完全。
ひし形はデータアクセスの起点であり、複数の起点がある場合は、データの排他制御の設計が必要。
リファクタリングスコア
ソースコードの構造的な視点で点数化を行います
リファクタリングのbefore/afterでの改善度合いや、機能追加修正による徐々に複雑化していく度合いを把握することができます
Copyright BACKSLASH DESIGN Co., Ltd. 9
二年目研修
Copyright BACKSLASH DESIGN Co., Ltd. 10
トップページの文言
Copyright BACKSLASH DESIGN Co., Ltd. 11
開発現場でソフトウェアの設計図を活用できる人材の育成をサポートします。
スピーディー・高品質な開発実現のため、開発者・技術リーダーのスペシャリストを育成します。
後輩を指導できるエンジニアを育成します
経験と理論をつなぐことで、新人や後輩に、設計の原則や定石を指導できるようになります。
2年目研修
5日間で、分析・設計・実装の要点をつかみます。
開発の経験と理論をつなぐことで、新人への指導ができます。
新人を指導することで、自分自身のさらなる成長につながります。
Copyright BACKSLASH DESIGN Co., Ltd. 12
Copyright BACKSLASH DESIGN Co.,Ltd.
お買い物ロボット
指定されたポイント(お店)に立ち寄りながら、スタート地点からゴール地点まで移動する(お買い物をする)ロボット
使用するロボットは自律型ライントレース・ロボット
精肉店 八百屋
家 酒屋
20 V1.10
要求定義
適用範囲
分析
構成管理やチーム開発というプロジェクトのリーダーシップも体験
/**********************************************************
* 関数名 : rb_decideRunning
* 機能 :走行操作を判断* 引数 :無* 戻値 :無* 備考 :*********************************************************/
static void rb_decideRunning(void)
{
if (ecrobot_get_touch_sensor(PORT_TOUCH) == 1){
rn_evStart();
}
switch(TraceState){
case eGray:
rn_evStopRightLeftRun();
break;
case eWhite: }
rn_evFrontRun();
return;
}
/**********************************************************
* タスク名 : Task_Main
* 機能 : メインタスク* 備考 : 40msec周期起動*********************************************************/
TASK(Task_Main)
{
rb_decideRunning();
TerminateTask();
}
/*********************************************************
* ファイル名 : Robot.c
* rb
* 責務 : ライントレースロボット* 作成日 : 2012.11.29
* 作成者 : BackSLASH DESIGN Co.,Ltd
* 修正日 : yyyy.mm.dd : Name : reason
* 備考 :
*********************************************************//
DeclareTask(Task_Main);
/**********************************************************
* 関数*********************************************************/
void rb_init(void);
void rb_evAppearObstacle(void);
void rb_evDisappearObstacle(void);
void rb_evDetectGray(void); static void rb_decideRunning(void);
/**********************************************************
* 関数名 : rb_init
* 機能 :初期化処理* 引数 :無* 戻値 :無* 備考 :*********************************************************/
void rb_init(void)
{
TraceState = eGray;
return;
}シンプルで美しいコード
ロボットの行動を判断する
お買い物ロボットシステム
ロボットの行動を制御する
ロボットの環境を検知する
姿勢
障害物有無
走行路種別
走行指示
走行指示
買い物指示
買い物指示
姿勢を検知する
走行路を検知する
障害物を検知する
走行路種別
姿勢
障害物有無
お買い物をする
ロボットを走らせる
実装
設計
データを厳密に定義
スコーピング
イベント分析
WHATを分析
本質を追及
設計構造を俯瞰上流工程で品質を作り込むための『分析力』と『設計力』と『実装力』を鍛える
新人研修:一歩進んだC言語
美しいソースコードを見ることで、C言語を習得します。
C言語の文法を覚えた後に、5日間コースとなります。
Copyright BACKSLASH DESIGN Co., Ltd. 13
新人研修 組込みC言語
C言語の文法を覚えた次に
シンプルで美しいソースコードを読む
・アルゴリズムとデータ構造のバランス
・◎美しい構造体と ×凝集度の低い構造体
・◎美しいポインタと ×バグ誘発のポインタ
・CPUに依存しないプログラミング
5日間コース