プログラミングで 言いたい & 聞きたい集 TECO
概要 <ul><li> 普段感じているプログラミングに関する小さなことを集めました。 </li></ul><ul><li> 当たり前と思ってることもあるかもしれませんが、改めて考えてみよう。 </li></ul>
STATIC_ASSERT(1) <ul><li>コンパイル時にエラーを出してくれるアサート。 </li></ul><ul><li>積極的に利用しよう。 </li></ul><ul><li>主な用途:配列サイズ </li></ul><ul><l...
STATIC_ASSERT(2) <ul><li>//  定義例 </li></ul><ul><li>template  < bool >  struct  static_assert_{ </li></ul><ul><li>enum { ok...
配列の参照渡し (1) <ul><li>問 .  静的サイズの配列を関数の引数として渡す時、どれが一番適切でしょうか? </li></ul><ul><li>1. void  SetArray(  int * array ); </li></ul...
配列の参照渡し (2) <ul><li>1. void  SetArray(  int * array ); </li></ul><ul><li> -> 配列じゃなくても渡せてしまう。 </li></ul><ul><li>2. void  Se...
メンバ変数のポインタ化 <ul><li> ちゃんとメリットとデメリットを把握して、ポインタにするか実体にするかを使い分けよう。 </li></ul><ul><li>メリット </li></ul><ul><li> ポインタ化する型を先行宣言すれば...
MASTER_CONST 修飾子 <ul><li>マスタービルド時には定数だが、 </li></ul><ul><li>デバッグ時は調整のため変数にしたいものがある。 </li></ul><ul><li>MASTER_CONST を定義しょう。 ...
Addr 型 <ul><li>ポインタ型を数値変換する場合は、 Addr 型を定義して使いましょう。 </li></ul><ul><li>Uint32  addr =  reinterpret_cast < Uint32 >(ptr);  //...
float 型について <ul><li>比較する時は誤差を考慮したマクロを定義して使おう。 </li></ul><ul><li>// f0 == f1 </li></ul><ul><li>#define  IS_EQUAL_F32( f0 , ...
関数の入力、出力引数 ( 示し方 ) <ul><li>1 . コメントで示している。 </li></ul><ul><li> -> 関数定義を見ただけでは分からない。 </li></ul><ul><li>2 . 引数名で示す。 </li></ul...
関数の入力、出力引数 ( 範囲 ) <ul><li>1.入力、出力、入出力引数全てに示す。 </li></ul><ul><li>    Bool  GetParam( _OUT  int * dst , _IN_OUT  int * param...
Result型 <ul><li>複数の理由で処理が失敗する可能性がある関数 </li></ul><ul><li>は返り値を Bool 型にするな。 </li></ul><ul><li>Result 型を定義して原因を示せ。 </li></ul>...
関数毎に author コメントを付けるべき <ul><li> グループプログラミングをする場合、関数毎に文責者コメントを書いている人は少ない。引き継ぎや質問に支障がでるので書く癖を!! </li></ul><ul><ul><li>/*! </...
入力( Pad,Keyboard )クラスには Rease と Debug 用 API を用意すべし。 <ul><li> アプリケーション側で #if 〜 #endif で分岐してるだけでは残ってしまう可能性がある。根元でも対応すべし。 </l...
以上!! <ul><li>Q & A </li></ul><ul><li>何かあれば [email_address] まで </li></ul>
Upcoming SlideShare
Loading in …5
×

プログラミングで言いたいこと聞きたいこと集

722 views
621 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
722
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
3
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

プログラミングで言いたいこと聞きたいこと集

  1. 1. プログラミングで 言いたい & 聞きたい集 TECO
  2. 2. 概要 <ul><li> 普段感じているプログラミングに関する小さなことを集めました。 </li></ul><ul><li> 当たり前と思ってることもあるかもしれませんが、改めて考えてみよう。 </li></ul>
  3. 3. STATIC_ASSERT(1) <ul><li>コンパイル時にエラーを出してくれるアサート。 </li></ul><ul><li>積極的に利用しよう。 </li></ul><ul><li>主な用途:配列サイズ </li></ul><ul><li> -> 固定サイズの配列を作る時、配列のサイズが正しい値になっているかどうか、確認してますか?  </li></ul><ul><li>  -> 通常のアサートでは実行時チェックなので非効率 </li></ul><ul><li>  ->  STATIC_ASSERT を使ってコンパイルではじこう。 </li></ul>
  4. 4. STATIC_ASSERT(2) <ul><li>// 定義例 </li></ul><ul><li>template < bool > struct static_assert_{ </li></ul><ul><li>enum { okay = 1 }; </li></ul><ul><li>}; </li></ul><ul><li>template <> struct static_assert_< false > {}; </li></ul><ul><li>#define JOIN(a, b) JOIN_(a, b) </li></ul><ul><li>#define JOIN_(a, b) a ## b </li></ul><ul><li>#define STATIC_ASSERT(expr) ¥ </li></ul><ul><li>typedef int JOIN(diagnostics_, __LINE__) ¥ </li></ul><ul><li>[static_assert_<!!(expr)>::okay] </li></ul>
  5. 5. 配列の参照渡し (1) <ul><li>問 . 静的サイズの配列を関数の引数として渡す時、どれが一番適切でしょうか? </li></ul><ul><li>1. void SetArray( int * array ); </li></ul><ul><li>2. void SetArray( int array[5] ); </li></ul><ul><li>3. void SetArray( int (&array)[5]); </li></ul>
  6. 6. 配列の参照渡し (2) <ul><li>1. void SetArray( int * array ); </li></ul><ul><li> -> 配列じゃなくても渡せてしまう。 </li></ul><ul><li>2. void SetArray( int array[5] ); </li></ul><ul><li> -> サイズ 5 じゃない配列でも渡せてしまう。 </li></ul><ul><li>3. void SetArray( int (&array)[5]); </li></ul><ul><li> -> サイズ 5 の配列しか渡せない。 </li></ul><ul><li>正解 : 3 </li></ul>
  7. 7. メンバ変数のポインタ化 <ul><li> ちゃんとメリットとデメリットを把握して、ポインタにするか実体にするかを使い分けよう。 </li></ul><ul><li>メリット </li></ul><ul><li> ポインタ化する型を先行宣言すればクラス間の依存度減 </li></ul><ul><li>  include 回数減=コンパイル時間短縮 </li></ul><ul><li>デメリット </li></ul><ul><li> 要 NULL チェック? </li></ul><ul><li> キャッシュミスの原因になりかねない。 </li></ul>
  8. 8. MASTER_CONST 修飾子 <ul><li>マスタービルド時には定数だが、 </li></ul><ul><li>デバッグ時は調整のため変数にしたいものがある。 </li></ul><ul><li>MASTER_CONST を定義しょう。 </li></ul><ul><li>#if defined (_DEBUG) </li></ul><ul><li>#define MASTER_CONST </li></ul><ul><li>#else </li></ul><ul><li>#define MASTER_CONST const </li></ul><ul><li>#endif </li></ul><ul><li>static MASTER_CONST float s_GameParam = 0.0f; </li></ul><ul><li>#if defined (_DEBUG) </li></ul><ul><li>if( Pad::IsOn( BUTTON_UP ) ){ s_GameParam += 1.0f; } </li></ul><ul><li>#endif </li></ul>
  9. 9. Addr 型 <ul><li>ポインタ型を数値変換する場合は、 Addr 型を定義して使いましょう。 </li></ul><ul><li>Uint32 addr = reinterpret_cast < Uint32 >(ptr); // No </li></ul><ul><li>Addr addr = reinterpret_cast < Addr >(ptr); // Yes </li></ul><ul><li>ポインタのサイズが 32bit である保証はありません。 </li></ul>
  10. 10. float 型について <ul><li>比較する時は誤差を考慮したマクロを定義して使おう。 </li></ul><ul><li>// f0 == f1 </li></ul><ul><li>#define IS_EQUAL_F32( f0 , f1) ¥ </li></ul><ul><li> ((f1) - EPSILON) <= (f0)) && ((f0) <= (f1)+EPSILON) </li></ul><ul><li>// f0 > f1 </li></ul><ul><li>#define IS_MORETHAN_F32( f0 , f1 ) ((f0) > (f1)+EPSILON) </li></ul><ul><li>// f0 < f1 </li></ul><ul><li>#define IS_LESSTHAN_F32( f0 , f1 ) ((f0) < (f1)-EPSILON) </li></ul>
  11. 11. 関数の入力、出力引数 ( 示し方 ) <ul><li>1 . コメントで示している。 </li></ul><ul><li> -> 関数定義を見ただけでは分からない。 </li></ul><ul><li>2 . 引数名で示す。 </li></ul><ul><li>  bool GetParam( int * out_Param ( or outParam ) ); </li></ul><ul><li> -> 命名規則にポリシーを持っている人には相性が悪い恐れあり。 </li></ul><ul><li>3 . 修飾子を付ける </li></ul><ul><li>  bool GetParam( _OUT int * param ); </li></ul><ul><li>個人的には 3 を推奨したいがどうでしょう? </li></ul>
  12. 12. 関数の入力、出力引数 ( 範囲 ) <ul><li>1.入力、出力、入出力引数全てに示す。 </li></ul><ul><li>    Bool GetParam( _OUT int * dst , _IN_OUT int * param0 , </li></ul><ul><li>         _IN int param1 ); </li></ul><ul><li>2.出力、入出力引数のみ示す。 </li></ul><ul><li>   Bool GetParam( _OUT int * dst , _IN_OUT int * param0 , </li></ul><ul><li>          int param1 ); </li></ul><ul><li>入力引数はデフォルトなので、 </li></ul><ul><li>示すのは冗長と感じるがどうだろうか?(2推奨) </li></ul>
  13. 13. Result型 <ul><li>複数の理由で処理が失敗する可能性がある関数 </li></ul><ul><li>は返り値を Bool 型にするな。 </li></ul><ul><li>Result 型を定義して原因を示せ。 </li></ul><ul><li>typedef Uint32 Result; </li></ul><ul><li>#define S_OK 0 // 成功 </li></ul><ul><li>#define E_FAIL 1 // 失敗 </li></ul><ul><li>#define E_INVALID_ARG 2 // 引数が不正 </li></ul><ul><li>・・・ </li></ul>
  14. 14. 関数毎に author コメントを付けるべき <ul><li> グループプログラミングをする場合、関数毎に文責者コメントを書いている人は少ない。引き継ぎや質問に支障がでるので書く癖を!! </li></ul><ul><ul><li>/*! </li></ul></ul><ul><ul><li>* ホゲホゲします。  </li></ul></ul><ul><ul><li>* @authror Miyake Shunsuke </li></ul></ul><ul><ul><li>*/ </li></ul></ul><ul><ul><li>void MogeClass::DoHogeHoge() </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>/ / ホゲホゲ </li></ul></ul><ul><ul><li>} </li></ul></ul>
  15. 15. 入力( Pad,Keyboard )クラスには Rease と Debug 用 API を用意すべし。 <ul><li> アプリケーション側で #if 〜 #endif で分岐してるだけでは残ってしまう可能性がある。根元でも対応すべし。 </li></ul><ul><li>// No </li></ul><ul><li>#if !define (_MANTER) // もしも _MASTER のスペルを間違ってたら・・・ </li></ul><ul><li>if ( Pad::IsPress( BUTTON_A ) ){ </li></ul><ul><li>m_Hp = 100000; // Hp を回復 ( デバッグ用 ) </li></ul><ul><li>} </li></ul><ul><li>#endif </li></ul><ul><li>// Yes </li></ul><ul><li>if ( DebugPad::IsPress( BUTTON_A ) ){ </li></ul><ul><li>m_Hp = 10000; // Hp を回復 ( デバッグ用 ) </li></ul><ul><li>} </li></ul>
  16. 16. 以上!! <ul><li>Q & A </li></ul><ul><li>何かあれば [email_address] まで </li></ul>

×