ホーム » 2010 » 7月 » 08

日別アーカイブ: 2010年7月8日

2010年7月
« 6月   8月 »
 123
45678910
11121314151617
18192021222324
25262728293031

最近の投稿(電子情報)

アーカイブ

カテゴリー

リスト処理と集合演算

リスト処理の応用として、集合演算について説明を行う。 今日は、わざと間違ったプログラムを書いて、どう変なのかを色々と聞いてみた。

まずは、集合演算を簡単にするための補助プログラム。 間違っている所をなぜ?と聞いたけど、反応が悪かったかな….

(( リストから特定データを探す/間違ったプログラム ))
int find( struct List* p , int x ) {
for( ; p != NULL ; p = p->next ) {
if ( p->data == x )
return 1 ;
else
return 0 ;
}
}
(( リストから特定データを探す ))
int find( struct List* p , int x ) {
for( ; p != NULL ; p = p->next )
if ( p->data == x )
return 1 ;
return 0 ;
}

次に、実際に集合演算A∩Bの計算例。これも、findを使わなかったら…という例を書いて 考えてもらった。徐々に自分で考えて、○○がダメじゃ?といった意見が飛び交うようになってきた。

(( リストの集合積/正しい例 ))
struct List* list_and( struct List*p1 , struct List*p2 ) {
struct List* ans = NULL ;
for( ; p2 != NULL ; p2 = p2->next ) {
if ( find( p1 , p2->data ) )
ans = cons( p2->data , ans ) ;
}
return ans ;
}
(( リストの集合積/findを使わずに間違った場合 ))
struct List* list_and( struct List*p1 , struct List*p2 ) {
struct List* ans = NULL ;
for( ; p2 != NULL ; p2 = p2->next ) {
for( ; p1 != NULL ; p1 = p1->next ) {
if ( p1->data == p2->data )
ans = cons( p2->data , ans ) ;
}
}
return ans ;
}

最後にリスト処理で作られたデータを捨てる処理。

(( リスト全部を捨てる/安易に書いたダメな例 ))
void list_free( struct List* p ) {
for( ; p != NULL ; p = p->next )
free( p ) ;
}
(( リスト全部を捨てる ))
void list_free( struct List* p ) {
struct List* d ;
while( p != NULL ) {
d = p ;
p = p->next ;
free( d ) ;
}
}

ダメな例とかを説明していたら、再帰でかけるんじゃ?みたいな意見を言う人がいたので、 実際に説明する。 「親亀こけたら子亀もこける。親亀が自殺するときゃ、子亀を確実に殺してから死にましょう」 と説明したら、その倫理観はやばいよね~みたいに受けた。説明用の倫理観は別な話。

(( 自分が死ぬ前に、尻尾は先に殺しましょう ))
void list_free( struct List* p ) {
if ( p != NULL ) {
list_free( p->next ) ;
free( p ) ;
}
}

振る舞い図とアジャイル開発

UML表記法の第3弾として、振る舞い図の説明を行う。

振る舞い図として、 アクティビティ図、ユースケース図、ステートチャート、シーケンス図、コミュニケーション図 について説明を行う。

アクティビティ図は、システムのフローを記述するもので、フローチャート図に近い図で、 プログラムの細部の記述に使われる。
ユースケース図は、 要求仕様を記述する時などに使われるもので、「システムに対するユーザの役割や、連携する外部システムなどを表す」アクタと、「アクターによるシステムの利用の仕方を表す」ユースケースで記述する。
ステートチャート(状態遷移図)は、 論理回路の順序論理を示すための図と同じように、状態の遷移を「入力・条件」と遷移の際の「出力・関数」を示す。
シーケンス図は、 オブジェクト間のやり取りをタイムラインで示す図で、生存線上に活性区間と、オブジェクト間の メッセージのやり取りを示す。

後半は、想定していた時間が余ったので、 ソフトウェア工学としての トップダウン設計(ウォータフォールモデル)や、ボトムアップ設計などの一般論を話、 最近の少メンバーでの開発の際のアジャイル開発の事例も紹介する。 アジャイルでは、PDCAといったイテレーションの間隔を短くとらえて、 反復開発を行う方法が増えている事例を紹介する。 特に、オブジェクト指向をうまく取り入れてブラックボックス化ができていれば、 修正を随時行っていくリファクタリングが可能となることを説明する。 特に、エクストリームプログラミングでのペアプログラミング・テスト駆動開発などの 言葉も紹介してみた。