- ベストアンサー
DAOとVOクラスについて
- DBへのアクセスとデータの操作を担当するDAOクラスについて、処理の範囲や作成方法などについて質問しています。
- テーブルのカラムや属性を表現するVOクラスについて、役割や作成方法について質問しています。
- 質問者はプログラム初心者であり、PHP5とMySQLを使用して開発を行っています。さまざまな質問が含まれており、教えていただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
いわゆるMVCアーキテクチャのModelにあたる部分の話ですね。 私自身は、主にJavaでの開発でMVCモデルを使っていますが、PHPでも考え方は同じだと思いますので回答させて頂きます。 ■DAOクラスについて > 一般的にどこまでの処理を書くものですか? Data Access Objectですのでその名の通り、DB(データ)にアクセスするためのものですので、DB接続はもちろん、DBに対してSQL(insert,update,delete)を発行してその結果を取得する部分まで実装します。 > 現在のプロジェクトの仕様として、1テーブル1DAOということになっている 私の経験上、これはプロジェクトによって様々ですね。 1つのテーブルにつき1つのDAOクラスを作成する場合もあれば、1つの画面につき1つDAOクラスを作成する場合もあります。 要は画面設計とDB設計の兼ね合いでどちらが実装しやすいか分けています。 > 対象のテーブルごとに、DBへの接続文を書くイメージなのでしょうか? イメージとしては合っていますが、これだとDBへのコネクションを取得する処理を各DAOクラスで実装する必要が生じます。 普通はDBへのコネクションを取得する処理と各DAOクラスで共通の処理を実装したクラスを準備して、各DAOクラスはそのクラスを継承して実装していきます。 ■VOクラスについて > テーブルのカラムのことを差しているのでしょうか? これもプロジェクトによって様々です。 テーブルのカラムごとに変数を定義する場合もあれば、画面の入力項目ごとに変数を定義する場合もあります。 ただ、TOBBYSさんのプロジェクトでは1テーブル1DAOということなので、テーブルのカラムごとに変数を定義するのが一般的です。 変数名の$IDや$NAMEなどは分かりやすいようにカラム名と一致させることも多いです。 VOクラスは、DAOクラスがDBから取得してきたデータを格納したり、ビジネスロジック部がDAOクラスに対して渡すデータを格納するためのクラスです。 例えば、ユーザ情報として「ID」「名前」「パスワード」を持っているとすると、DAOクラスからデータを「ID」「名前」「パスワード」と3つに分けて取得するのは煩雑になるため、「ID」「名前」「パスワード」の3つの情報(変数)を持ったクラス(VO)クラスでやり取りする役割があります。 > 1テーブル1DAOの仕様を考慮した場合、VOクラスも1テーブルにつき1つということになるのでしょうか?? あくまでも「パターン」ですので、1テーブルにつき1つにとらわれなくても良いと思います。 スマートな画面設計とDB設計ができていれば、1テーブルにつき1つで済むのでしょうけど…。 > セッターやゲッターについても、ご教授頂けると助かります。 オブジェクト指向のカプセル化の話ですね。 例えば、Userクラスで public $name; と変数を定義すると、外部からは変数$nameに直接アクセスできることになります。 それを避けて(隠蔽)して、 private $name; と変数を定義して、代わりに public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } のように変数の値を取得/設定する関数を用意します。 この関数のことをセッターやゲッターと言います。
その他の回答 (1)
- x_jouet_x
- ベストアンサー率68% (162/236)
> 修飾子「var」の定義は適当ではないということでしょうか? 厳密に言うとvarの定義は適当ではありません。 varはPHP4で使用されていた修飾子で、PHP5では互換性を保つためにキーワードとして残されていてアクセス修飾子publicに相当します。 PHP4ではオブジェクト指向の概念が完全には取り入れられていないので、PHP4で実装するのであればvarを使わざるを得ません。 PHP5になってからはオブジェクト指向の概念がしっかりと取り入れられていますので、PHP5で実装するのであればアクセス修飾子privateを使うのが適切です。 DAOだけでなく、カプセル化というのはプログラムを書く上で「こういう作り方で書こう」という概念/考え方に過ぎません。 「ここはprivateにしなければならない」という絶対的な決まりではありませんので、その部分に気をとられ過ぎないようにして下さいね。
お礼
x_jouet_xさん なるほど。 概念的な部分は、自分なりに経験を積んで 学んでいくしかないですよね。 DAOクラスやVOクラスについて まだきちんと理解しているかどうかは 自分で整理してみないことには、なんとも 言えませんが、 大変親切で丁寧な対応ありがとうございました。
補足
x_jouet_xさん ネットでも調べていて混乱してしまったのですが、 VOクラスの定義について、もう少し教えて下さい。 以下のようなサンプルがネット上にありました。 <?php class User { var $id; var $name; var $mail; var $password; var $birthday; // 各属性の set/get メソッド。省略 } ?> 上のset/getメソッドというのが、セッターやゲッター とすると、外部から参照されないように(カプセル化)定義する ためには、修飾子「var」の定義は適当ではないということ でしょうか?