2012-04-29 17 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オブジェクトです。 BookServletBookService -> 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でより良いでしょう。 –

+0

私はちょうど 'デメテルの法律を誤解 '@ http://www.dan-manges.com/blog/37を読んでいます。彼は '景色'でやってもいいと言いますか? – Jonathan

+0

もうひとつ取り上げます - [Demeterの法則はドットカウントの練習ではありません](http://haacked.com/archive/2009/07/14/law-of-demeter-dot-counting.aspx)Philハック – McDowell

答えて

1

から

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

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

request.setAttribute("book", book); 

findBookById()、あなたはLaw of Demeterに違反している:あなたは、内部を露出させ、ブックメソッドによって返されたオブジェクトのメソッドを呼び出すしていますAuthorクラスとCategoryクラスの構造。

反対側では、コードが有害であり、Demeter Lawの違反がナイーブであるとは思われません。私はあなたのようなJSPファイルを本や生産コードで何度も見たことがあり、全く害はありませんでした。

しかし、まだ法律を守りたい場合は、Data Transfer Objectのようなものを使用して、JSPで表示する必要のある属性のみを使用することができます.DTOインスタンスに情報を入力するために必要な余分な作業がありますBookクラス、Authorクラス、Categoryクラスがあります。

1

これはjspの完全に有効な使用方法です。これを他の方法で行うよりも、価値があるよりも多くの作業が必要になります。 COBOLがまだ普及しているときに開発されたコーディング原則を厳格に遵守することは、学界でのみ面白いです。