3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

見た目が似ているものの処理を共通化するときは気をつけましょうというお話

Posted at
  • どこで呼びたしたのか?を引数に渡すと大体カオスになるよ
  • 見た目が一緒でも別物として処理する方がいいことがあるよ
    というお話です

前提

自分がコードチェックしていて以下のような処理に何度か出くわした
下記のコードの特徴

  • 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を共通化しようとすると上記のようなコードが出来上がります。

最後に

賛否両論あるかと思いますが、自分はこう思うよということを書かせていただきました。
ご指摘いただければ幸いです。

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?