【お題】引っかけ問題(締め切り10月27日(日)23時)

お世話になります。
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つのクラスにソース分割できればと考えております。

A 回答 (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パターンです)

この回答への補足

neko_nokoさま、色々とアドバイスありがとうございました。
ご報告が遅くなりましたが無事アダプタ化を行い、実装クラスを分割できております。大変参考になりました。

補足日時:2007/07/05 17:28
    • good
    • 0
この回答へのお礼

ご丁寧に説明いただきありがとうございます。
なるほど、アダプタを介してそれぞれのクラスに委譲すればインターフェースを変更することなく実装箇所の分割が可能となるのですね。
もう少しきっちりと理解して実践してみたいと思います。

お礼日時:2007/07/05 10:29

それならば、Facadeパターンでいいんじゃないですか?

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。Facadeパターンを調べてみました。勉強不足でよく理解できませんでした(汗)

お礼日時:2007/07/05 10:18

素直にインターフェースを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 {
  //省略
}

ただこの場合、インターフェースを使用するコードも変更になりますね。
インターフェースはそのままで、ってことだとちょっと面倒ですね…
委譲を使うとか(クラス数が増えますけど)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
このクラスを呼び出す側は別の担当となっていて簡単に分割はできなさそうです。しかし貴重なご回答として参考にさせていただきます。

お礼日時:2007/06/29 08:53

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


おすすめ情報