<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document PUBLIC
  "-//Apache Software Foundation//DTD XDOC 1.0//EN"
  "http://maven.apache.org/dtd/xdoc_1_0.dtd">

<document>
  <properties>
    <title>データアクセスオブジェクトの設計 - DAO Design</title>
    <author email="kurokkie@users.sourceforge.jp">kurokkie</author>
  </properties>
  <body>
    <section name="データアクセスオブジェクトの設計">
      <p>データアクセスオブジェクトの設計を行います。これはつまり、データアクセスインターフェースを作成するということです。</p>
    </section>
    <section name="BlogDao">
      <p>
ブログ <a href="apidocs/org/unitedfront2/domain/communication/BlogEntry.html"><code>Blog</code></a>
に対応するデータアクセスインターフェース <a href="apidocs/org/unitedfront2/dao/BlogDao.html"><code>BlogDao</code></a>
は、<a href="apidocs/org/unitedfront2/dao/Dao.html"><code>Dao</code></a> 、
<a href="apidocs/org/unitedfront2/dao/Registerable.html"><code>Registerable</code></a> 、
<a href="apidocs/org/unitedfront2/dao/SimpleFindable.html"><code>SimpleFindable</code></a> 、
<a href="apidocs/org/unitedfront2/dao/Updatable.html"><code>Updatable</code></a> 、
<a href="apidocs/org/unitedfront2/dao/SimpleDeletable.html"><code>SimpleDeletable</code></a>
といった基本インターフェースを実装し、次のように定義しました。
      </p>
<pre name="code" class="java">
public interface BlogDao extends Registerable&lt;Blog&gt;, SimpleFindable&lt;Blog&gt;,
        Updatable&lt;Blog&gt;, SimpleDeletable, Dao {

    /**
     * コードを指定してブログを取得します。
     *
     * @param code コード
     * @return ブログ、見つからなければ &lt;code&gt;null&lt;/code&gt;
     */
    Blog findByCode(String code);

    /**
     * 指定した所有者のブログリストを取得します。
     *
     * @param ownerId 所有者のユーザ ID
     * @return ブログリスト
     */
    List&lt;Blog&gt; findByOwnerId(int ownerId);
}
</pre>
      <p>
ブログ記事
<a href="apidocs/org/unitedfront2/domain/communication/BlogEntry.html"><code>BlogEntry</code></a>
に対応するデータアクセスインターフェースは設けませんでした。ブログ記事の実態は
<a href="apidocs/org/unitedfront2/domain/communication/Message.html"><code>Message</code></a>
型のプロパティ「記事」であり、<code>Message</code> の機能を利用すれば十分にデータアクセス実装を実現で
きるからです。ブログとブログ記事、ブログ記事とコメントの関連を永続化する必要はありますので、それらに対応するメ
ソッドを
<a href="apidocs/org/unitedfront2/dao/BlogDao.html"><code>BlogDao</code></a> に
加えることにしました。
<a href="apidocs/org/unitedfront2/dao/BlogDao.html"><code>BlogDao</code></a> の
完全なコードは
<a href="xref/org/unitedfront2/dao/BlogDao.html"><code>BlogDao</code> のソースコード</a>
を参照ください。
      </p>
<pre name="code" class="java">
public interface BlogDao ... {

    /**
     * 指定したブログに指定した記事を登録します。
     *
     * @param blogId ブログ ID
     * @param entryId ブログ記事 ID （メッセージ ID）
     */
    void registerBlogEntry(int blogId, int entryId);

    /**
     * 指定した記事にコメントを登録します。
     *
     * @param entryId ブログ記事 ID （メッセージ ID）
     * @param commentId コメント ID
     */
    void registerComment(int entryId, int commentId);

    // findByCode

    // findByOwnerId

    /**
     * @require ブログが記事を一つも持っていない
     * @ensure ブログに関連するオブジェクトも削除される
     */
    @Override
    void delete(int blogId);

    /**
     * ブログが持つブログ記事の数を取得します。
     *
     * @param blogId ブログ ID
     * @return ブログ記事数
     */
    int countBlogEntry(int blogId);

    /**
     * 指定した範囲のブログ記事を取得します。記事番号は０から始まる整数で、ID の降順になります。
     *
     * @param blogId ブログ ID
     * @param no 開始点となる記事番号
     * @param num 件数
     * @return ブログ記事リスト
     */
    List&lt;BlogEntry&gt; findBlogEntries(int blogId, int no, int num);

    /**
     * 指定したブログ記事のコメントを取得します。
     *
     * @param entryId ブログ記事 ID （メッセージ ID）
     * @return コメントリスト
     */
    List&lt;Comment&gt; findComments(int entryId);

    /**
     * 指定したブログ記事を削除します。ブログ記事に付属するコメントも削除されます。
     *
     * @param entryId ブログ記事 ID
     */
    void deleteBlogEntry(int entryId);
}
</pre>

<script type="text/javascript" src="js/dp.SyntaxHighlighter/Scripts/shCore.js"></script>
<script type="text/javascript" src="js/dp.SyntaxHighlighter/Scripts/shBrushJava.js"></script>
<script type="text/javascript">
dp.SyntaxHighlighter.ClipboardSwf = 'js/dp.SyntaxHighlighter/Scripts/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
</script>

<script type="text/javascript">
var ID='100354378-sbs_tmDesign';
var AD=1;
var FRAME=0;
</script>
<script src="http://j1.ax.xrea.com/l.j?id=100354378" type="text/javascript"></script>
<noscript>
<a href="http://w1.ax.xrea.com/c.f?id=100354378" target="_blank"><img src="http://w1.ax.xrea.com/l.f?id=100354378&amp;url=X" alt="AX" border="0"/></a>
</noscript>

    </section>
  </body>
</document>
