- ベストアンサー
Javaで同じ処理内容のメソッドをまとめる方法について
- Javaで同じ処理内容のメソッドを効果的にまとめる方法について教えてください。Template Methodパターンではクラス数が膨大になってしまうため、クラスを増やさずに済む方法があるか知りたいです。
- Javaで同じ処理内容のメソッドをまとめる方法について教えてください。例外処理を共通部分で行い、処理が異なる部分のみを実装したいです。
- Javaで処理内容がほぼ同じメソッドを効率的にまとめる方法について教えてください。Template Methodパターンではクラス数が増えるため、できるだけクラスを増やさずに済む方法を知りたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
TemplateMethodで対象処理メソッド数が、極端に増えるときは設計がおかしいと思ったほうがいいです。 どうしてもTemplateMethodでちょっとずつ違う処理が必要な場合、後で使う側は結局ソースの中身を知ってないといけなくなります。20種類も読んで差異を把握するのは、ほぼ無理です。 そういう時は、分かりやすいクラスで分けてしまって、FactoryMethodで提供側で自動切り替えするといいです。 クラス数が膨大になってもいいと思いますよ。
その他の回答 (3)
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
処理Cを別メソッドとして切り出すだけだと思います。 ちなみに Template Method パターンは処理の骨組みを 共通化して、肉づけを実装するという、いわゆるフレームワーク とか「上位の共通化」に用いるもので、 処理の一部の共通化(下位の共通化)には使いません。 もし、抽象クラスで共通の例外処理を提供し、それを 各具象クラスで利用するというパターンに直せるなら Template Method パターンが使えるかもしれません。 単に同一のクラス内で例外処理が同じメソッドが複数あるだけの場合は Template Method は不適切です。
お礼
Template Methodパターンの使い方を誤解していたようです。 確かに今回のパターンですと、処理Cを切り出すだけの方がよさそうですね… とても勉強になりました。 他の方に教えて頂いたのですが、Factory Methodパターンで書くと綺麗に書けそうですので、 そちらで実装を行いたいと思います。 ご回答いただき、ありがとうございました。
- root139
- ベストアンサー率60% (488/809)
質問内容を見ただけだと、単に処理Cの部分を別のメソッドに切り出せば良いように思えますが・・・。 例) ------------------------------------ // メソッドA public void A(){ try{ // 処理A; } catch (Exception e){ execC(); } } // メソッドB public void B(){ try{ // 処理B; } catch (Exception e){ execC(); } } private void execC() { try{ // 処理C; } catch(Exception e1){ e1.printStackTrace(); } } ---------------------------------------- 恐らく、そうは出来ない理由があるのだと思いますが、もう少し具体的な状況が分からないと何とも・・・。
お礼
ご回答いただきありがとうございます。 少し例が悪かったのですが、今回の例で言う、処理A,処理Bの周辺にかなり面倒な処理(共通処理)が混ざっているような場合についてどのようにしたらよいか、というご相談でした。 後の方に教えていただきましたが、Templateメソッドパターンを使うとよさそうですので、そちらを利用しようと思います。
- nda23
- ベストアンサー率54% (777/1415)
メソッドA、Bを変数で渡し、 リフレクションを使って 実行したらどうでしょう。 でも1メソッドくらいなら、 個別に書いてもと思います。 例外時の処理は共通化されて いるんでしょ? リフレクションって、面倒臭いん ですよね。 「リフレクション」「動的メソッド実行」 のようなキーワードで検索すると、 サンプルが見つかります。
お礼
ご回答いただきありがとうございます。 リフレクションは初めて知りました。 調べてみるとなかなか面倒そうですが、Stringから対応したメソッドが起動できる等、なかなかおもしろい仕組みですね。 今後の参考にさせて頂きます。
お礼
なるほど、FactoryMethodパターンですか。 存在自体は知っていましたが、こういった際に使うと便利なのですね。 とても参考になりました。 ありがとうございました。