SlideShare a Scribd company logo
1 of 27
Download to read offline
プログラミング作法
               分かりやすいソースコード
                   beatle




13年3月16日土曜日
自己紹介

              • mixC++では2011年冬から活動
              • C++/C#が好き
              • プログラミング教育の研究


13年3月16日土曜日
プログラミング作法

              • ブライアン・カーニハン
              • 当たり前だが重要なこと
              • 可読性・保守性


13年3月16日土曜日
メニュー

              • 命名
              • スタイル
              • コメント
              • 移植性

13年3月16日土曜日
命名

              • 「プログラミングは『名前』が9割。」
               あるブログより

              • 良い名前 ≒ 良いプログラム


13年3月16日土曜日
命名規則

              • 全体で統一する
              • ルールの内容自体は重要でない
              • PascalCase
               camelCase
               snake_case



13年3月16日土曜日
変数名

              •   長く、説明的な名前                                  グローバル変数
                    // 現在の入力キューの長さ
                    int npending = 0;

              • 短く、簡潔な名前                                          ローカル変数
                    for (i = 0; i < nelems; i++)
                    for (theElementIndex = 0;
                            theElementIndex < numberOfElements;
                            theElementIndex++)




13年3月16日土曜日
関数名
              • 「動詞+名詞」が基本
               • putchar
               • getTime
              • 真偽値を返す関数
                 if (check_digit(c)) ...

                 if (is_digit(c)) ...

13年3月16日土曜日
スタイル

              • 全体で統一する
              • ルールの内容自体は重要でない
              • K&R
               BSD/Allman
               GNU



13年3月16日土曜日
自然な形の式

              • 音読するつもりで書く
              • 否定は分かりにくい
               if (!(block_id < actblks) || !(block_id >= unblocks))
                   ...

               if ((block_id >= actblks) || (block_id < unblocks))
                   ...




13年3月16日土曜日
かっこを使おう

              • 演算子の優先順位は分かりにくい
              • 本来不要な場所にも付ける
               leap_year = y % 4 == 0 && y % 100 != 0 || y % 400 == 0;

               leap_year = ((y%4 == 0) && (y%100 != 0)) || (y%400 == 0);




13年3月16日土曜日
慣用句と一貫性
              i = 0;
              while (i <= n-1)
                  array[i++] = 1.0;

              for (i = n; --i >= 0; )
                  array[i] = 1.0;

              for (i = 0; i < n; i++)
                  array[i] = 1.0;       ループの慣用句!



13年3月16日土曜日
慣用句と一貫性
              • 他にも様々な慣用句がある
              • リストのトラバース
               for (p = list; p != NULL; p = p->next)



              • 無限ループ
               for (;;)
               while (1)

13年3月16日土曜日
悪いコメント1
              • 当たり前のことはいちいち書くな
               /* SUCCESS を返す */
               return SUCCESS;


               /* ゼロエントリカウンタをインクリメント */
               zerocount++;




13年3月16日土曜日
悪いコメント2
              • 悪いコードにコメントをつけるな
              /* "result"が0ならマッチするものが見つかったので真を返す
                 そうでなければ"result"はゼロ以外なので偽を返す */

              printf("*** isword returns !result = %dn", !result);
              return(!result);


              printf("*** isword returns matchfound = %dn", matchfound);
              return matchfound;


                       コメント > コードなら怪しい
13年3月16日土曜日
悪いコメントその他


              • コードと矛盾したコメント
              • 読者の混乱を増大させるコメント


13年3月16日土曜日
良いコメント1
              • グローバルデータにコメント
               • 必要に応じて参照されるメモ
               struct Status { /* プレフィクス+サフィックスリスト */
                   char *pref[NPREF]; /* プレフィクス用の単語 */
                   Suffix *suf;       /* サフィックスのリスト */
                   State *next;       /* ハッシュテーブル中の次の項目 */
               };




13年3月16日土曜日
良いコメント2
              • 関数にコメント
               • 関数が全体として何をするか
               // random: [0..r-1]の範囲の整数を返す
               int random(int r)
               {
                   return (int)(Math.floor(Math.random()*r));
               }




13年3月16日土曜日
移植性
              • 自分の環境だけで動けばいい?
              • 自分の環境だって変わる!
              • 移植性向上の労力
                →優れたプログラミング




13年3月16日土曜日
標準に固執する

              • 言語の標準に従う
               • ANSI-C, C99, C++11 ...
              • 標準ライブラリを使う
               • stdio.h, iostream, STL ...

13年3月16日土曜日
条件コンパイル
              • 条件コンパイルは避けよう
               • 全組合せでテストできますか?
              #ifdef _MAC
                  printf("This is Macintoshr");
              #else
                  ほかのシステムではこの文で構文エラー
              #endif




