今日の出来事
- お仕事
- デザパタについてフィードバックをもらった
所感
お仕事
2ヶ月ぐらいのビッグタスクが終わった♪
- Djangoで色々読んだ
デザパタについてフィードバックをもらった。
ユーザーが遊ぶときに 操作するたびにラジコンとリモコンのインスタンス作っちゃうところがイマイチな感じがしますね。組み立てる人と遊ぶ人を分けると良さそう。
— えいる@補助人工心臓で子育て🔥🌇 (@eielh) 2019年12月18日
確かに。
いけてない点 1
リモコンの操作でいうとこれです。 前進の処理。
public function send_forward() { $this->get_relate_radio_control_car()->forward(); }
また、 get_relate_radio_control_car
は こんな定義でした。
public function get_relate_radio_control_car() { return new TakaraTommyRadioControlCar(); }
つまり send_forward
を呼ぶ度に TakaraTommyRadioControlCar()
のインスタンスが生成されてしまいます。
修正点 1
public function __construct() { $this->radio_controller = new TakaraTommyRadioControlCar(); } public function send_forward() { $this->radio_controller->forward(); }
シングルトンてきな感じで実装を行いました。
いけてない点 2
create_radio_controllerつかってないのがなんとも言えないっすなぁ。(これをなおすのはちょっと説明しづらい
— えいる@補助人工心臓で子育て🔥🌇 (@eielh) 2019年12月18日
interface で定義を強制するけど使ってなかった。
修正点 2
DI的な感じで リモコンのコンストラクタに ラジコンのインスタンスを差し込むようにした。
class TakaraTommyRemoteController implements RemoteControllerInterface { /** @var TakaraTommyRadioControlCar */ private $radio_controller; public function __construct($radio_controller) { $this->radio_controller = $radio_controller; } /* 略 */ } class TakaraTommyRadioControllerFactory implements RadioControllerFactoryInterface { public function create_remote_controller() { return new TakaraTommyRemoteController($this->create_radio_controller()); } public function create_radio_controller() { return new TakaraTommyRadioControlCar(); } }
これやったら、大分依存が減って良くなった感がある。
いけてない点 3
よりよい感じになったけどTakaraTommyRadioControllerFactory にリモコンとラジコンの関係が記述されてしまってますね。createXXXなメソッドが2つしかなくて、実質1つしかpublicとしてつかわれてないのもちょっとぐぬぬぬ。ですな
— えいる@補助人工心臓で子育て🔥🌇 (@eielh) 2019年12月18日
ここがなー、結構難しくて 未だに 「お、これだ!!」 ってのに至ってない。
「リモコンとラジコンをどうやって対応付けるか」という話をどこまで現実に即してコード化するかという話になりかねないけど、AbstractFatoryと例としてはリモコンにラジコンを対応付けするsetterがあればよくて、リモコンにラジコンをsetするのを責務にしたクラスを用意すると良いかもしれない。
— えいる@補助人工心臓で子育て🔥🌇 (@eielh) 2019年12月18日
setterがださいと思うなら手はあるんだけどまあ、そこは目的外の話になりそうなので、とりあえず、忘れることにした。
— えいる@補助人工心臓で子育て🔥🌇 (@eielh) 2019年12月18日
修正点 3
> リモコンにラジコンをsetするのを責務にしたクラス
— イルカ@JPUG & 岡山swift (@ikkitang) 2019年12月18日
よもや こいつも Factory なのでは?
リモコンにラジコンを setするのを責務にしたクラス
を作ってみた。
class TakaraTommyRemoteController implements RemoteControllerInterface { private $radio_controller; public function __construct($remote_communicate_tip_factory) { $this->radio_controller = $remote_communicate_tip_factory->create_relate_radio_controller(); } /* 略 */ } /** * リモコンとラジコンとの通信用のチップ * Interface RemoteCommunicateTipFactoryInterface */ interface RemoteCommunicateTipFactoryInterface { /** * @return RadioControlCarInterface */ public function create_relate_radio_controller(); } class TakaraTommyRemoteCommunicateTipFactory implements RemoteCommunicateTipFactoryInterface { public function create_relate_radio_controller() { return new TakaraTommyRadioControlCar(); } }
これで正しいのか・・?
むずいなー。 これは経験を積んでく、いわゆる 量が質に転換する、って所だとは思うけれど。。 でも、本当フィードバックありがたすぎた。
最終型はこれです。