ifを使わずに分岐する処理を説明したい

ある方がTwitterで「条件分岐を消したい」とつぶやいており、コードも共有されていました。私は偶然それを目にし、衝動的にリファクタリングを行いました。しかし、ただ「あとは頑張って!」と言って終わるのは責任がないと感じました。そこで、タイトル通りに、条件分岐を使わずに処理を分ける方法について書きたいと思います。

まず、内容を整理します。与えられたコードを見ると、キャラクターのパラメータを表示する処理であることがわかります。具体的には、キャラクターAとキャラクターBのHPを表示するために、個別のUIコンポーネントが使用されています。

以下は処理の流れをイメージした図です。

キャラクターAとキャラクターBは、ダメージを受けると自身のインスタンス情報を引数にしてUI更新処理が実行されます。しかし、この設計では常に「呼び出し元は誰か」という判断が必要です。

そこで、この問題を解決するための方法として、interfaceを使用することを提案します。

interfaceで解決


UIを更新する処理には、IFunction(仮名)というインターフェースを宣言します。このインターフェースには、UIを更新するためのhoge()というメソッドが含まれています。次に、Player用のUIを更新するクラスf_xとEnemy用のUIを更新するクラスf_yを作成します。これらのクラスは、それぞれIFunctionを実装し、IFunctionのUI更新メソッドを実装します。そして、PlayerとEnemyそれぞれに、IFunctionのインスタンスを受け取り、そのIFunctionのUI更新メソッドを実行します。これにより、if文を使用せずに処理を分岐させることができます。

また、この段階で「出力先をコンストラクタで渡してしまえばf_xもf_yも一つになるのでは?」という考えが浮かびます。

最後に

結局のところ、プロダクトごとに最適な実装方法は異なるため、私の意見はあくまで参考程度としてご覧いただき、少しでもお役に立てれば幸いです。


この記事が気に入ったらサポートをしてみませんか?