[2024] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/19 00:13:43
>としか思いつけませんでした。しかし、こうだと Visitor 同様「 if else を
>ずらずら」になるように思います。
AbstractFactoryとその実装クラスにcreateXXXRuntime()がずらずら並ぶ、
というのは確かにそうですが、draw()だけでなく、
「クリックした座標との距離を算出するメソッド」や
「図形を移動させるメソッド」、「図形を囲む最小の矩形を算出するメソッド」等も
DrawShapeRuntimeに入れておけば、それを呼び出すところでは、図形の種類分だけの
何かをずらずら書く必要はなくなりますよね。
(DrawShapeRuntimeというのは、draw()メソッドだけ持っていそうな名前なので、
この名前はよくなかったかもしれません…… 付けるならDrawToolShapeRuntimeでしょうか)
>また、各 Shape のコンストラクターに
>AbstractFactory の分の引数を追加することになるのでしょうか。
それでもよいですし、ShapeRuntimeは、ドローツールならドローツール、
図形ファイルを読み込んで解析するプログラムならそのプログラム、
というように、プログラムの種類ごとに作ることになるのでしょうから、
どこかにstaticに持ってしまってもよいような気もします。
Javaだと、「図形ファイルを読み込んで解析するプログラム」では
デシリアライザを使って図形ファイルを読み込むのでしょうから、
その場合、ShapeRuntimeはreadObject()でくっつけることになりますから、
AbstractFactoryはそこから手が届くところにある必要がありますし。
>ちなみに、つぎのようにするのではだめでしょうか。
…
>abstract class ShapeRuntime {
> protected DrawShapeRuntime drawShapeRuntime;
>
> abstract DrawShapeRuntime getDrawShapeRuntime();
>}
もともとの趣旨として、
「Shapeクラスは、ドローツールだけでなく、たとえばドローツールで作った
ファイルを解析する別のプログラムでも使う」
というものがありました。
その点で、このShapeRuntimeは、「ドローツール」と、
「ドローツールで作ったファイルを解析する別のプログラム」で
共用するものなのでしょうか。
私の想定したShapeRuntimeは、Shapeとセットになっており、Shapeを
使うあらゆるプログラムで使用するものです。そして、ドローツールだけで
使うShapeRuntimeのサブクラスがDrawShapeRuntimeです。
同じ趣旨なのであれば、ShapeRuntimeのメソッドの戻り値の型として、
DrawShapeRuntimeが出てきてしまっては、ShapeRuntimeがドローツール
専用品に依存してしまうので、よろしくないのではないでしょうか。