13年3月16日土曜日
まとめ

              • 命名:説明的な名前 vs 簡単な名前
              • スタイル:慣用句で見やすく!
              • コメント:整合性を意識
              • 移植性:良いプログラムへの道

13年3月16日土曜日
命名するということ

              • 名前を付ける
               =抽象化
               =プログラミング

              • 例えば、配列のコピー

13年3月16日土曜日
処理を埋め込む
        int main(void)
        {
            char buf[16], data[N];
            int block = 0, i;
            ...

              // 16バイトずつ読み込んで、dataに格納
              while (1) {
                  fread(buf, 1, sizeof(buf), fp);
                  if (feof(fp)) break;
                  for (i = 0; i < sizeof(buf); i++)
                      data[block * sizeof(buf) + i] = buf[i];
                  block++;
              }
        }

13年3月16日土曜日
関数に分ける
        int main(void)
        {
            char buf[16], data[N];
            int block = 0, i;
            ...

              // 16バイトずつ読み込んで、dataに格納
              while (1) {
                  fread(buf, 1, sizeof(buf), fp);
                  if (feof(fp)) break;
                  copy_array(data + block * sizeof(buf),
                             buf,
                             sizeof(buf));
                  block++;
              }
        }
13年3月16日土曜日
// 16バイトずつ読み込んで、dataに格納
              while (1) {
                  fread(buf, 1, sizeof(buf), fp);
                  if (feof(fp)) break;
                  for (i = 0; i < sizeof(buf); i++)
                      data[block * sizeof(buf) + i] = buf[i];
                  block++;

                                      抽象化
              }


                // 16バイトずつ読み込んで、dataに格納
                while (1) {
                    fread(buf, 1, sizeof(buf), fp);
                    if (feof(fp)) break;
                    copy_array(data + block * sizeof(buf),
                               buf,
                               sizeof(buf));
                    block++;
                }


13年3月16日土曜日
ラベル付けは大事!!

              ご清聴ありがとうございました




13年3月16日土曜日

More Related Content

What's hot

文字コードとセキュリティ
文字コードとセキュリティ文字コードとセキュリティ
文字コードとセキュリティKenta Yamamoto
 
ファイルの隠し方
ファイルの隠し方ファイルの隠し方
ファイルの隠し方mfumi
 
Unity3dにおけるus c# boo比較
Unity3dにおけるus c# boo比較Unity3dにおけるus c# boo比較
Unity3dにおけるus c# boo比較Nobukazu Hanada
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
 
Goで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうEsehara Shigeo
 
私がPerlを使う理由
私がPerlを使う理由私がPerlを使う理由
私がPerlを使う理由Yohei Azekatsu
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」Hiro H.
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
黒い画面克服委員会 Vol.1
黒い画面克服委員会 Vol.1黒い画面克服委員会 Vol.1
黒い画面克服委員会 Vol.1Atsuko MATSUOKA
 
TaTa's Present
TaTa's PresentTaTa's Present
TaTa's Present050h
 
SDK for NFC Starter Kit(2) 使ってみる
SDK for NFC Starter Kit(2) 使ってみるSDK for NFC Starter Kit(2) 使ってみる
SDK for NFC Starter Kit(2) 使ってみるHirokuma Ueno
 

What's hot (12)

文字コードとセキュリティ
文字コードとセキュリティ文字コードとセキュリティ
文字コードとセキュリティ
 
ファイルの隠し方
ファイルの隠し方ファイルの隠し方
ファイルの隠し方
 
Unity3dにおけるus c# boo比較
Unity3dにおけるus c# boo比較Unity3dにおけるus c# boo比較
Unity3dにおけるus c# boo比較
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
Goで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろう
 
私がPerlを使う理由
私がPerlを使う理由私がPerlを使う理由
私がPerlを使う理由
 
C-langage
C-langageC-langage
C-langage
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
黒い画面克服委員会 Vol.1
黒い画面克服委員会 Vol.1黒い画面克服委員会 Vol.1
黒い画面克服委員会 Vol.1
 
TaTa's Present
TaTa's PresentTaTa's Present
TaTa's Present
 
SDK for NFC Starter Kit(2) 使ってみる
SDK for NFC Starter Kit(2) 使ってみるSDK for NFC Starter Kit(2) 使ってみる
SDK for NFC Starter Kit(2) 使ってみる
 

Viewers also liked

