Javaにおいて、処理内容がほぼ同じメソッドを上手くまとめるにはどうすればよいでしょうか?
もう少し具体的に説明をさせて頂きます。
例えば、以下の様なメソッドA, Bがあるものとします。
https://gist.github.com/4187704
この時、例外処理をしている共通部分を二重に書かず、処理が違う部分だけを実装するようにするにはどのようにすればよいでしょうか?
というのが、質問の主旨になります。
色々調べた所、Template Methodパターンというものがあるのを知りましたが、自分の場合は、同様のメソッドが20個ほどあり、Template Methodパターンを使うとクラス数が膨大になってしまうため、なるべくクラスを増やさずに済む方法があれば教えていただきたいと思います。
よろしくお願い致します。
No.4
- 回答日時:
処理Cを別メソッドとして切り出すだけだと思います。
ちなみに Template Method パターンは処理の骨組みを
共通化して、肉づけを実装するという、いわゆるフレームワーク
とか「上位の共通化」に用いるもので、
処理の一部の共通化(下位の共通化)には使いません。
もし、抽象クラスで共通の例外処理を提供し、それを
各具象クラスで利用するというパターンに直せるなら
Template Method パターンが使えるかもしれません。
単に同一のクラス内で例外処理が同じメソッドが複数あるだけの場合は
Template Method は不適切です。
Template Methodパターンの使い方を誤解していたようです。
確かに今回のパターンですと、処理Cを切り出すだけの方がよさそうですね…
とても勉強になりました。
他の方に教えて頂いたのですが、Factory Methodパターンで書くと綺麗に書けそうですので、
そちらで実装を行いたいと思います。
ご回答いただき、ありがとうございました。
No.3ベストアンサー
- 回答日時:
TemplateMethodで対象処理メソッド数が、極端に増えるときは設計がおかしいと思ったほうがいいです。
どうしてもTemplateMethodでちょっとずつ違う処理が必要な場合、後で使う側は結局ソースの中身を知ってないといけなくなります。20種類も読んで差異を把握するのは、ほぼ無理です。
そういう時は、分かりやすいクラスで分けてしまって、FactoryMethodで提供側で自動切り替えするといいです。
クラス数が膨大になってもいいと思いますよ。
なるほど、FactoryMethodパターンですか。
存在自体は知っていましたが、こういった際に使うと便利なのですね。
とても参考になりました。
ありがとうございました。
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で質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Visual Basic(VBA) vbaエクセルマクロについて RemoveDuplicatesを使わずに、重複行を削除すらマクロを作 3 2023/03/02 22:03
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- 数学 数的処理の勉強方法について 最初数的処理の勉強を始めた学生です。 パターン暗記というものが良いらしい 3 2023/04/03 11:54
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
コマンドプロンプト実行後に画...
-
【sendkeysメソッドが動かずに...
-
オートシェイプの位置がずれる...
-
AdapterView<?> parent この部...
-
VB.NET デリゲートへのコールバ...
-
サーブレット DBにある生年月...
-
Excel VBAにて
-
掲示板で、テキストフィールド...
-
boolean型のフィールドとゲッタ...
-
エクセルVBAにおけるON TIMEメ...
-
struts使用時のメソッド
-
VB.netで、シリアル通信のタイ...
-
オーバーロードの「あいまい」...
-
シンボルを解決できません。 ...
-
canvasに描画したものを全て削...
-
VB.NET/256色でのBMPファイル保存
-
タブコントロールの問題 (VB)
-
計算プログラムでの平方根の求め方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
Labelコントロールに数字を代入...
-
final修飾子を使っているのに、...
-
エクセルVBAにおけるON TIMEメ...
-
コマンドプロンプト実行後に画...
-
mainメソッドのthrows節で設定...
-
DataGridViewでセルクリックイ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
onClickで関数呼出し後に、結果...
-
ExcelのxlDialogInsertPictureで。
-
Refreshメソッドの使い方
-
JSPで<SELECT>の中にDBから持っ...
-
【sendkeysメソッドが動かずに...
-
ウィンドウを最前面にできません
-
(String args[])というメッソ...
-
C# 演算 最大値 最小値 表現の仕方
-
Excel VBA シェイプの原型のサ...
-
VB.netで、シリアル通信のタイ...
-
boolean型のフィールドとゲッタ...
おすすめ情報