2012-04-29 42 views
1

这违反了Law of Demeter的权利?见下面的${book.author.name}${book.category.name}。在具有表达式语言的JSP中执行此操作可以吗?我在这里违反德米特法吗?

<c:set var="book" value="${book}" /> 

<table> 
    <tr> 
     <td>Title:</td><td><c:out value="${book.title}" /></td> 
    </tr> 
    <tr> 
     <td><c:out value="${book.description}" /></td> 
    </tr> 
    <tr> 
     <td>Price: </td><td><c:out value="${book.price}" /></td> 
    </tr> 
    <tr> 
     <td>Author: </td><td><c:out value="${book.author.name}" /></td> 
    </tr> 
    <tr> 
     <td>Category: </td><td><c:out value="${book.category.name}" /></td> 
    </tr> 
</table> 

</body> 
</html> 

${book}属性是一个Book对象。 BookServlet

String id = request.getParameter("id"); 

BookService bookService = new BookService(); 
Book book = bookService.getBookById(Integer.valueOf(id)); 

request.setAttribute("book", book); 

findBookById()BookService -> BookDao

public Book findBookById(int id) throws DaoException { 

Book book = null; 
Connection con = null; 
PreparedStatement ps = null; 
ResultSet rs = null; 

try { 
    con = this.getConnection(); 

    ps = con.prepareStatement(FIND_BOOK_BY_ID); 
    ps.setInt(1, id); 

    //Using a PreparedStatement to execute SQL... 
    rs = ps.executeQuery(); 
    while (rs.next()) { 
     int bookId = rs.getInt("book_id"); 
     String title = rs.getString("title"); 
     String desc = rs.getString("description"); 
     int authorId = rs.getInt("author_id"); 
     String authorName = rs.getString("author_name"); 
     int categoryId = rs.getInt("category_id"); 
     String categoryName = rs.getString("book_category_name"); 
     double price = rs.getDouble("price"); 

     book = new Book(bookId); 
     book.setTitle(title); 
     book.setDescription(desc); 
     book.setPrice(price); 

     Author author = new Author(authorId); 
     author.setName(authorName); 
     book.setAuthor(author); 

     Category category = new Category(categoryId); 
     category.setName(categoryName);     
     book.setCategory(category); 
} 
} catch (SQLException e) { 
    throw new DaoException("findBookById() " + e.getMessage()); 
} finally { 
    try { 
     if (rs != null) { 
      rs.close(); 
     } 
     if (ps != null) { 
      ps.close(); 
     } 
     if (con != null) { 
      freeConnection(con); 
     } 
    } catch (SQLException e) { 
     throw new DaoException(e.getMessage()); 
    } 
} 
return book; 

}

+0

也许这会更好codereview.stackexchange.com。 – 2012-04-29 02:26:19

+0

我刚刚阅读“误解德米特法则”@ http://www.dan-manges.com/blog/37。他说''views'很好吗? – Jonathan 2012-04-29 02:42:05

+0

这是另一个关于它的问题 - [得墨忒耳的法则不是一个点计算的练习] Phil(菲律宾太阳城娱乐网站)(http://haacked.com/archive/2009/07/14/law-of-demeter-dot-counting.aspx)菲尔哈克 – McDowell 2012-05-04 13:15:43

回答

1

在严格意义上,你违反了Law of Demeter:对图书的方法返回的对象你调用方法,露出内部Author和Category类的结构。

另一方面,我没有看到你的代码是有害的,而你对德米特法的违反似乎很天真。我已经多次在书籍和产品代码中看到与您一样的JSP文件,并且完全没有任何伤害。

但是,如果您仍然想遵循该法则,您可以使用类似于Data Transfer Object的东西,该东西只具有您需要显示的属性。使用信息填充DTO实例需要做额外的工作书,作者和分类班。

1

这是一个完全有效的使用jsp。要做到这一点,需要做更多的工作,而不是值得。严格遵守COBOL仍然流行的编码原则在学术界只是很有趣。