覚えておきたいプログラミング作法
覚えておきたいプログラミング作法覚えておきたいプログラミング作法
覚えておきたいプログラミング作法Junya Shimazu
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードShigenori Sagawa
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 
コーディングスタイル入門~人に伝えるプログラミング~
コーディングスタイル入門~人に伝えるプログラミング~コーディングスタイル入門~人に伝えるプログラミング~
コーディングスタイル入門~人に伝えるプログラミング~Hideki MACHIDA
 
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話Kei Nakazawa
 
Re viewのリアルタイムプレギュー機能をつくってみたよ
Re viewのリアルタイムプレギュー機能をつくってみたよRe viewのリアルタイムプレギュー機能をつくってみたよ
Re viewのリアルタイムプレギュー機能をつくってみたよToshihiro Yagi
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築Masahiro Wakame
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツShunji Konishi
 
名前重要 超重要
名前重要 超重要名前重要 超重要
名前重要 超重要baban ba-n
 
書籍制作でReVIEWを使う実践ワークフロー
書籍制作でReVIEWを使う実践ワークフロー書籍制作でReVIEWを使う実践ワークフロー
書籍制作でReVIEWを使う実践ワークフローMasahiro Hidaka
 
オブジェクト指向やめましょう
オブジェクト指向やめましょうオブジェクト指向やめましょう
オブジェクト指向やめましょうなおき きしだ
 
ネイティブ開発アンチパターン
ネイティブ開発アンチパターンネイティブ開発アンチパターン
ネイティブ開発アンチパターンYuki Tamura
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)Yuki Tamura
 
VRゲーム開発の現在と将来
VRゲーム開発の現在と将来VRゲーム開発の現在と将来
VRゲーム開発の現在と将来Haruto Watanabe
 

Viewers also liked (15)

覚えておきたいプログラミング作法
覚えておきたいプログラミング作法覚えておきたいプログラミング作法
覚えておきたいプログラミング作法
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
コーディングスタイル入門~人に伝えるプログラミング~
コーディングスタイル入門~人に伝えるプログラミング~コーディングスタイル入門~人に伝えるプログラミング~
コーディングスタイル入門~人に伝えるプログラミング~
 
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話
 
Re viewのリアルタイムプレギュー機能をつくってみたよ
Re viewのリアルタイムプレギュー機能をつくってみたよRe viewのリアルタイムプレギュー機能をつくってみたよ
Re viewのリアルタイムプレギュー機能をつくってみたよ
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツ
 
名前重要 超重要
名前重要 超重要名前重要 超重要
名前重要 超重要
 
書籍制作でReVIEWを使う実践ワークフロー
書籍制作でReVIEWを使う実践ワークフロー書籍制作でReVIEWを使う実践ワークフロー
書籍制作でReVIEWを使う実践ワークフロー
 
オブジェクト指向やめましょう
オブジェクト指向やめましょうオブジェクト指向やめましょう
オブジェクト指向やめましょう
 
ネイティブ開発アンチパターン
ネイティブ開発アンチパターンネイティブ開発アンチパターン
ネイティブ開発アンチパターン
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
 
VRゲーム開発の現在と将来
VRゲーム開発の現在と将来VRゲーム開発の現在と将来
VRゲーム開発の現在と将来
 

