我的问题是:
我想写设计文件管理(添加,复制,删除等操作)。有两种方法:
编写只包含文件属性的VO文件。例如:
public Class File {
private boolean hidden;
private boolean read;
private boolean write;
public boolean isHidden() {
return hidden;
}
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
public boolean isRead() {
return read;
}
public void setRead(boolean read) {
this.read = read;
}
public boolean isWrite() {
return write;
}
public void setWrite(boolean write) {
this.write = write;
}
}并为与文件相关的操作分离服务。例如:
public Class FileService {
public boolean deleteFile(File file) {
//Add delete logic.
}
//Same way you can add methods for Add and copy file.
}其中VO文件包含所有属性和所需的操作:
public class File {
private boolean hidden;
private boolean read;
private boolean write;
public boolean isHidden() {
return hidden;
}
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
public boolean isRead() {
return read;
}
public void setRead(boolean read) {
this.read = read;
}
public boolean isWrite() {
return write;
}
public void setWrite(boolean write) {
this.write = write;
}
public boolean deleteFile() {
//Add delete logic.
}
//Same way you can add methods for Add and copy file.
}那么,这两种方法的利弊是什么呢?
发布于 2010-08-04 12:34:35
没有多少关于你想要什么样的系统的信息,就很难发音。对我来说,选择取决于系统的界限。
如果您需要提供一个以服务形式公开并可供外部使用者访问的API,请选择解决方案1,这是唯一的方法。如果您的系统是一个类库,它的API将在内部被其他应用程序使用,那么可以选择一个富域模型,如解决方案2中的那样,它是一个更多的OO。您不希望使用没有真正原因的服务、管理器和实用程序类来膨胀API。
但是,在不知道你的最终目标的情况下,很难说。
发布于 2010-08-04 12:35:13
在面向对象的语言中,将逻辑放入类本身而不是服务类是典型的方法(更好的IMO)。它遵循"tell,不要询问“的原则,例如,告诉File删除自己,而不是要求某个服务删除它。这背后的主要原因之一是允许继承。例如,如果您有File的子类,并且希望在删除日志消息之前让它编写日志消息,这将很难对服务类执行,因为每个子类都需要不同的服务类。
就面向服务的方法而言,这通常是在更高级别(即面向服务的体系结构)上考虑的。以金融股票系统为例,您可能有“买入股票”服务和“卖出股票”服务。拥有一个与单个类相对应的服务类(即知道如何买卖股票的股票服务)并不是非常面向对象的。
您的系统中也可能有一个服务层,它提供与其他外部服务(即数据库)的集成点,但我认为这不是您在这里所说的。因此,我可以坚持在File类本身中封装逻辑的方法。
https://stackoverflow.com/questions/3405352
复制相似问题