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;

}

4

2 に答える 2

1

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

于 2012-04-29T03:28:28.783 に答える
1

厳密な意味では、デメテルの法則に違反しています。 Book メソッドによって返されたオブジェクトに対してメソッドを呼び出しており、 Author および Category クラスの内部構造を公開しています。

一方で、あなたのコードが有害であるとは思いませんし、デメテル法に違反しているとは思えません。あなたのような JSP ファイルを本や製品コードで何度も見てきましたが、害はまったくありませんでした。

ただし、それでも法律に従いたい場合は、 JSP で表示する必要がある属性のみを持つデータ転送オブジェクトに似たものを使用できます。Book の情報を DTO インスタンスに入力するには、追加の作業が必要です。 Author クラスと Category クラス。

于 2012-04-29T03:02:57.553 に答える