Javaにおいて、処理内容がほぼ同じメソッドを上手くまとめるにはどうすればよいでしょうか?
もう少し具体的に説明をさせて頂きます。
例えば、以下の様なメソッドA, Bがあるものとします。
https://gist.github.com/4187704
この時、例外処理をしている共通部分を二重に書かず、処理が違う部分だけを実装するようにするにはどのようにすればよいでしょうか?
というのが、質問の主旨になります。
色々調べた所、Template Methodパターンというものがあるのを知りましたが、自分の場合は、同様のメソッドが20個ほどあり、Template Methodパターンを使うとクラス数が膨大になってしまうため、なるべくクラスを増やさずに済む方法があれば教えていただきたいと思います。
よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
TemplateMethodで対象処理メソッド数が、極端に増えるときは設計がおかしいと思ったほうがいいです。
どうしてもTemplateMethodでちょっとずつ違う処理が必要な場合、後で使う側は結局ソースの中身を知ってないといけなくなります。20種類も読んで差異を把握するのは、ほぼ無理です。
そういう時は、分かりやすいクラスで分けてしまって、FactoryMethodで提供側で自動切り替えするといいです。
クラス数が膨大になってもいいと思いますよ。
なるほど、FactoryMethodパターンですか。
存在自体は知っていましたが、こういった際に使うと便利なのですね。
とても参考になりました。
ありがとうございました。
No.4
- 回答日時:
処理Cを別メソッドとして切り出すだけだと思います。
ちなみに Template Method パターンは処理の骨組みを
共通化して、肉づけを実装するという、いわゆるフレームワーク
とか「上位の共通化」に用いるもので、
処理の一部の共通化(下位の共通化)には使いません。
もし、抽象クラスで共通の例外処理を提供し、それを
各具象クラスで利用するというパターンに直せるなら
Template Method パターンが使えるかもしれません。
単に同一のクラス内で例外処理が同じメソッドが複数あるだけの場合は
Template Method は不適切です。
Template Methodパターンの使い方を誤解していたようです。
確かに今回のパターンですと、処理Cを切り出すだけの方がよさそうですね…
とても勉強になりました。
他の方に教えて頂いたのですが、Factory Methodパターンで書くと綺麗に書けそうですので、
そちらで実装を行いたいと思います。
ご回答いただき、ありがとうございました。
No.2
- 回答日時:
質問内容を見ただけだと、単に処理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メソッドパターンを使うとよさそうですので、そちらを利用しようと思います。
No.1
- 回答日時:
メソッドA、Bを変数で渡し、
リフレクションを使って
実行したらどうでしょう。
でも1メソッドくらいなら、
個別に書いてもと思います。
例外時の処理は共通化されて
いるんでしょ?
リフレクションって、面倒臭いん
ですよね。
「リフレクション」「動的メソッド実行」
のようなキーワードで検索すると、
サンプルが見つかります。
ご回答いただきありがとうございます。
リフレクションは初めて知りました。
調べてみるとなかなか面倒そうですが、Stringから対応したメソッドが起動できる等、なかなかおもしろい仕組みですね。
今後の参考にさせて頂きます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
final修飾子を使っているのに、...
-
コマンドプロンプト実行後に画...
-
エラーの意味を
-
JSPで<SELECT>の中にDBから持っ...
-
javascriptからjavaを呼び出したい
-
Labelコントロールに数字を代入...
-
DataGridViewでセルクリックイ...
-
C# 演算 最大値 最小値 表現の仕方
-
タブコントロールの問題 (VB)
-
VB.NETで色を比較するIF文を...
-
【sendkeysメソッドが動かずに...
-
配列のメソッド
-
eclipse-Tomcatでのデバッグに...
-
PDFファイルから別ウィンドウで...
-
ウィンドウを最前面にできません
-
引数は省略できません。とのコ...
-
C#の動的キャスト
-
javaで最前面表示はできますか?
-
ODBCでMoveNextがうまく動作し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
コマンドプロンプト実行後に画...
-
DataGridViewでセルクリックイ...
-
Labelコントロールに数字を代入...
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
mainメソッドのthrows節で設定...
-
Refreshメソッドの使い方
-
配列のメソッド
-
final修飾子を使っているのに、...
-
VBPをダブルクリックするとたま...
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
【sendkeysメソッドが動かずに...
-
Excel VBA でExcelを終了したい...
-
VB.netで、シリアル通信のタイ...
-
Application.Wait の参照設定
-
Excel VBA シェイプの原型のサ...
-
onClickで関数呼出し後に、結果...
-
drawStringで文字間隔の調整
おすすめ情報