プログラミング作法

Kota Uchida
Kota Uchidaサイボウズ・ラボユース at サイボウズ・ラボ
プログラミング作法
               分かりやすいソースコード
                   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日土曜日
1 of 27

Recommended

Rpn and forth 超入門 by
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門Yoshitaka Seo
2.9K views25 slides
高度に最適化された移植可能なメモリマネージャ by
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャDADA246
8K views31 slides
Preseeding Debian by
Preseeding DebianPreseeding Debian
Preseeding DebianEmma Haruka Iwao
4.4K views46 slides
ZFSのソースコードをチラ見してみる by
ZFSのソースコードをチラ見してみるZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみるKoichi Suzuki
1.2K views39 slides
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング by
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングSounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングt-sin
2K views43 slides
080720 Vim M by
080720 Vim M080720 Vim M
080720 Vim MTakuya Hashimoto
914 views39 slides

More Related Content

What's hot

文字コードとセキュリティ by
文字コードとセキュリティ文字コードとセキュリティ
文字コードとセキュリティKenta Yamamoto
1.7K views46 slides
ファイルの隠し方 by
ファイルの隠し方ファイルの隠し方
ファイルの隠し方mfumi
1.8K views17 slides
Unity3dにおけるus c# boo比較 by
Unity3dにおけるus c# boo比較Unity3dにおけるus c# boo比較
Unity3dにおけるus c# boo比較Nobukazu Hanada
11K views64 slides
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」 by
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
8.9K views71 slides
Goで言語処理系(の途中まで)を作ろう by
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうEsehara Shigeo
4.8K views79 slides
私がPerlを使う理由 by
私がPerlを使う理由私がPerlを使う理由
私がPerlを使う理由Yohei Azekatsu
2.5K views20 slides

What's hot(12)

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

Viewers also liked

覚えておきたいプログラミング作法 by
覚えておきたいプログラミング作法覚えておきたいプログラミング作法
覚えておきたいプログラミング作法Junya Shimazu
8.6K views27 slides
プログラムの処方箋~健康なコードと病んだコード by
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードShigenori Sagawa
8.9K views59 slides
良い?悪い?コードコメントの書き方 by
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
42.6K views50 slides
コーディングスタイル入門~人に伝えるプログラミング~ by
コーディングスタイル入門~人に伝えるプログラミング~コーディングスタイル入門~人に伝えるプログラミング~
コーディングスタイル入門~人に伝えるプログラミング~Hideki MACHIDA
4.3K views41 slides
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話 by
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話
13.08.10 7行110bytesで構文を拡張 出来るReVIEWの話Kei Nakazawa
5.9K views30 slides
Re viewのリアルタイムプレギュー機能をつくってみたよ by
Re viewのリアルタイムプレギュー機能をつくってみたよRe viewのリアルタイムプレギュー機能をつくってみたよ
Re viewのリアルタイムプレギュー機能をつくってみたよToshihiro Yagi
4.2K views12 slides

Viewers also liked(15)

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

プログラミング作法

  • 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日土曜日