0

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

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

  1. URLData: 它只有 URL 属性和 getter 和 setter。
  2. MongoDB:它连接到数据库(现在连接属性是硬编码的),插入数据库,并从数据库中检索原始字符串。
  3. MongoDBUtil:这个类还有一个insert(URLData)方法,它调用MongoDB.insert()插入到数据库中。还有retrieveURLData哪个反过来调用MongoDB等效方法来完成实际工作。

Web 服务方法设置URLDatasetter 和调用MongoDBUtil.retrieveinsert.

  1. 我认为URLData应该命名该类URLDataBusinessObject,并且它可以与 setter 和 getter 一起具有插入、更新和删除方法。
  2. MongoDBUtil可以重命名为 UrlDAO,它可以有不同类型的检索方法。
  3. MongoDB更像是选择查询类,不知道如何设计和命名。

请指教

4

3 回答 3

2
  1. URLData 很好。不要用长长的不相关的词来夸大你的班级名称。如果您想明确这是一个业务对象,请创建一个像 com.yourcompany.yourproject.bo 这样的包,然后将您的 URLData 类放在那里。
  2. 是的,UrlDAO 比 MongoDBUtil 更具体。你可以为它创建一个 com.yourcompany.yourproject.dao 包。
  3. 对我来说看起来不错。但是,如果您使用某种框架(例如 Spring),您不必创建自己的类来保存数据库连接配置。

我建议你在谷歌上搜索一些关于该主题的教程,你将学习如何使用该技术以及如何命名/组织你的课程。

于 2013-10-10T01:07:39.243 回答
1

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

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

1)URLDataBusinessObject不,从来没有。您将 14 个字符添加到类名而不添加任何值。URLData很好。

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

我假设情况并非如此,因此您应该给它一个更通用的名称。 Persistence也可以DAO,任何显示预期用途而不涉及细节的东西都是合格的。

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

于 2013-10-10T00:56:30.553 回答
0

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

  1. URL数据接口
  2. URLDataDTO 类(用于业务层)
  3. 持久化接口
  4. MongoPersistence 类(用于持久层)

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

我的 Mongo 域对象都继承自以下内容:

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;
    }

}
于 2013-10-10T11:09:44.010 回答