オブジェクトの依存関係にもやもや

先日、Game クラスが Ship クラスへ強く直接依存しているから修正しようということを書いた。



この依存をどうやって弱くするかを考えだしたら、凄くもやもやし始めた。


どんな風に依存しているのかというと、Game クラスの中で、Ship クラスのオブジェクトリテラルを記述してインスタンス化している。
つまり Game クラスの中に、Ship {...} という記述が存在しているから。


でもそもそも宣言的文法 (declarative syntax) によるオブジェクトリテラルを使ってクラスのインスタンスを生成するのは JavaFX のスタイル。
参照する変数をスーパークラス(またはインタフェース)の型にしたとしても、オブジェクトリテラルを書いてしまったら具象クラスに依存してしまうのは当然のこと。
とは言えインスタンスの型の変更の可能性があり抽象化したい場所は開放/閉鎖原則に従う形にしたいと思うんだけど、こんな考え方はするべきじゃない? JavaFX のような言語においては。


ゲームの例では、あるときは自機を移動 foo = me; foo.move(); して、またあるときは敵を移動 foo = enemy; foo.move(); したりする場合、この foo.move(); を抽象化したい。
こう考えるのは Java をやるときの脳ミソが活発になっているから。
一方で JavaScript をやるときの脳ミソはさすがに無反応。


JavaJavaScript も両方使うけど、静的な型付けのオブジェクト指向言語と宣言型文法という両者の性格を持つような JavaFX を使い出したら、凄いもやもやし始めてしまったよ。


「面倒だから JavaFX 辞めて、Swing しろよ」って言われそうだ。
いいえ、いやです。Swing も良いけど、JavaFX がしたいです。


う〜ん。
JavaFX が宣言的文法を採用したのは、そうすることに利点があってしたことだろうし、それが JavaFX なのだ。
けれどもファクトリやDIコンテナを使ってみるのも良いかもしれない。
正解は?
JavaFX にとっての現実的で最善のソリューションとは。。。