18
C 言言言言 言言言言言言言言言言言

12_C言語入門 - 読みやすいソースコードを書く

  • Upload
    bcrikko

  • View
    716

  • Download
    0

Embed Size (px)

Citation preview

C 言語入門~ 読みやすいコードを書く ~

2本日の目標

• 読みやすい(可読性の高い)コードを書け

るようになる

• 1 ヶ月後に見返しても、すぐ理解できるよ

うなコードを書けるようになる(「 1 ヶ月前に書いたコードは他人が書いたコード」といわれる)

読みやすいコードは永遠のテーマ

なぜ可読性の高いコードを書く必要があるのか?

5コードが汚いと…

• 理解するのに時間がかかる

• バグが紛れ込みやすい

• 修正・改修が困難になる

• 「一緒に仕事したくない」と思われる

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; }

修正前のコード 修正後のコード

これが正解とは限らない

「読みやすさ」を意識してプログラミングしてください