プログラミングで言いたい聞きたいこと集
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 1,092 views

 

Statistics

Views

Total Views
1,092
Slideshare-icon Views on SlideShare
1,092
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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