相対より絶対
プログラミングには向いてる考え。新人研修ようにネタ出ししたけど使わなかったもの。プログラミング以外にも役にたつかも。
プログラミングにおいて、「相対より絶対で表現した方がバグが入りづらい、扱いやすい」という話。
例:
詳細
・整数で固定小数点データを扱う。
・全般的には上16bitが整数、下16bit小数であつかう
・関数funcは上8bit整数、下24bit小数の入出力
※便宜上シフト時のアンダーフローオーバーフロー対応は割愛
というような場合
1.内容的にはまちがってないが、しゃらっと書いた例
int num=init(); // 上16bitが整数部、下16bitが小数部
num=<<8 ; // funcに入れるために8ビットシフト
num=func(num);
num=>>8; // またもとの系に戻して終了
根底にある考えは「8bitシフトアップしたから、あとで8bitシフトダウンすればいいじゃん」
2.絶対的な表現で書いた例
int num16=init();
int num8=num16<<8;
int ret8=func(num16
int ret16=ret8>>8;
変数名をみるとそれの整数部が何ビットかわかるようになってる。
///////////////
1.と2.を見比べて、なんだ1.でいいじゃんという感想はあるかも。
でも、もっと、手順が複雑化していった場合に、1.のソースでは
numがその場面で整数部が何bitか勘違いしてしまうということが起こりうる。
また、デバッグ時で止めて変数numの値をみたときに整数部が何bitか即座にはわからない。
この例は実際に開発で経験したことがらをもとにしている。DCT変換の高速化でアセンブラコードを扱う場面だった。前任担当者からの説明は、「まえでNbitシフトアップしているので、あとでNbitシフトダウンすればいいんです~」というようなことだった。
その方式は、記憶力がないオレにとっては非常にわかりづらいし、つらい。
2.は変数のシンボルでその部分を解決した例。
num8からnum16へ値を代入するには
num16=num8>>8;だと
長大な前後のストーリーを読まなくても決定できる。
今回は変数名での対応だったが、変数型での対応も可。
///////////////
急に話は変わるが、つまり、
「次の次の電車に乗ってください」というのと
「11:20発の電車に乗ってください」というのと
どっちがまちがいがないかということ。
「こんど」が今度の電車で「つぎ」が「こんど」の次の電車ですね。わかりますw
そうだ、かっちゃんさん。パ:平行六等辺六角形360°/N を応用して何かできないか考えてるんですけど、いかがですか。非周期敷き詰めを強いるタイルのセットとか。
そういえば思い出しました。
会社によって、表記が違うんですよね。
「先発」「次発」「次々発」
「こんど」「つぎ」「そのつぎ」
次の次は何番目の電車?