首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设计应用流程

设计应用流程
EN

Software Engineering用户
提问于 2013-04-17 04:06:03
回答 2查看 1.6K关注 0票数 1

我正在用java创建一个web应用程序,在这里我需要模拟以下流程。

当用户触发某个进程(将产品添加到购物车)时,我需要通过以下步骤

  1. 如果用户登录,则需要在HTTP会话中查看。
  2. 检查HTTP会话是否有购物车
  3. 如果用户存在于HTTP会话中,而他/她的购物车不存在于HTTP会话中
  4. 从数据库中获取用户购物车。
  5. 将项目添加到购物车,并将其保存到HTTP会话中,并在DB中更新cart。
  6. 如果DB中不存在cart,则创建新cart并在其中保存HTTP会话。

虽然我在这里遗漏了很多用例(不希望问题长度增加很多),但大部分流程将与我在上面的步骤中描述的相同。

我的流将从Controller开始,并将流向Service层,而不是最终进入DAO层。

因为会有很多用例需要检查HTTP,并且基于这种需要调用Service层,所以我计划添加一个Facade层,它应该负责为我做这件事,比如检查Session和与Service层交互。

请建议这是否是一个有效的方法,或任何其他最好的方法可以在这里实施?

还有一点我很困惑,那就是如何在外观层处理HTTP session?我是否需要每次调用我的Facade时传递HTTP对象,或者这里可以使用任何其他方法?

EN

回答 2

Software Engineering用户

发布于 2013-09-14 12:58:13

当我查看您的用例时,我开始考虑关注点的分离。

  • 控制器不应该关心购物车是否在请求中。
  • 将项添加到购物车的服务调用不应该关心用户是否登录。

然后我想:

  • 请求对象是要测试的痛苦。
  • 对于特定的用例,外观感觉有点模糊。如果我们可以为每个拥有所需数据的用例创建一个简单的数据传输对象,该怎么办?

所以我首先要说的是:

控制器

代码语言:javascript
运行
复制
Status addItemToCart(HttpServletRequest request, Item item) {
  if(request.getSession(false) == null) return needLogin(request)

  UserCart cart = service.addItemToCart(item, new UserCart(session))
  return cart.saveToSession(session)
}

服务

代码语言:javascript
运行
复制
UserCart addItemToCart(Item item, UserCart userCart) {
  if userCart.needsCart() {
     userCart = cartDAO.getNewCart(userCart)
  }
  userCart.addItem(Item)
  return cartDAO.updateCart(userCart)
}

我的服务层测试将坚持类似UserCart的内容,以避免我不得不模拟HTTPServletRequests并创建10行设置代码。UserCart只是一个简单的数据传输对象,它提供了一些方便的方法,但是它使所有的事情都更容易理解。用户有--购物车对这个用例很重要,所以它是我大脑运行得很快的地方。这也使我们能够避免所有的空检查和嵌套块,当您不辞辛苦地避免创建简单的域特定概念时,这些检查和嵌套块就会猖獗。

票数 2
EN

Software Engineering用户

发布于 2013-04-17 05:33:35

我总是希望以最简单的方式编写我的应用程序。我会在我的服务层本身完成所有这些工作。下面是我的伪代码:

代码语言:javascript
运行
复制
 /**
 * @param request HttpServletRequest
 * @param item Item to be added
 */
private void addItemToCart(HttpServletRequest request, Item item) {

    UserVO user = null;
    ShoppingCart cart = null;
    ShoppingCartDAO cartDAO = new ShoppingCartDAO();
    HttpSession session = request.getSession(false);
    // check if its an existing session
    if(session!=null){
        // get the user ifo from the session
        user = (UserVO)session.getAttribute("userVO");
        // try to get the cart from the session
        cart = (ShoppingCart)session.getAttribute("cart");

        if(cart==null) {
            // try to get the cart from DB
            cart = cartDAO.getShoppingCart(user);
            if(cart==null){
                // create a new cart
                ShoppingCart cart = new ShoppingCart(user);
            }
        }
        // add item to the  cart
        cart.addItem(item);
        // set it in session
        session.setAttribute("cart",cart);
        // update the DB
        cartDAO.updateShoppingCart(user);
    }

}

编辑:我相信您可以创建一个Interface来包装request对象,并将Interface的实现作为参数传递给Service方法。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/195191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档