著作一覧 |
子供が、スターウォーズスターウォーズと叫ぶので、うーん、ポケモンかどっちかだなぁ、と言ったら、スターウォーズときっぱり言った。ニヤリ。そうしたらあまりにこっちが嬉しそうに見えたのかあわてて「でもゲームは別」と付け加えていた。
カムイ外伝やサスケとかのもじりでも書こうかと思ったが、さすがにそんなものを書いても誰もわからんだろうな、と気付く。
そこで思い出したのだが、煙幕を張るというのは伝統的な逃げ手の良い作戦だ。巻きビシ作戦はまた別の機会にでも。
効果的な煙幕は相手を咳き込ませるような煙よりも、相手が桃の畑だと勘違いするようなやつだ。追っ手の経験が浅いうちは、日本語による記述というのは実に甘い香りがする。実は香ばしいだけなんだが元の意味は同じだからだ。そのため優れた煙幕として作用する。
public void updateFoo(Foo democracy, Foo burocracy) { // 民主主義の手がかり int tegakari1 = democracy.getTegakari(); // 民主主義の足がかり int ashigakari1 = democracy.getAshigakari(); ... // 官僚主義の手がかり int tegakari2 = democracy.getTegakari(); // 官僚主義の足がかり int ashigakari2 = democracy.getAshigakari(); ... // 民主政権の打倒 bang(tegakari1, ashigakari1, ..1, ...1, ...1); // 今度は官僚主義を打倒する bang(tegakari1, ashigakari1, ..1, ...1, ...1); ... } ... void bang(int ashigakari, int tegakari, ...) { ... }
各主義(Fooクラス)は属性がたくさんある。その属性をすべてローカル変数に格納する。この時ローカル変数の名前は元の主義がわからなくなるように抽象化すると効果的である。抽象化しすぎると怪しまれて逆効果であるから属性名についてはそのまま利用すると非常に良い。並の追っ手であれば最初の10数行を見てうんざりしているため、第2引数からの属性抽出などコメントをちょっと眺めて、バカと呟いて通り過ぎる(煙幕1)。
そしてこれらの主義を必要とするところに、主義そのものを与えれば済むはずのメソッドをあえて属性を引数としたメソッドとして実装したものに与えさせる(煙幕2)。この時、属性の並び順を煙幕1の並び順と変えておくと更に良い(煙幕3)。
これらの煙幕が破られたときのために、有りえない取り違いも混ぜておく(煙幕4)。
もちろん、テストプログラムも付けて置く。この時、両方の主義の属性が等しくなるように注意深くテストケースを選択しておく。煙幕3の補強のために、肝となる属性値を同値にしておくことも重要だ(煙幕5)。
追記:ask型プログラミングってこういうことになりやすいよな。
ジェズイットを見習え |