きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

テストの悩み

設計書があれば、テスターはテスト出来るはずだ。


しかし設計書がないとテストは難しい。


正解のないテストは、テストじゃない。


僕がやってるのはテストなのか、はたまた未整理な仕様の整備なのか。


「(設計書作るより)作った方が速い」と言うけれど、正解を共有出来る方法が用意されてなければ、ただのお遊びじゃん。
JavaDocに書くのでもいいさ。
でもテスターには仕様は書けない。
まあ、簡単な奴は書けるけどさ、それは実情を書いてるだけで、求めてる動作とは限らない。
だから厳密にはやってはならない。


複雑に移譲したモデルだと、
他のクラスを利用したり、
また戻り値として他のクラスを返す。
単体試験なんだけど結合してる。
オープン系に来てよく分かってないのが、
この辺りの線引きかな。
Mockが作れるなら作るけどな。


クラスAのメソッドを呼ぶと、
クラスBに情報が登録される。
クラスBがクラスAのスーパークラスならば
わりとよくあるモデルでテストしやすいけど、
違うんだったらテストしにくく感じる。


話は変わって。


単純なことだが、継承を使いまくってるbeanライクなクラスがあり、toString()をオーバーライドしまくるのだが、this.stringAをappendするのと、this.getStringA()をappendするのは意味が違う。違いが分からないなんて言わないで欲しい。


普通のpublicメソッドはオーバーライドされることがあるのと、privateフィールドはサブクラスから見れないのと。


僕の抱えているtoString()ではどうしたいのだろう。


なんかfinalメソッドにしてしまうというのも思い浮かんだ。


僕はあんまりJavaの一般的なことは知らないんだけど、意図の読み取れないコードってのは、
まず第一にコメントが少なく、
修飾子やメソッド名に気を使ってない。


修飾子に気を配る人は少ないと感じる。


スーパークラスに、IDを表すStringをprivateに定義するか、protectedに定義するか。
僕はprotected派だ。
サブクラスからgetId()するのは馬鹿らしい。
また、スーパークラスのgetId()はfinalを付ける。


this.フィールド名は、そのインスタンスから参照可能なフィールドを意味するが、サブクラスに同名のフィールドがあってもそっちは見ない。
しかし、this.メソッド名は、サブクラスでオーバーライドされてたらそっちを呼ぶ。


beanライクなクラスで、サブクラスに追加的な情報をprivateフィールドに追加していくなら、toString()の実装は、まずはsuper.toString()して、次に追加の情報をappendするだろう。
スーパークラスのメソッドオーバーライドを許容するなら、スーパークラスのtoString()では、this.フィールド名は使ってはいけない。
なんか面倒だから、僕ならfinalメソッドにして、protectedフィールドにすることで、スーパークラスのtoString()でthis.フィールド名を使えるようにする。


アセンブリレベルでは違いが出る。
getfieldなのかinvokevirtualなのか。
どちらが速いかと言えば、getfieldの方が速い。
なぜなら、invokevirtual先で結局getfieldしてるのだから。


protectedフィールドは性能的に微々たる意味をもたらすってことだ。


まあ、ユーザーでカスタマイズして使うようなものは、protectedにすると怖いので、this.メソッド名に統一しとくか。。。