K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2007] Javaの実装の隠ぺいに関して
返信


投稿者:beginner
2017/10/04 09:56:29

Link:

はじめまして、前橋さんの各種書籍で一からからプログラミングの基礎体力づけをさせていただいています。

Javaを使った一般的なコードの書き方で疑問を抱いたことがございます。

下に適当な4つのサンプルプログラムを書きました。
mainを呼び出す利用者にimplの実装を隠ぺいすることを目的としています。
Factoryクラスを経由してインターフェースを返すようにしています。

しかし、Factory.java内で"import com.sample.libimpl.*"を記載せざるを得ません。
何を気にしているかというと、Cで言えば、パブリックなヘッダに、プライベートなヘッダを書いているようなコードに見える点です。
利用者から完全に〜impl部分を隠ぺいする一般的な手法はあるのでしょうか。

もしよろしければ教えていただけますと大変助かります。

プログラミング初心者のため勘違い含んでいたりした場合大変恐縮です。

==================================
$ vi com/sample/Main.java

package com.sample;
import com.sample.lib.*;

class Main{
  public static void main(String[] args){
    Another another = Factory.create();
    another.hello();
  }
}
==================================
$ vi com/sample/lib/Factory.java

package com.sample.lib;
import com.sample.libimpl.*;

public class Factory{
  public static Another create() {
    return new AnotherImpl();
  }
}
==================================
$ vi com/sample/lib/Another.java
package com.sample.lib;

public interface Another {
  void hello();
}
==================================
$ vi com/sample/libimpl/AnotherImpl.java
package com.sample.libimpl;
import com.sample.lib.*;

public class AnotherImpl implements Another {
  public void hello(){
    System.out.println("hello another class");
  }
}
==================================
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2008] Re:Javaの実装の隠ぺいに関して
返信


投稿者:(ぱ)こと管理人
2017/10/05 08:33:28

Link:
はじめまして。拙著を読んでいただきありがとうございます。

>しかし、Factory.java内で"import com.sample.libimpl.*"を記載せざるを得ません。
>何を気にしているかというと、Cで言えば、パブリックなヘッダに、プライベートなヘッダを書いているようなコードに見える点です。
>利用者から完全に〜impl部分を隠ぺいする一般的な手法はあるのでしょうか。

これは確かにその通りなのですが、私はこれについては
「まあ、Factoryだけはしょうがない」
と考えています。
どこかで実装クラスが何であるかを明示しなければいけない以上、
そこでは実装側のパッケージをimportせざるを得ません。
# 「Java謎+落とし穴〜」にどう書いたかと思って見返したら、
# 「実はここが頭の痛いところなのですが〜」と書いてますね……

利用者からさらに実装を隠蔽し、状況によって実装クラスを
差し替える手法として、Dependency Injectionという考え方もあります。
ただ、実装をあまり分離しすぎると、それはそれでわかりにくくなったりもします。

https://twitter.com/kudzu/status/862906043591925762
>DI使ってコード書いてるわし「こんな簡潔にモジュラーでテスタブルなコードが書ける!すごい!天才!」
> DI使った他人のコード読んでるわし「おい、これどこから呼ばれてんだよ。わかんねぇぞ。○すぞ。」
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2009] Re:Javaの実装の隠ぺいに関して
返信


投稿者:beginner
2017/10/05 11:36:34

Link:
ご回答ありがとうございます。
非常に参考になりました。
DIについては軽い知識のみで深く考えたことなかったため、改めて勉強し直すきっかけになりそうです。
[ この投稿を含むスレッドを表示] [ この投稿を削除]