
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で質問しましょう!
似たような質問が見つかりました
- 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ランキング
-
jdbcでinsert,delete,createをe...
-
プログラミングの問題です。大...
-
Googleログインボタンのデザイ...
-
JDONWROADER2のエラー修復
-
「main メソッドを持つクラスが...
-
Eclipse 動的プロジェクトで404...
-
正規表現について質問です。 カ...
-
スプレッドシートからリマイン...
-
googleスプレッドシートのスク...
-
googleスプレッドシートのGASに...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JDONWROADER2のエラー修復
-
Googleログインボタンのデザイ...
-
配列にnullを代入すると、null...
-
jdbcでinsert,delete,createをe...
-
「main メソッドを持つクラスが...
-
プログラミングの問題です。大...
-
eclipseで作ったプログラムを他...
-
正規表現について質問です。 カ...
-
Eclipse 動的プロジェクトで404...
-
マイクラでPythonのプログラミ...
-
jdk17.06のインストーラーが起...
-
自作Androidアプリのデータ引き...
-
直し方について教えて頂きたい...
-
eclipse実行ができない
-
サーブレットをapacheで公開す...
-
あんまりお料理しないのに台所...
-
CSV出力を画面から選択したデー...
-
次のhtml・cssでspan内の文字を...
-
問題作成のWebアプリの作り方を...
-
ゲーム開発の入門書を探しています
おすすめ情報