【发布时间】:2012-10-04 13:55:03
【问题描述】:
这是我想知道如何做的事情,但找不到适合该问题的方法。
假设我有一个可以用于两个目的的类:上传和下载。本能地,我会创建一个有点像这样的对象:
public class File{
private FormFile uploadFile;
private File downloadFile;
private String uploadLocation;
private String downloadLocation;
//setters and getters
}
问题是,我希望每种类型只有一组访问器。例如,班级中只有一个setFile(Object obj)。但这会导致问题,因为 FormFile 和 File 是两个不同的对象。
然后我会求助于 OOP。将我的对象更改为:
public interface File{
public void setFile(Object obj);
public Object getFile();
public void setLocation;
public String getLocation;
}
然后创建另外两个对象:
public UploadFile implements File{
private FormFile file;
private String location;
//implementation of methods
}
public Download implements File{
private File file;
private String location;
//implementation of methods
}
如果您清理代码中的其他内容,这可能会起作用。但我意识到这在之后会更难维护。是否有其他解决方法可以做到这一点?
类似的东西:
File file = new File.UPLOAD;
将限制用户:
仅使用方法setFile(FileForm file){ },然后setFile(File file){ } 将变得不可用。实例化File file = new File.DOWNLOAD时反之亦然
我并没有真正尝试解决任何问题。只是一个想法。
【问题讨论】:
-
其实这不是一个好的设计选择。 每个班级一个责任。所以你选择分离到下载和上传类是好的。我看不出来,为什么这应该更难维护?
-
为什么不定义一个扩展 File 的类,然后让类的构造函数在上传或下载时获得参数?但@Fildor 说的几乎都是对的!
-
看看Cohesion page on Wikipedia。一个“模块”(在这种情况下是一个类)应该只有一个职责。你的问题只会延伸到你的应用程序的其余部分,因为那时使用
File的东西必须检查它是什么类型,在它使用的任何地方强制使用条件,因为事情可能会根据它的类型做出不同的反应,这将导致非常复杂和冗余的代码。关注点分离创建了一个更具凝聚力的模型。 -
@Fildor 如果是为了代码重用呢?这可以否决?
-
问题出在您的设计上。 “上传”和“下载”是非常不同的东西。因为您试图将两个不完全兼容的操作组合在一起,所以结果没有多大意义。