テストの悩み
設計書があれば、テスターはテスト出来るはずだ。
しかし設計書がないとテストは難しい。
正解のないテストは、テストじゃない。
僕がやってるのはテストなのか、はたまた未整理な仕様の整備なのか。
「(設計書作るより)作った方が速い」と言うけれど、正解を共有出来る方法が用意されてなければ、ただのお遊びじゃん。
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.メソッド名に統一しとくか。。。