gpt4 book ai didi

java - 我应该允许对象从其接口(interface)中删除自身吗? OOD 正确吗?

转载 作者:行者123 更新时间:2023-11-30 05:03:35 31 4
gpt4 key购买 nike

我有以下内容:

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

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

在使用此类接口(interface)时,如果我决定删除由 File 实例表示的实体(我的意思是从远程服务器删除),我应该怎么做?

我是否应该为文件接口(interface)引入delete()方法(因为它是信息专家并且可能知道如何从服务器删除自身)?或者我应该通过 void deleteFile(File file) 接口(interface)方法将此函数委托(delegate)给它的创建者 - FileService ?为什么?

如果第一种情况更合适,如何使对象无效以避免其后续使用?

相关:我应该如何处理 uploadFile() 情况?谁应该为此负责?因为看起来FileService可能会违反SRP。

谢谢

最佳答案

我认为它应该位于文件上。

如果您只有一个 FileService(每个到服务器的连接)充当文件工厂,您可能希望该服务保持最新。然后你可以使用一些东西:

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 可能可以检测到它并清理任何内容,但您也可以使用 Wea​​kReference。

无论您使用精简工厂和事实文件还是反之,这都是一种设计选择。但它们需要能够进行通信,因为通过工厂删除的文件应该知道它已被删除。

一些代码(假设事实工厂):

// 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 接口(interface)应该有一个方法 close()dispose() 来终止连接并使所有文件无效(因为它们是无法再访问)。

编辑2

就 OOD 而言,我可能会尝试尽可能模仿 java File API。因此,可以告诉对象删除自身。实现是在 File 中还是在 FileSystem 中的某个位置并不重要(对于接口(interface)和类的用户)。

关于java - 我应该允许对象从其接口(interface)中删除自身吗? OOD 正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5848164/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com