如何组织Java Business对象类

时间:2013-10-10 00:35:18

标签: java design-patterns data-access-layer

我正在编写一个Web服务,其中一个服务操作是getShortURL(String longURL)。在这个方法中,我首先检查数据库中是否存在longURL,如果是,则返回它,否则创建一个shortURL,将其插入数据库并返回给客户端。

我的困惑是如何组织和命名我的课程。除了Web服务类,现在我有3个类:

  1. URLData:它只有URL属性,getter和setter。
  2. MongoDB:它连接到数据库(此时连接属性在其中进行了硬编码),插入数据库,并从数据库中检索原始字符串。
  3. MongoDBUtil:此类再次使用insert(URLData)方法,它调用MongoDB.insert()插入数据库。还有retrieveURLData,后者又调用MongoDB等效方法来完成实际工作。
  4. Web服务方法设置URLData个设置者并调用MongoDBUtil.retrieveinsert

    1. 我认为URLData类应该命名为URLDataBusinessObject,并且可以使用setter和getter来设置插入,更新和删除方法。
    2. MongoDBUtil可以重命名为UrlDAO,它可以有不同类型的检索方法。
    3. MongoDB更有点选择查询类,不知道如何设计和命名。
    4. 请告知

3 个答案:

答案 0 :(得分:2)

  1. URLData很好。不要用长不相关的词膨胀你的班级名字。如果您想明确这是一个业务对象,请创建一个类似com.yourcompany.yourproject.bo的包,然后将您的URLData类放在那里。
  2. 是的,UrlDAO比MongoDBUtil更具体。您可以为它创建一个com.yourcompany.yourproject.dao包。
  3. 对我来说很好看。但是,如果您使用某种框架(例如Spring),则不必创建自己的类来保存数据库连接配置。
  4. 我建议你google一些关于这个主题的教程,你将学习如何使用这项技术以及如何命名/设置你的课程。

答案 1 :(得分:1)

此问题可能更适合http://programmers.stackexchange.com

尽管如此:是的,我会更改命名。

1)URLDataBusinessObject不,永远不会。您正在为类名添加14个字符而不添加任何值。 URLData很好。

2)您应该将DAO类的命名更改为非特定于DB的,除非您明确拥有针对多个数据库的架构,并且特定于DB的类执行特定于DB的任务。

我假设情况并非如此,因此您应该给它一个更通用的名称。 Persistence可以很好,DAO,任何显示预期用法而不进入细节的内容都是合格的。

3)MongoDBUtil是你持久层的接口,它不是一个实用主义的心灵和灵魂。这堂课的目的是什么?如果您所做的只是将方法调用链接到MongoDB,您可以放弃它并直接转到后者。

答案 2 :(得分:0)

为所有域对象的所有持久性特定操作和接口创建简单的分层设计构建接口。然后针对这些而不是具体实现进行编码。这样就很容易将mongo持久层换成另一个,功能组织起来,以便其他人可以轻松地理解它,也可以测试接口而不是具体的实现。你有类似的东西:

  1. URLData接口
  2. URLDataDTO类(在业务层中使用)
  3. 持久性接口
  4. MongoPersistence类(在持久层中使用)
  5. 我当前的项目做了类似的事情,也适用于Mongo。持久层接口具有类似“void put(URLData)”的方法。当调用Mongo实现从传入的URLData构造一个新的MongoURLData时,提取DBObject然后保留它。像“URLData get(String id);”这样的方法以相反的方式工作。 Mongolayer查询数据库并从Mongo DBObjects创建新的URLDataDTO对象。然后,Web服务负责序列化/反序列化发送到客户端应用程序或从客户端应用程序接收的DTO对象。

    我的Mongo Domain对象都继承自:

    public abstract class MongoDO<T extends Object> {
    
    DBObject dbobject = null;
    
    public MongoDO(T dto) {
        this.dbobject = new BasicDBObject();
    };
    
    public MongoDO(DBObject obj) {
        this.setDBObject(obj);
    };
    
    public abstract T toDTO() throws StorageException;
    
    public DBObject getDBObject() {
        return dbobject;
    }
    
    public void setDBObject(DBObject obj) {
        this.dbobject = obj;
    }
    
    public ObjectId getIdObject() {
        return (ObjectId) this.getDBObject().get("_id");
    }
    
    public void setIdObject(ObjectId id) {
        this.getDBObject().put("_id", id);
    }
    
    protected String getField(String field) {
        if (dbobject.containsField(field) && dbobject.get(field) !=null) {
            return dbobject.get(field).toString();
        } else
            return null;
    }
    
    protected void setField(String field, String value) {
        dbobject.put(field, value);
    }
    
    }
    

    示例Mongo实现将是:

    public class MongoURLData extends MongoDO<URLData> implements URLData {
        private static final String FIELD_SHORT_URL = "surl";
    
        public String getShortUrl() {
            return getField(FIELD_SHORT_URL);
        }
    
        public void setShortUrl(String shortUrl) {
            setField(FIELD_SHORT_URL, shortUrl);
        }
    
        public URLData toDTO(){
            URLDataDTO dto = new URLDataDTO();
            dto.setShortURL(getShortURL);
            return dto;
        }
    
    }