Upload
bcrikko
View
716
Download
0
Embed Size (px)
Citation preview
2本日の目標
• 読みやすい(可読性の高い)コードを書け
るようになる
• 1 ヶ月後に見返しても、すぐ理解できるよ
うなコードを書けるようになる(「 1 ヶ月前に書いたコードは他人が書いたコード」といわれる)
6汚いコードとは?
• 記述が統一されていない
• 命名(変数名、関数名など)が不適切
• コメントで補足しないと意味が伝わらな
い
• ひとつの関数の処理が長い
• 冗長的な処理が多い
などなど・・・
8可読性の高いコードとは?
• プログラマのワーキングメモリを浪費させない
• インデント・スペース・改行が適切に使われて
おり、構造的にわかりやすい
• 記述が統一されており、処理を予測できる
• 変数名・関数名などに意味を持たせている
• 理解を阻むノイズ(冗長)がない(短い)
9インデントをつかう
#include <stdio.h> int main(void){ int a; printf(" 西暦を入力してください。 \n"); printf(" 西暦 :"); scanf(“%d”,&a); // 入力値を判定して「うるう年」、「平年」を表示するif(0==a%400){ puts (" うるう年です。 "); }else if(a%100==0){ printf(" 平年です。 \n"); }else if(0==a%4){ puts(“ うるう年です。 "); }else{ printf(" 平年です。 \n"); } return 0; }
#include <stdio.h> int main(void){ int a; printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”,&a); // 入力値を判定して「うるう年」、「平年」を表示する if(0==a%400){ puts(“ うるう年です。 "); }else if(a%100==0){ printf(" 平年です。 \n"); }else if(0==a%4){ puts(“ うるう年です。” ); }else{ printf(" 平年です。 \n"); } return 0; }
インデントがないコード インデントをつかったコード
中括弧 {} がでてきたらインデントをつける
10スペースをつかう
#include <stdio.h> int main(void){ int a; printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”,&a); // 入力値を判定して「うるう年」、「平年」を表示する if(0==a%400){ puts(" うるう年です。 "); }else if(a%100==0){ printf(" 平年です。 \n"); }else if(0==a%4){ puts(“ うるう年です。” ); }else{ printf(" 平年です。 \n"); } return 0; }
#include <stdio.h> int main(void){ int a; printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &a); // 入力値を判定して「うるう年」、「平年」を表示する if (0 == a % 400) { puts(" うるう年です。 "); } else if (a % 100 == 0) { printf(" 平年です。 \n"); } else if (0 == a % 4) { puts(“ うるう年です。” ); } else { printf(" 平年です。 \n"); } return 0; }
スペースがないコード スペースをつかったコード
キーワードや式などの間にスペースをいれる
※ 関数名と()の間にはスペースを入れない
11改行をつかう
#include <stdio.h> int main(void){ int a; printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &a); // 入力値を判定して「うるう年」、「平年」を表示する if (0 == a % 400) { puts(" うるう年です。 "); } else if (a % 100 == 0) { printf(" 平年です。 \n"); } else if (0 == a % 4) { puts(“ うるう年です。” ); } else { printf(" 平年です。 \n"); } return 0; }
#include <stdio.h> int main(void){ int a;
printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する if (0 == a % 400) { puts(“ うるう年です。” ); } else if (a % 100 == 0) { printf(" 平年です。 \n"); } else if (0 == a % 4) { puts(“ うるう年です。” ); } else { printf(" 平年です。 \n"); }
return 0; }
改行がないコード 改行をつかったコード
処理のグループごとに改行で区切る
※ このコードを例にとると 1. 変数の宣言 2. 数値の入力 3. 判定処理
12記述を統一する
#include <stdio.h> int main(void){ int a;
printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する if (0 == a % 400) { puts(“ うるう年です。” ); } else if (a % 100 == 0) { printf(" 平年です。 \n"); } else if (0 == a % 4) { puts(“ うるう年です。” ); } else { printf(" 平年です。 \n"); }
return 0; }
#include <stdio.h> int main(void){ int a;
printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する if (a % 400 == 0) { printf(" うるう年です。 \n"); } else if (a % 100 == 0) { printf(" 平年です。 \n"); } else if (a % 4 == 0) { printf(“ うるう年です。 \n”); } else { printf(" 平年です。 \n"); }
return 0; }
統一されていないコード 統一されているコード
if 文の条件は、式を伴なう比較は、左辺に式を書く
不等号なら「左辺 < 右辺」などなど
13適切な変数名をつける
#include <stdio.h> int main(void){ int a;
printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &a);
// 入力値を判定して「うるう年」、「平年」を表示する if (a % 400 == 0) { printf(" うるう年です。 \n"); } else if (a % 100 == 0) { printf(" 平年です。 \n"); } else if (a % 4 == 0) { printf(“ うるう年です。 \n”); } else { printf(" 平年です。 \n"); }
return 0; }
#include <stdio.h> int main(void){ int year;
printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &year);
// 入力値を判定して「うるう年」、「平年」を表示する if (year % 400 == 0) { printf(" うるう年です。 \n"); } else if (year % 100 == 0) { printf(" 平年です。 \n"); } else if (year % 4 == 0) { printf(“ うるう年です。 \n”); } else { printf(" 平年です。 \n"); }
return 0; }
意味のない変数名のコード 意味のある変数名のコード
year なら変数に「年(西暦)」が入っていることがわかる
14コメントを使わず伝える
#include <stdio.h> int main(void){ int year;
printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &year);
// 入力値を判定して「うるう年」、「平年」を表示する if (year % 400 == 0) { printf(" うるう年です。 \n"); } else if (year % 100 == 0) { printf(" 平年です。 \n"); } else if (year % 4 == 0) { printf(“ うるう年です。 \n”); } else { printf(" 平年です。 \n"); }
return 0; }
#include <stdio.h>
int isLeapYear(int year) { if (year % 400 == 0) { return 1; } else if (year % 100 == 0) { return 0; } else if (year % 4 == 0) { return 1; } else { return 0; } }
int main(void){ int year;
printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &year);
if (isLeapYear(year)) { printf(" うるう年です。 \n"); } else { printf(" 平年です。 \n"); }
return 0; }
コメントがあるコード コメントを使わず伝えるコード
main 処理に注目すると、1. if(isLeapYear) だけでうるう年の 判定だとわかる2. うるう年の判定条件を考えなくてよい
15冗長的な処理を削除する
#include <stdio.h>
int isLeapYear(int year) { if (year % 400 == 0) { return 1; } else if (year % 100 == 0) { return 0; } else if (year % 4 == 0) { return 1; } else { return 0; } }
int main(void){ int year;
printf(“ 西暦を入力してください。 \n”); printf(" 西暦 :"); scanf(“%d”, &year);
if (isLeapYear(year)) { printf(" うるう年です。 \n"); } else { printf(" 平年です。 \n"); }
return 0; }
#include <stdio.h>
int isLeapYear(int year) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { return 1; } else { return 0; } }
int main(void){ int year;
printf(" 西暦を入力してください。 \n"); printf(" 西暦 :"); scanf("%d", &year);
if (isLeapYear(year)) { printf(" うるう年です。 \n"); } else { printf(" 平年です。 \n"); }
return 0; }
冗長的なコード 冗長を排除したコード
isLeapYear の return がシンプルになる
※ 冗長させたほうが分かりやすい場合は、そのままにしておく
16修正前後のコードの比較
#include <stdio.h> int main(void){ int a; printf(" 西暦を入力してください。 \n"); printf(" 西暦 :"); scanf(“%d”,&a); // 入力値を判定して「うるう年」、「平年」を表示するif(0==a%400){ puts (" うるう年です。 "); }else if(a%100==0){ printf(" 平年です。 \n"); }else if(0==a%4){ puts(“ うるう年です。 "); }else{ printf(" 平年です。 \n"); } return 0; }
#include <stdio.h>
int isLeapYear(int year) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { return 1; } else { return 0; } }
int main(void){ int year;
printf(" 西暦を入力してください。 \n"); printf(" 西暦 :"); scanf("%d", &year);
if (isLeapYear(year)) { printf(" うるう年です。 \n"); } else { printf(" 平年です。 \n"); }
return 0; }
修正前のコード 修正後のコード