プログラミング作法

  • 1. プログラミング作法 分かりやすいソースコード beatle 13年3月16日土曜日
  • 2. 自己紹介 • mixC++では2011年冬から活動 • C++/C#が好き • プログラミング教育の研究 13年3月16日土曜日
  • 3. プログラミング作法 • ブライアン・カーニハン • 当たり前だが重要なこと • 可読性・保守性 13年3月16日土曜日
  • 4. メニュー • 命名 • スタイル • コメント • 移植性 13年3月16日土曜日
  • 5. 命名 • 「プログラミングは『名前』が9割。」 あるブログより • 良い名前 ≒ 良いプログラム 13年3月16日土曜日
  • 6. 命名規則 • 全体で統一する • ルールの内容自体は重要でない • PascalCase camelCase snake_case 13年3月16日土曜日
  • 7. 変数名 • 長く、説明的な名前 グローバル変数 // 現在の入力キューの長さ int npending = 0; • 短く、簡潔な名前 ローカル変数 for (i = 0; i < nelems; i++) for (theElementIndex = 0; theElementIndex < numberOfElements; theElementIndex++) 13年3月16日土曜日
  • 8. 関数名 • 「動詞+名詞」が基本 • putchar • getTime • 真偽値を返す関数 if (check_digit(c)) ... if (is_digit(c)) ... 13年3月16日土曜日
  • 9. スタイル • 全体で統一する • ルールの内容自体は重要でない • K&R BSD/Allman GNU 13年3月16日土曜日
  • 10. 自然な形の式 • 音読するつもりで書く • 否定は分かりにくい if (!(block_id < actblks) || !(block_id >= unblocks)) ... if ((block_id >= actblks) || (block_id < unblocks)) ... 13年3月16日土曜日
  • 11. かっこを使おう • 演算子の優先順位は分かりにくい • 本来不要な場所にも付ける leap_year = y % 4 == 0 && y % 100 != 0 || y % 400 == 0; leap_year = ((y%4 == 0) && (y%100 != 0)) || (y%400 == 0); 13年3月16日土曜日
  • 12. 慣用句と一貫性 i = 0; while (i <= n-1) array[i++] = 1.0; for (i = n; --i >= 0; ) array[i] = 1.0; for (i = 0; i < n; i++) array[i] = 1.0; ループの慣用句! 13年3月16日土曜日
  • 13. 慣用句と一貫性 • 他にも様々な慣用句がある • リストのトラバース for (p = list; p != NULL; p = p->next) • 無限ループ for (;;) while (1) 13年3月16日土曜日
  • 14. 悪いコメント1 • 当たり前のことはいちいち書くな /* SUCCESS を返す */ return SUCCESS; /* ゼロエントリカウンタをインクリメント */ zerocount++; 13年3月16日土曜日
  • 15. 悪いコメント2 • 悪いコードにコメントをつけるな /* "result"が0ならマッチするものが見つかったので真を返す そうでなければ"result"はゼロ以外なので偽を返す */ printf("*** isword returns !result = %dn", !result); return(!result); printf("*** isword returns matchfound = %dn", matchfound); return matchfound; コメント > コードなら怪しい 13年3月16日土曜日
  • 16. 悪いコメントその他 • コードと矛盾したコメント • 読者の混乱を増大させるコメント 13年3月16日土曜日
  • 17. 良いコメント1 • グローバルデータにコメント • 必要に応じて参照されるメモ struct Status { /* プレフィクス+サフィックスリスト */ char *pref[NPREF]; /* プレフィクス用の単語 */ Suffix *suf; /* サフィックスのリスト */ State *next; /* ハッシュテーブル中の次の項目 */ }; 13年3月16日土曜日
  • 18. 良いコメント2 • 関数にコメント • 関数が全体として何をするか // random: [0..r-1]の範囲の整数を返す int random(int r) { return (int)(Math.floor(Math.random()*r)); } 13年3月16日土曜日
  • 19. 移植性 • 自分の環境だけで動けばいい? • 自分の環境だって変わる! • 移植性向上の労力  →優れたプログラミング 13年3月16日土曜日
  • 20. 標準に固執する • 言語の標準に従う • ANSI-C, C99, C++11 ... • 標準ライブラリを使う • stdio.h, iostream, STL ... 13年3月16日土曜日
  • 21. 条件コンパイル • 条件コンパイルは避けよう • 全組合せでテストできますか? #ifdef _MAC printf("This is Macintoshr"); #else ほかのシステムではこの文で構文エラー #endif 13年3月16日土曜日
  • 22. まとめ • 命名:説明的な名前 vs 簡単な名前 • スタイル:慣用句で見やすく! • コメント:整合性を意識 • 移植性:良いプログラムへの道 13年3月16日土曜日
  • 23. 命名するということ • 名前を付ける =抽象化 =プログラミング • 例えば、配列のコピー 13年3月16日土曜日
  • 24. 処理を埋め込む int main(void) { char buf[16], data[N]; int block = 0, i; ... // 16バイトずつ読み込んで、dataに格納 while (1) { fread(buf, 1, sizeof(buf), fp); if (feof(fp)) break; for (i = 0; i < sizeof(buf); i++) data[block * sizeof(buf) + i] = buf[i]; block++; } } 13年3月16日土曜日
  • 25. 関数に分ける int main(void) { char buf[16], data[N]; int block = 0, i; ... // 16バイトずつ読み込んで、dataに格納 while (1) { fread(buf, 1, sizeof(buf), fp); if (feof(fp)) break; copy_array(data + block * sizeof(buf), buf, sizeof(buf)); block++; } } 13年3月16日土曜日
  • 26. // 16バイトずつ読み込んで、dataに格納 while (1) { fread(buf, 1, sizeof(buf), fp); if (feof(fp)) break; for (i = 0; i < sizeof(buf); i++) data[block * sizeof(buf) + i] = buf[i]; block++; 抽象化 } // 16バイトずつ読み込んで、dataに格納 while (1) { fread(buf, 1, sizeof(buf), fp); if (feof(fp)) break; copy_array(data + block * sizeof(buf), buf, sizeof(buf)); block++; } 13年3月16日土曜日
  • 27. ラベル付けは大事!! ご清聴ありがとうございました 13年3月16日土曜日