アプリ版:「スタンプのみでお礼する」機能のリリースについて

Javaにおいて、処理内容がほぼ同じメソッドを上手くまとめるにはどうすればよいでしょうか?

もう少し具体的に説明をさせて頂きます。
例えば、以下の様なメソッドA, Bがあるものとします。
https://gist.github.com/4187704

この時、例外処理をしている共通部分を二重に書かず、処理が違う部分だけを実装するようにするにはどのようにすればよいでしょうか?
というのが、質問の主旨になります。

色々調べた所、Template Methodパターンというものがあるのを知りましたが、自分の場合は、同様のメソッドが20個ほどあり、Template Methodパターンを使うとクラス数が膨大になってしまうため、なるべくクラスを増やさずに済む方法があれば教えていただきたいと思います。

よろしくお願い致します。

A 回答 (4件)

処理Cを別メソッドとして切り出すだけだと思います。



ちなみに Template Method パターンは処理の骨組みを
共通化して、肉づけを実装するという、いわゆるフレームワーク
とか「上位の共通化」に用いるもので、
処理の一部の共通化(下位の共通化)には使いません。

もし、抽象クラスで共通の例外処理を提供し、それを
各具象クラスで利用するというパターンに直せるなら
Template Method パターンが使えるかもしれません。

単に同一のクラス内で例外処理が同じメソッドが複数あるだけの場合は
Template Method は不適切です。
    • good
    • 0
この回答へのお礼

Template Methodパターンの使い方を誤解していたようです。
確かに今回のパターンですと、処理Cを切り出すだけの方がよさそうですね…
とても勉強になりました。

他の方に教えて頂いたのですが、Factory Methodパターンで書くと綺麗に書けそうですので、
そちらで実装を行いたいと思います。

ご回答いただき、ありがとうございました。

お礼日時:2012/12/03 13:28

TemplateMethodで対象処理メソッド数が、極端に増えるときは設計がおかしいと思ったほうがいいです。


どうしてもTemplateMethodでちょっとずつ違う処理が必要な場合、後で使う側は結局ソースの中身を知ってないといけなくなります。20種類も読んで差異を把握するのは、ほぼ無理です。
そういう時は、分かりやすいクラスで分けてしまって、FactoryMethodで提供側で自動切り替えするといいです。
クラス数が膨大になってもいいと思いますよ。
    • good
    • 0
この回答へのお礼

なるほど、FactoryMethodパターンですか。

存在自体は知っていましたが、こういった際に使うと便利なのですね。
とても参考になりました。
ありがとうございました。

お礼日時:2012/12/03 13:24

質問内容を見ただけだと、単に処理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();
}
}
----------------------------------------

恐らく、そうは出来ない理由があるのだと思いますが、もう少し具体的な状況が分からないと何とも・・・。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。

少し例が悪かったのですが、今回の例で言う、処理A,処理Bの周辺にかなり面倒な処理(共通処理)が混ざっているような場合についてどのようにしたらよいか、というご相談でした。

後の方に教えていただきましたが、Templateメソッドパターンを使うとよさそうですので、そちらを利用しようと思います。

お礼日時:2012/12/03 11:54

メソッドA、Bを変数で渡し、


リフレクションを使って
実行したらどうでしょう。
でも1メソッドくらいなら、
個別に書いてもと思います。
例外時の処理は共通化されて
いるんでしょ?
リフレクションって、面倒臭いん
ですよね。
「リフレクション」「動的メソッド実行」
のようなキーワードで検索すると、
サンプルが見つかります。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。

リフレクションは初めて知りました。
調べてみるとなかなか面倒そうですが、Stringから対応したメソッドが起動できる等、なかなかおもしろい仕組みですね。
今後の参考にさせて頂きます。

お礼日時:2012/12/03 11:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!