ソースコードから構造と意図を発掘する caseツール:atscopeの紹介

13
ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介 ET2013 2013年11月 ビースラッシュ株式会社 1 Copyright BACKSLASH DESIGN Co., Ltd.

Upload: bskenji

Post on 28-May-2015

5.024 views

Category:

Technology


8 download

DESCRIPTION

ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介をします。

TRANSCRIPT

Page 1: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

ソースコードから構造と意図を発掘する

CASEツール:AtScopeの紹介

ET2013

2013年11月

ビースラッシュ株式会社

1 Copyright BACKSLASH DESIGN Co., Ltd.

Page 2: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

トップページの文言

Copyright BACKSLASH DESIGN Co., Ltd. 2

開発現場が抱える課題の解決をお手伝い

既存のソースコードをファイル単位で部品化を行い、設計ドキュメントとして図面化を行うサービスを提供します。

設計意図を発掘

ソースコード(C言語)から設計構造を導出します。

引継ぎ時のリードタイム、影響範囲の検索時間、などを大幅に短縮できます。

Page 3: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

AtScopeの基本機能

AtScope(アットスコープ)は、C言語のソースコードから様々な構造図を出力するツールです。

C言語の入っているフォルダを指定することで、以下の構造図を出力できます。

①フォルダ単位のコンポーネント構造図

②ファイル単位でのクラス構造図

③関数とデータのモジュール構造図

また、設計構造の得点化機能もございます。

④リファクタリングスコア

Copyright BACKSLASH DESIGN Co., Ltd. 3

Page 4: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

AtScopeが解決したいこと

シンプルで美しいソースコードを作り、ソフトウェア資産化します。

その結果、開発のスピードアップと品質の安定がもたらされます。

エンジニアは“もっと速く、もっと楽に”開発を進めることができます。

Copyright BACKSLASH DESIGN Co., Ltd. 4

コードを追いかけて動きを理解

grep検索で関連部分を探す

局所的な修正の積み重ね

在庫

残業

バグ

コードの複雑さが増大する 負のスパイラル

設計構造と設計意図を理解

依存線と配置で関連を追跡

大局を見て勘所を押さえた修正

コードがシンプルで美しくなる 正のスパイラル

スピードアップ

品質安定

ソフトウェア資産

Page 5: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

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 で動きます

設計ルール違反が 色付きで表示されます

再配置することで 設計意図が分かります

Page 6: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

設計意図を発掘する その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 再配置

循環

階層を飛び越えた依存はない

階層を飛び越えた依存はない

Page 7: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

設計意図を発掘する その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再配置

Page 8: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

設計意図を発掘する その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

このデータへのアクセス構造

●の色はコンポーネント単位であり、複数の色からアクセスされちる場合は、カプセル化が不完全。

ひし形はデータアクセスの起点であり、複数の起点がある場合は、データの排他制御の設計が必要。

Page 9: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

リファクタリングスコア

ソースコードの構造的な視点で点数化を行います

リファクタリングのbefore/afterでの改善度合いや、機能追加修正による徐々に複雑化していく度合いを把握することができます

Copyright BACKSLASH DESIGN Co., Ltd. 9

Page 10: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

二年目研修

Copyright BACKSLASH DESIGN Co., Ltd. 10

Page 11: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

トップページの文言

Copyright BACKSLASH DESIGN Co., Ltd. 11

開発現場でソフトウェアの設計図を活用できる人材の育成をサポートします。

スピーディー・高品質な開発実現のため、開発者・技術リーダーのスペシャリストを育成します。

後輩を指導できるエンジニアを育成します

経験と理論をつなぐことで、新人や後輩に、設計の原則や定石を指導できるようになります。

Page 12: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

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を分析

本質を追及

設計構造を俯瞰上流工程で品質を作り込むための『分析力』と『設計力』と『実装力』を鍛える

Page 13: ソースコードから構造と意図を発掘する CASEツール:AtScopeの紹介

新人研修:一歩進んだC言語

美しいソースコードを見ることで、C言語を習得します。

C言語の文法を覚えた後に、5日間コースとなります。

Copyright BACKSLASH DESIGN Co., Ltd. 13

新人研修 組込みC言語

C言語の文法を覚えた次に

シンプルで美しいソースコードを読む

・アルゴリズムとデータ構造のバランス

・◎美しい構造体と ×凝集度の低い構造体

・◎美しいポインタと ×バグ誘発のポインタ

・CPUに依存しないプログラミング

5日間コース