1

私は次のものを持っています:

interface File
{ 
  String name();
  ...
}

interface FileService
{
  List<File> getAllFiles();
  ...
}

そのようなインターフェースで作業しているときに、Fileインスタンスで表されるエンティティを削除することにした場合(つまり、リモートサーバーから削除することを意味します)、どのようにすればよいですか?

ファイルインターフェイスのメソッドを導入する必要delete()がありますか(情報エキスパートであり、サーバーから自分自身を削除する方法を知っている可能性があるため)?または、この関数をその作成者に委任する必要があります-インターフェイスメソッドFileServiceを介して?void deleteFile(File file)なぜ?

最初のケースがより適切である場合、オブジェクトを無効にして、次の使用を回避する方法は?

および関連:ケースをどのように処理する必要がありuploadFile()ますか?誰がこれに責任を持つべきですか?FileServiceがSRPに違反する可能性があるためです。

ありがとう、

4

2 に答える 2

1

私の意見では、それは FileService の責任であるべきです。理由と推測は、

前提 - ファイル タイプのオブジェクトは、どこかから取得したファイルを表します。消費者には関係ありません。ファイルサービスの実装は、ファイルオブジェクトに対してCRUD操作を実行するものだと思います。また、Fileservice の方がファイル管理に関心があると思います。したがって、削除はファイル サービス上にある必要があります。削除操作が File オブジェクトに存在する場合、ファイル関連の操作はまとまりがなく、クラス全体に分散していると思います。それは私の意見ですが。他の意見も聞きたいです!ところで、FILE クラスは Java で静的ですか?

于 2011-06-14T05:40:26.410 に答える
1

オンにすべきだと思いますFile

ファイルのファクトリーとして機能する FileService が (サーバーへの接続ごとに) 1 つしかない場合は、おそらくそのサービスを最新の状態に保つ必要があります。次に、何かを使用できます。

FactoryServiceImpl implements FactoryService {

    public File findFile(criteria) {
        return new FileImpl(this);
    }
}

// This should be package scope!
FileImpl implements File {
  private FactoryService service;

  // package scope!
  FileImpl(FactoryService service) {
      this.service = service;
  }

  public delete() {
      // invalidate this object - all calls should throw exception

      // Inform the service that this File should be deleted from
      // the server; or if the FileImpl does that itself, that the
      // FileService should update the cache of available files
      service.delete(this);
  }
}

編集

現在、循環依存がありますが、これはあまり良くありません。JVM はおそらくそれを検出してクリーンアップできますが、WeakReference を使用することもできます。

シン ファクトリとファクト ファイルを使用するか、またはその逆にするかは、設計上の選択です。ただし、工場で削除されたファイルは削除されたことを認識している必要があるため、通信できる必要があります。

いくつかのコード (ファクト ファクトリを想定):

// This should be package scope!
FileImpl implements File {
  private Weakreference<FactoryService> serviceRef;

  // package scope!
  FileImpl(FactoryService service) {
      this.serviceRef = new WeakReference<FactoryService>(service);
  }

  public delete() {
      // invalidate this object - all calls should throw exception

      // Inform the service that this File should be deleted from
      // the server; or if the FileImpl does that itself, that the
      // FileService should update the cache of available files

      FactoryService service = serviceRef.get();
      if (service != null) {
          service.delete(this);
      }
  }
}

この場合、ネットワーク接続が関係している可能性が高いため、ファクト ファクトリを想定しています。また、複数のオブジェクトとスレッド間で接続を共有すると、その接続を閉じる責任が不明確になる傾向があります。

これにより、FactoryService インターフェイスには、接続を終了し、すべてのファイルを無効にするメソッドclose()またはメソッドが必要dispose()になります (ファイルにアクセスできなくなるため)。

編集2

OOD に関する限り、私はおそらく Java File API を可能な限り模倣しようとします。したがって、オブジェクトはそれ自体を削除するように指示できます。実装が File にあるか、FileSystem のどこかにあるかは重要ではありません (インターフェイスとクラスのユーザーにとって)。

于 2011-05-01T12:21:09.927 に答える