- ベストアンサー
肥大化した実装クラスを分割する方法は?
お世話になります。 javaで開発を行っているのですが、クラスファイルのソースが肥大化したので行数を減らすべくクラス分割を行いたいと考えています。(CheckStyleの定義で規定行数を超えたため) 現在、あるサービスクラスがあり、実装クラス側分割の方法としてexportとimportそれぞれ分割したいのですが、具体的な方法がわかりません。 現在の実装を下記に書いてみます。 ※jdk1.5.0_09を使用しています //インターフェース public interface HogeService { void export(Integer param1, Integer param2); void import(Integer param1, Integer param2); } //実装クラス public final class HogeServiceImpl implements HogeService { //export implement public void export(Integer param1, Integer param2) { 実装 } //export sub method private void exportSubMethod1() { 実装 } //import implement public void import(Integer param1, Integer param2) { 実装 } //import sub method private void importSubMethod1() { 実装 } } importとexportには共通するメソッドはなく、単純に2つのクラスにソース分割できればと考えております。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No1です。 >このクラスを呼び出す側は別の担当となっていて簡単に分割はできなさそうです。 なるほど、事情は分かりました。 でしたら、インターフェースと実装の間にクラスを1つ追加します。 インターフェースはそのままで大丈夫です。 実装クラスは、以前の回答と同じようにするのですが、 前回と違い、HogeImportService は実装しません。 ※というか、できません(機能が足りないため) //実装クラス //import public final class HogeImportServiceImpl { //import implement public void import(Integer param1, Integer param2) { 実装 } //後は省略 } //export public final class HogeExporttServiceImpl { //export implement public void export(Integer param1, Integer param2) { 実装 } //後は省略 } で、この2つを使うクラス(Adapter)を作ります。 HogeImportServiceはこのクラスで実装します。 public final class HogeServiceAdapter() implements HogeImportService{ private HogeImportServiceImpl hogeImport; private HogeExporttServiceImpl hogeImport; //コンストラクタかどこかで、上の2つをインスタンス化しておいて下さい。 //インターフェースの実装メソッド public void import(Integer param1, Integer param2) { hogeImport.import(param1, param2); //処理の中身は丸投げする } //インターフェースの実装メソッド public void export(Integer param1, Integer param2) { hogeExport.export(param1, param2); //処理の中身は丸投げする } } このクラスは、内部にHogeImportServiceImplとHogeExporttServiceImplクラスを持っており、 インターフェースで定義したメソッドimport、exportが呼ばれたら、 それらのクラスのメソッドを呼びます。 実際の処理を内部のクラスに委譲(丸投げ…)するわけです。 これによって、インターフェースで実装したメソッドを適合(Adapt)できます。 使用する側は、インターフェースの実体を作成する際に、 HogeService hogeService = new HogeServiceImpl(); から、 HogeService hogeService = new HogeServiceAdapter(); としてもらうだけです。 ちなみに、こういうのをAdapterパターンと言います。 これはデザインパターンと呼ばれるプログラム技法の1つで、 「GoF」とか「デザインパターン」とかで調べるとたくさん出てきます。 texjoyさんの言っているFacadeパターンもその1種です。 (こっちのパターンはよく知らないので、今回はAdapterパターンです)
その他の回答 (2)
それならば、Facadeパターンでいいんじゃないですか?
お礼
ご回答ありがとうございます。Facadeパターンを調べてみました。勉強不足でよく理解できませんでした(汗)
- neko_noko
- ベストアンサー率45% (146/319)
素直にインターフェースを2つに分割するってのはだめでしょうか? //インターフェース //import public interface HogeImportService { void import(Integer param1, Integer param2); } //export public interface HogeExportService { void export(Integer param1, Integer param2); } //実装クラス //import public final class HogeImportServiceImpl implements HogeImportService { //省略 } //export public final class HogeExporttServiceImpl implements HogeExportService { //省略 } ただこの場合、インターフェースを使用するコードも変更になりますね。 インターフェースはそのままで、ってことだとちょっと面倒ですね… 委譲を使うとか(クラス数が増えますけど)
お礼
ご回答ありがとうございます。 このクラスを呼び出す側は別の担当となっていて簡単に分割はできなさそうです。しかし貴重なご回答として参考にさせていただきます。
お礼
ご丁寧に説明いただきありがとうございます。 なるほど、アダプタを介してそれぞれのクラスに委譲すればインターフェースを変更することなく実装箇所の分割が可能となるのですね。 もう少しきっちりと理解して実践してみたいと思います。
補足
neko_nokoさま、色々とアドバイスありがとうございました。 ご報告が遅くなりましたが無事アダプタ化を行い、実装クラスを分割できております。大変参考になりました。