xp寺子屋第9回「シンプル・プログラミング」
TRANSCRIPT
![Page 1: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/1.jpg)
XPJUG関西 / XP寺子屋
1
「シンプル・プログラミング」
2013.11.02
XP寺子屋
![Page 2: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/2.jpg)
XPJUG関西 / XP寺子屋
2
自己紹介
![Page 3: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/3.jpg)
XPJUG関西 / XP寺子屋
3
・・・・名前名前名前名前 :::: 西西西西 丈善丈善丈善丈善((((たけぷたけぷたけぷたけぷ~)~)~)~)
・・・・仕事仕事仕事仕事 :::: 組組組組みみみみ込込込込みみみみ系系系系
・・・・業界歴業界歴業界歴業界歴 :::: 20年以上年以上年以上年以上
・・・・コミュニティコミュニティコミュニティコミュニティ :::: XPJUG関西関西関西関西、、、、PFP関西関西関西関西
・・・・使用言語使用言語使用言語使用言語 :::: C, C++
・・・・SNS :::: Twitter takepu
FaceBook 西西西西 丈善丈善丈善丈善
・・・・宣伝宣伝宣伝宣伝 :::: ▼▼▼▼アジャイルラジオアジャイルラジオアジャイルラジオアジャイルラジオ 毎週水曜日公開毎週水曜日公開毎週水曜日公開毎週水曜日公開
http://www.agileradio.info/
▼▼▼▼XP祭祭祭祭りりりり関西関西関西関西2014 2014年年年年4月月月月26開催決定開催決定開催決定開催決定!!!!
http://www.xpjug.jp
▼▼▼▼出張出張出張出張アジャイルアジャイルアジャイルアジャイル社内研修社内研修社内研修社内研修((((無料無料無料無料))))受付中受付中受付中受付中
![Page 4: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/4.jpg)
XPJUG関西 / XP寺子屋
4
アジェンダ
![Page 5: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/5.jpg)
XPJUG関西 / XP寺子屋
5
アジェンダ
• 「シンプル・プログラミング」講座 - 50分
• コードレビュー - 10分
• 休憩 - 5分
• 練習 - 30分
• 実習 - 90分
• ふりかえり - 10分
• あとかたづけ - 10分
![Page 6: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/6.jpg)
XPJUG関西 / XP寺子屋
6
シンプル・プログラミング
って何?
![Page 7: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/7.jpg)
XPJUG関西 / XP寺子屋
7
ようこそ「シンプル・プログラミング」の世界へ!
![Page 8: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/8.jpg)
XPJUG関西 / XP寺子屋
8
早速質問。
「シンプル」とは、どういう意味?
![Page 9: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/9.jpg)
XPJUG関西 / XP寺子屋
9
kotobankより引用。
![Page 10: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/10.jpg)
XPJUG関西 / XP寺子屋
10
続いて質問。
「シンプルなプログラム」とは、どんなプログラム?
![Page 11: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/11.jpg)
XPJUG関西 / XP寺子屋
11
●行数が少ない?
●関数の数が少ない?
![Page 12: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/12.jpg)
XPJUG関西 / XP寺子屋
12
大切なのは、
「分かりやすい」事.
![Page 13: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/13.jpg)
XPJUG関西 / XP寺子屋
13
どっちが簡単?
![Page 14: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/14.jpg)
XPJUG関西 / XP寺子屋
14
シンプルなプログラムのメリット
• 間違いにくい
• バグが混入しにくい
• デバッグが簡単
• 他人が書いても分かりやすい
• バグの発見が容易
• 仕様変更が容易
• 性能改善も用意
![Page 15: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/15.jpg)
XPJUG関西 / XP寺子屋
15
シンプルなプログラムのデメリット
• 人に自慢できる複雑で難解なコードを書いて悦に入る事ができない
• 複雑なコードを理解した時に得られる達成感が得られない
• 残業できない
![Page 16: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/16.jpg)
XPJUG関西 / XP寺子屋
16
シンプルなプログラムと複雑なプログラム、
あなたはどちらを選びますか?
![Page 17: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/17.jpg)
XPJUG関西 / XP寺子屋
17
シンプル・プログラミング6つの原則
1. コメントの書き方
2. 名前の付け方
3. コピペ禁止
4. 1関数1機能
5. ボトムアップアプローチ
6. インクリメンタル開発
![Page 18: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/18.jpg)
XPJUG関西 / XP寺子屋
18
1.コメントの書き方
って知ってた?
![Page 19: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/19.jpg)
XPJUG関西 / XP寺子屋
19
1.コメントの書き方
• 基本は、「コメントが不要なくらい分かり易いコードを書く」.
• どうしても説明が必要な箇所にコメントを書く.
• コメントは、「処理」では無く、「やりたい事」を書く.
![Page 20: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/20.jpg)
XPJUG関西 / XP寺子屋
20
悪い例/******************//* バブルソート *//******************/#include <stdio.h>#define MAX 10
void main( ){
int data[MAX]={ 80,5,36,23,12,100,45,9,1,78 };int n,i,w;
// 未整列データ数for( n=MAX; n>1; n-- ){
for( i=0; i<n-1; i++ ){
// 次のデータが小さいif ( data[i]>data[i+1] ){
// 入れ替え—w=data[i];data[i]=data[i+1];data[i+1]=w;
}}
}
printf("¥nソート後¥n");for( i=0; i<MAX; i++ ){
printf("%d ",data[i]);}printf("¥n");
}
![Page 21: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/21.jpg)
XPJUG関西 / XP寺子屋
21
改善例/******************//* バブルソート *//******************/#include <stdio.h>#define MAX 10
void main( ){
int data[MAX]={ 80,5,36,23,12,100,45,9,1,78 };int n,i,w;
// 未整列データ数for( n=MAX; n>1; n-- ){
for( i=0; i<n-1; i++ ){
// 次のデータが小さいif ( data[i]>data[i+1] ){
// 入れ替え—w=data[i];data[i]=data[i+1];data[i+1]=w;
}}
}
printf("¥nソート後¥n");for( i=0; i<MAX; i++ ){
printf("%d ",data[i]);}printf("¥n");
}
/******************//* バブルソート *//******************/#include <stdio.h>#define MAX 10
void main( ){
int data[MAX]={ 80,5,36,23,12,100,45,9,1,78 };int n,i,w;
// // // // バブルソートバブルソートバブルソートバブルソートをををを行行行行ううううfor( n=MAX; n>1; n-- ){
for( i=0; i<n-1; i++ ){
// // // // データデータデータデータをををを交換交換交換交換するするするするif ( data[i]>data[i+1] ){
w=data[i];data[i]=data[i+1];data[i+1]=w;
}}
}
// // // // ソートソートソートソート結果結果結果結果をををを表示表示表示表示するするするするprintf("¥nソート後¥n");for( i=0; i<MAX; i++ ){
printf("%d ",data[i]);}printf("¥n");
}
![Page 22: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/22.jpg)
XPJUG関西 / XP寺子屋
22
解説/******************//* バブルソート *//******************/#include <stdio.h>#define MAX 10
void main( ){
int data[MAX]={ 80,5,36,23,12,100,45,9,1,78 };int n,i,w;
// // // // バブルソートバブルソートバブルソートバブルソートをををを行行行行ううううfor( n=MAX; n>1; n-- ){
for( i=0; i<n-1; i++ ){
// // // // データデータデータデータをををを交換交換交換交換するするするするif ( data[i]>data[i+1] ){
w=data[i];data[i]=data[i+1];data[i+1]=w;
}}
}
// // // // ソートソートソートソート結果結果結果結果をををを表示表示表示表示するするするするprintf("¥nソート後¥n");for( i=0; i<MAX; i++ ){
printf("%d ",data[i]);}printf("¥n");
}
/******************//* バブルソート *//******************/// // // // バブルソートバブルソートバブルソートバブルソートをををを行行行行うううう
// // // // データデータデータデータをををを交換交換交換交換するするするする
// // // // ソートソートソートソート結果結果結果結果をををを表示表示表示表示するするするする
•コメントは「やりたい事」
•コードは「実現方法」
![Page 23: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/23.jpg)
XPJUG関西 / XP寺子屋
23
2.名前の付け方
にルールがあるの?
![Page 24: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/24.jpg)
XPJUG関西 / XP寺子屋
24
2.名前の付け方
• 一般的に、コーディング規約で命名規則が決まっている.
• しかし、諸事情でコーディングルールが無かったり、非オブジェクト指向言語では、分かりにくい名称がはびこっている.
• 最近のオブジェクト指向言語で提唱されている命名規則を使用することで、コードの可読性が向上し、シンプルなプログラミングが可能となる.
![Page 25: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/25.jpg)
XPJUG関西 / XP寺子屋
25
命名規則(1) 関数名
• 変数を取得する関数– XXX getXXX( )
• 変数を設定する関数– void getXXX( XXX 変数 )
• Booleanを返す関数– is + 形容詞,can + 動詞,has + 過去分詞,三単元動詞,三単元動詞 + 名詞.
– boolean isEmpty() // JavaBeans でプロパティとして扱える(推奨)
– boolean empty() // だめ!’空にする’という動詞的な意味に取れるため良くない.
– boolean canGet()
– boolean hasChanged()
– boolean contains(Object)
– boolean containsKey(Key)
![Page 26: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/26.jpg)
XPJUG関西 / XP寺子屋
26
命名規則(2) 変数名
• Boolean 変数– 形容詞,is + 形容詞,can + 動詞,has + 過去分詞,三単元動詞,三単元動詞 + 名詞.
– boolean isEmpty
– boolean dirty
– boolean containsMoreElements
• 全て有意な名前を付ける
– Info, Data, Temp, Str, Bufという名前は極力使わない
– ループカウンタなどで用いる i, j, k も、適切な名前を付ける
![Page 27: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/27.jpg)
XPJUG関西 / XP寺子屋
27
命名規則(3) 名前の対称性
• add/remove • insert/delete • get/set • start/stop • begin/end • send/receive • first/last • get/release • put/get • up/down • show/hide • source/target • open/close
• source/destination
• increment/decrement
• lock/unlock
• old/new
• next/previous
クラス名,メソッド名を付ける際は,本頁記載の英語の対称性に気を付ける.
![Page 28: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/28.jpg)
XPJUG関西 / XP寺子屋
28
悪い例/****************/
/* 素因数分解 */
/****************/
#include <stdio.h>
#include <stdlib.h>
void FuncFactorization ( int argc, char *argv[] )
{
int n0,n; // 整数
int ns=2; // 素因数
int j; // 乗数
n0=atoi(argv[1]);
// 因数分解
for( n=n0,ns=2; n>=ns; ns++ )
{
for( j=0; n%ns==0; j++ )
{
n /= ns;
}
if ( j==0 ) continue; // 1回も割り切れなかった
printf("素因数:%d 乗数:%d¥n",ns,j);
}
}
![Page 29: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/29.jpg)
XPJUG関西 / XP寺子屋
29
改善例/****************/
/* 素因数分解 */
/****************/
#include <stdio.h>
#include <stdlib.h>
void FuncFactorization ( int argc, char *argv[] )
{
int n0,n; // 整数
int ns=2; // 素因数
int j; // 乗数
n0=atoi(argv[1]);
// 因数分解
for( n=n0,ns=2; n>=ns; ns++ )
{
for( j=0; n%ns==0; j++ )
{
n /= ns;
}
if ( j==0 ) continue; // 1回も割り切れなかった
printf("素因数:%d 乗数:%d¥n",ns,j);
}
}
/****************/
/* 素因数分解 */
/****************/
#include <stdio.h>
#include <stdlib.h>
void DoFuncFactorization ( int argc, char *argv[] )
{
int num; // 整数
int num_div; // 割り算した整数
int prime = 2; // 素因数
int multiple; // 乗数
num=atoi(argv[1]); // 整数を入力
// 素因数分解
for( num_div=num,prime=2; num_div>=prime; prime++ )
{
for( multiple=0; num_div%prime==0; multiple++ )
{
num_div /= prime;
}
if ( multiple==0 ) continue; // 1回も割り切れなかった
printf("素因数:%d 乗数:%d¥n",prime,multiple);
}
}
![Page 30: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/30.jpg)
XPJUG関西 / XP寺子屋
30
3.コピペ禁止
コピペで生産
性大幅Up!
なのでは?
![Page 31: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/31.jpg)
XPJUG関西 / XP寺子屋
31
3.コピペ禁止
ダメ、絶対!ダメ、絶対!
![Page 32: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/32.jpg)
XPJUG関西 / XP寺子屋
32
「コピペ禁止」の理由
• コピペすると、同じコードが重複して存在することになる。
• ある場所でバグが発生すると、重複するコードすべて変更する必要がある。うっかり修正が漏れると、バグが発生。
• 更にややこしいのは、「関数A」では修正必要だが、「関数B」では変更してはならない場合。それが簡単に気付けるかどうか想像して欲しい。
• コピペはバグの温床と知るべし。
![Page 33: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/33.jpg)
XPJUG関西 / XP寺子屋
33
悪い例//-----------------------------------------int FuncA( int *array, int array_cnt ){
int idx;for( idx=0; idx<array_cnt; idx++ ){
printf( "%d ", array[idx] );}printf( "¥n" );
}
//-----------------------------------------int FuncB( int *array1, int array_cnt1,
int *array2, int array_cnt2 ){
int idx;int *array;int array_cnt;
array = array1;array_cnt = array_cnt1;for( idx=0; idx<array_cnt; idx++ ){
printf( "%d ", array[idx] );}printf( "¥n" );
array = array2;array_cnt = array_cnt2;for( idx=0; idx<array_cnt; idx++ ){
printf( "%d ", array[idx] );}printf( "¥n" );
}
![Page 34: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/34.jpg)
XPJUG関西 / XP寺子屋
34
改善例//----------------------------------------------------------void arrayPrint( int array, int array_cnt ){
int idx;for( idx=0; idx<array_cnt; idx++ ){
printf( "%d ", array[idx] );}printf( "¥n" );
}
//----------------------------------------------------------int FuncA( int *array, int array_cnt ){
arrayPrint( array, array_cnt );}
//----------------------------------------------------------int FuncB( int *array1, int array_cnt1,
int *array2, int array_cnt2 ){
arrayPrint( array1, array_cnt1 );arrayPrint( array2, array_cnt2 );
}
//-----------------------------------------
int FuncA( int *array, int array_cnt )
{
int idx;
for( idx=0; idx<array_cnt; idx++ )
{
printf( "%d ", array[idx] );
}
printf( "¥n" );
}
//-----------------------------------------
int FuncB( int *array1, int array_cnt1,
int *array2, int array_cnt2 )
{
int idx;
int *array;
int array_cnt;
array = array1;
array_cnt = array_cnt1;
for( idx=0; idx<array_cnt; idx++ )
{
printf( "%d ", array[idx] );
}
printf( "¥n" );
array = array2;
array_cnt = array_cnt2;
for( idx=0; idx<array_cnt; idx++ )
{
printf( "%d ", array[idx] );
}
printf( "¥n" );
}
小さい関数を作る事で、再利用性が向上します。
![Page 35: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/35.jpg)
XPJUG関西 / XP寺子屋
35
4.1関数1機能
関数は複雑な
方がカッコイ
イのに
![Page 36: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/36.jpg)
XPJUG関西 / XP寺子屋
36
4.1関数1機能
• シンプル(=簡単)にコードを書くためには、複雑なコードを書いてはダメ。
• 関数は「小さい機能をまとめる」のはNG。
• 「小さい関数をたくさん作る」方がシンプル。
![Page 37: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/37.jpg)
XPJUG関西 / XP寺子屋
37
悪い例/********************************//* ファイルの内容を1行づつ表示 */ /********************************/#include <stdio.h>
int main(void){
FILE *fp;char *fname = "test.txt";char str[100];
fp = fopen( fname, "r" );if( fp == NULL ){
printf( "%sファイルが開けません¥n", fname );return -1;
}
printf( "¥n-- fgets() --¥n" );
while( fgets( str, 100, fp ) != NULL ){
printf( "%s", str );}fclose( fp );return 0;
}
![Page 38: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/38.jpg)
XPJUG関西 / XP寺子屋
38
改善例/********************************/
/* ファイルの内容を1行づつ表示 */
/********************************/
#include <stdio.h>
int main(void)
{
FILE *fp;
char *fname = "test.txt";
char str[100];
fp = fopen( fname, "r" );
if( fp == NULL )
{
printf( "%sファイルが開けません¥n", fname );
return -1;
}
printf( "¥n-- fgets() --¥n" );
while( fgets( str, 100, fp ) != NULL )
{
printf( "%s", str );
}
fclose( fp );
return 0;
}
/********************************/
/* ファイルの内容を1行づつ表示 */
/********************************/
#include <stdio.h>
//-------------------------------int main(){
FILE *fp = NULL;
fp = openFile( "test.txt" ) ;if( fp == NULL ){
printf( "%sファイルが開けません¥n", fname );return -1;
}displayFile( fp );closeFile( fp );return 0;
}//-------------------------------FILE* openFile( char * fname){
return fopen( fname, "r" );}//-------------------------------void displayFile( FILE* fp ){
char str[100];printf( "¥n-- fgets() --¥n" );while( fgets( str, 100, fp ) != NULL ){
printf( "%s", str );}
}//-------------------------------void closeFile( FILE *fp ){
fclose( fp );}
![Page 39: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/39.jpg)
XPJUG関西 / XP寺子屋
39
5.ボトムアップアプローチ
上から書くのが普通で
しょ!?
![Page 40: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/40.jpg)
XPJUG関西 / XP寺子屋
40
5.ボトムアップアプローチ
• 下(下層)の関数から書く。
• 作った関数単体でテストする。
• テストがパスすれば、その関数の1つ上位関数を作り、以降これを繰り返す。
![Page 41: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/41.jpg)
XPJUG関西 / XP寺子屋
41
ボトムアップアプローチのメリット
• 下位関数から開発するので、コンパイルが通しやすい。
• 足元からしっかり開発するので、バグが混入しにくい。
• 呼び出す関数を考慮しなくて済むので、開発中の関数にのみ集中できる。
![Page 42: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/42.jpg)
XPJUG関西 / XP寺子屋
42
悪い例/********************************/
/* ファイルの内容を1行づつ表示 */
/********************************/
#include <stdio.h>
//-------------------------------int main(){
FILE *fp = NULL;
fp = openFile( "test.txt" ) ;if( fp == NULL ){
printf( "%sファイルが開けません¥n", fname );return -1;
}displayFile( fp );closeFile( fp );return 0;
}
//-------------------------------FILE* openFile( char * fname){
return fopen( fname, "r" );}
//-------------------------------void displayFile( FILE* fp ){
char str[100];printf( "¥n-- fgets() --¥n" );while( fgets( str, 100, fp ) != NULL ){
printf( "%s", str );}
}
//-------------------------------void closeFile( FILE *fp ){
fclose( fp );}
①~④の順に開発する
①
②
③
④
![Page 43: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/43.jpg)
XPJUG関西 / XP寺子屋
43
改善例/********************************/
/* ファイルの内容を1行づつ表示 */
/********************************/
#include <stdio.h>
//-------------------------------int main(){
FILE *fp = NULL;
fp = openFile( "test.txt" ) ;if( fp == NULL ){
printf( "%sファイルが開けません¥n", fname );return -1;
}displayFile( fp );closeFile( fp );return 0;
}
//-------------------------------FILE* openFile( char * fname){
return fopen( fname, "r" );}
//-------------------------------void displayFile( FILE* fp ){
char str[100];printf( "¥n-- fgets() --¥n" );while( fgets( str, 100, fp ) != NULL ){
printf( "%s", str );}
}
//-------------------------------void closeFile( FILE *fp ){
fclose( fp );}
①
②
③
④
/********************************/
/* ファイルの内容を1行づつ表示 */
/********************************/
#include <stdio.h>
//-------------------------------int main(){
FILE *fp = NULL;
fp = openFile( "test.txt" ) ;if( fp == NULL ){
printf( "%sファイルが開けません¥n", fname );return -1;
}displayFile( fp );closeFile( fp );return 0;
}
//-------------------------------FILE* openFile( char * fname){
return fopen( fname, "r" );}
//-------------------------------void displayFile( FILE* fp ){
char str[100];printf( "¥n-- fgets() --¥n" );while( fgets( str, 100, fp ) != NULL ){
printf( "%s", str );}
}
//-------------------------------void closeFile( FILE *fp ){
fclose( fp );}
④
③
②
①
①~③は最下層なのでどの順に開発しても良い
![Page 44: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/44.jpg)
XPJUG関西 / XP寺子屋
44
ポイント
• この方法を実現するためには、xUnitなどのテスト環境が必要。
• テスト環境が無ければ、main( )から開発中の関数を呼び出せばOK。関数を追加する度にmain( ) を変更する。最後にmain( )を実装する。
![Page 45: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/45.jpg)
XPJUG関西 / XP寺子屋
45
6.インクリメンタル開発
手戻りは悪!
![Page 46: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/46.jpg)
XPJUG関西 / XP寺子屋
46
6.インクリメンタル開発
• インクリメンタル(機能を順次追加する)に開発する。
• ①手短な設計 → ②テスト → ③コード → ④リファクタリング
• これを、関数単位に実施する。
• ①手短な設計
– 関数の仕様を考える
• ②テスト
– 関数のテストパターンを考える
– xUnitのテストコードを書く
• ③コード
– テストがパスする様、製品コードを書く
• ④リファクタリング
– コードを見直し、必要であれば修正する。
![Page 47: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/47.jpg)
XPJUG関西 / XP寺子屋
47
悪い例/********************************/
/* ファイルの内容を1行づつ表示 */
/********************************/
#include <stdio.h>
//-------------------------------int main(){
FILE *fp = NULL;
fp = openFile( "test.txt" ) ;if( fp == NULL ){
printf( "%sファイルが開けません¥n", fname );return -1;
}displayFile( fp );closeFile( fp );return 0;
}
//-------------------------------FILE* openFile( char * fname){
return fopen( fname, "r" );}
//-------------------------------void displayFile( FILE* fp ){
char str[100];printf( "¥n-- fgets() --¥n" );while( fgets( str, 100, fp ) != NULL ){
printf( "%s", str );}
}
//-------------------------------void closeFile( FILE *fp ){
fclose( fp );}
•手短な設計
•①~④の順に開発する
•一気にテストを実施
•バグってたら修正
•「リファクタリング」しない
①
②
③
④
![Page 48: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/48.jpg)
XPJUG関西 / XP寺子屋
48
改善例/********************************/
/* ファイルの内容を1行づつ表示 */
/********************************/
#include <stdio.h>
//-------------------------------int main(){
FILE *fp = NULL;
fp = openFile( "test.txt" ) ;if( fp == NULL ){
printf( "%sファイルが開けません¥n", fname );return -1;
}displayFile( fp );closeFile( fp );return 0;
}
//-------------------------------FILE* openFile( char * fname){
return fopen( fname, "r" );}
//-------------------------------void displayFile( FILE* fp ){
char str[100];printf( "¥n-- fgets() --¥n" );while( fgets( str, 100, fp ) != NULL ){
printf( "%s", str );}
}
//-------------------------------void closeFile( FILE *fp ){
fclose( fp );}
④
③
②
①
•①開発
•手短な設計
•テストパターン検討
•①開発
•main( )から①を呼び出しテスト
•①リファクタリング
•②開発
•手短な設計
•テストパターン検討
•②開発
•main( )から②を呼び出しテスト
•②リファクタリング
![Page 49: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/49.jpg)
XPJUG関西 / XP寺子屋
49
「シンプル・プログラミング6つの原則」
をご紹介しました。
![Page 50: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/50.jpg)
XPJUG関西 / XP寺子屋
50
シンプル・プログラミング6つの原則
1. コメントの書き方
2. 名前の付け方
3. コピペ禁止
4. 1関数1機能
5. ボトムアップアプローチ
6. インクリメンタル開発
![Page 51: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/51.jpg)
XPJUG関西 / XP寺子屋
51
しかし、開発状況により「6つの原則」を守れない
場合があります。
![Page 52: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/52.jpg)
XPJUG関西 / XP寺子屋
52
•新しい考え方を導入する時間が無い
•メモリ空き容量が少なく、関数をまとめる必要がある
•高速化のため、変数名を短くする必要がある
などなど。
![Page 53: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/53.jpg)
XPJUG関西 / XP寺子屋
53
大切なのは、
「分かりやすい」事.
![Page 54: XP寺子屋第9回「シンプル・プログラミング」](https://reader033.vdocuments.pub/reader033/viewer/2022042716/55a355041a28ab1f248b4616/html5/thumbnails/54.jpg)
XPJUG関西 / XP寺子屋
54
最後までお付き合い頂き、ありがとうございます。