- どこで呼びたしたのか?を引数に渡すと大体カオスになるよ
- 見た目が一緒でも別物として処理する方がいいことがあるよ
というお話です
前提
自分がコードチェックしていて以下のような処理に何度か出くわした
下記のコードの特徴
-
Modal.show(self.class)
で共通的にモーダルを呼び出せる - モーダルででてくる文言や、モーダルにあるボタンでおこなえることはそれぞれ違う
class A
Modal.show(self.class)
end
class B
Modal.show(self.class)
end
class Modal
def self.show(caller)
setTitle(caller)
setYesAction(caller)
# ...つづく
end
def setTitle(caller)
if caller == "A"
# A用のタイトルセット
elsif c == "B"
# B用のタイトルセット
end
end
def setYesAction(caller)
if caller == "A"
# A用のyesActionSet
elsif c == "B"
# B用のyesActionSet
BYesCallBack
end
end
def BYesCallBack
# Bだけに適用されるしょり
end
end
これってFacadeパターン?
上記コードは、なんとなくFacadeパターンっぽいが、Facadeは渡す値は複雑(いろんなタイプの物が入る)だが、やることが明確(返り値が同じ)なケースが適切
例1) 業務アプリなどで、一つの処理が複数の処理の連続になっているケース(本を借りる)
lendBook(book) としたら 本を借りる, 自分の履歴がつく、図書館の在庫がへるなどの一連の処理が行われるとか。
それが本の性質(貴重文庫なのか?とか)によって処理が減ったり増えたりするケースなど
例2)検索アプリで、パラメーター渡したら検索してくれる
search(params)ってやると、とりあえず検索してくれる。paramsの中身によってtag, categoryなどのid検索の場合もあるし、フリーテキストだと検索エンジンに飛ばされる。
けど、どんな処理をしてるかに関わらず返ってくるのはbook_idの配列
イケてない理由
- どこで呼び出したのかを引数にすると、結局Aからよんだ場合何がでてくるのか?がすごくわかりにくい
- Interfaceを揃えて引数によって挙動を分けているが、返ってくるものの見た目は似ているが、結局ものは違うためその後の処理もそれぞれ違っていて、メリットを享受できてない
じゃあどうすればいいのか?
AModal
, BModal
それぞれのクラスを作ればいいと思います
で、見た目を共通化させたいなら、webならcss&classを共通化すればいいし、iOS・Androidならカスタムビューをつくるなり、AlertViewなどを使えばよいのではないかと。
AlertViewを共通化しようとすると上記のようなコードが出来上がります。
最後に
賛否両論あるかと思いますが、自分はこう思うよということを書かせていただきました。
ご指摘いただければ幸いです。