6

MVCフレームワークの場合、静的メソッドまたはインスタンスメソッドを使用する必要がありますか?Modelクラス(MVC)は静的メソッドまたはインスタンスメソッドを使用する必要がありますか?

Usersクラスと、クラスを返すメソッドgetUserById()を想定します。どれが良い選択ですか?

Users users = new Users(); 
User ret = users.getUserById(123); 

または

User ret = Users.getUserById(123); 

より良い選択である1 、クラスUsersにはインスタンス変数がないと仮定?

+0

使用するフレームワークに大きく依存します。クラスは、いくつかのデータソース(データベース).Hereを形成更新を保存するかの情報を取得するための責任がある

DAOは、DAOパターンの一例です。 – maba

+0

ここでの議論 - http://stackoverflow.com/questions/538870/java-static-methods-best-practices静的メソッドは個人的には使用しません。なぜなら、テストすることはしばしば難しいからです。また、アプリがマルチテナントをサポートしている場合(つまり、2つ以上の異なるユーザーセット)、これはもっと難しくなる可能性があります。 –

+0

私の謙虚な意見では、MVCパターンは、カプセル化の概念を進めるために使用されています。つまり、他のクラスはその「データメンバー」に直接アクセスし、特定のメンバー関数を拡張することはありません。したがって、インスタンスメソッドの作成は、まずは選択する必要がありますね: –

答えて

4

私はインスタンス変数の方に傾いています。単にテストを書くのが簡単になるからです。さらに、現在の多くのサーバー技術(Spring、JavaEEなど)は、Bean /リソースの注入を非常にうまくサポートしています。静的メソッドではなく、これをサポートします。

1

UserクラスとProductクラスがあり、そこにオブジェクトIDを持つオブジェクトがある場合は、 'User'と 'Category'に 'getById'メソッドを1つ拡張することをお勧めします。実行される$ idを受け取りました。

このようにして、2つの異なるタイプのオブジェクトで同じ方法を使用できます。

私は、この例では、いくつかの理にかなって願っています:

ふてくされ
class User extends SuperClass { 
    public function getTableName() { 
     return 'table_name_for_user'; 
    } 
    public function getPK() { 
     return 'primary_key_for_user'; 
    } 
} 

class Category extends SuperClass { 
    public function getTableName() { 
     return 'table_name_for_category'; 
    } 
    public function getPK() { 
     return 'primary_key_for_category'; 
    } 
} 

class SuperClass { 
    public function getById($id) { 
     $query = $this->db->query("SELECT * FROM " . $this->getTableName() . " WHERE " . $this->getPK() . " = $id"); 
     return $query->result(); 
    } 
} 
+1

これは、* is-a *関係としてサブクラスを使用する素晴らしい例ではありません。基本的に継承を使用してコードを継承しています。 –

2

いいえ。実際には、DAO(Data Access Object)パターンを調べる必要があります。

モデルクラス自体は、1つのロジックインスタンスから別のロジックインスタンスに情報を転送することのみを担当し、geterメソッドとsetterメソッドのみを含む必要があります。

public class BookDAO { 

    private PreparedStatement saveStmt; 
    private PreparedStatement loadStmt; 

    public DBBookDAO(String url, String user, String pw) { 
    Connection con = DriverManager.getConnection(url, user, pw); 
    saveStmt = con.prepareStatement("INSERT INTO books(isbn, title, author) " 
            +"VALUES (?, ?, ?)"); 
    loadStmt = con.prepareStatement("SELECT isbn, title, author FROM books " 
            +"WHERE isbn = ?"); 
    } 

    public Book loadBook(String isbn) { 
    Book b = new Book(); 
    loadStmt.setString(1, isbn); 
    ResultSet result = loadStmt.executeQuery(); 
    if (!result.next()) return null; 

    b.setIsbn(result.getString("isbn")); 
    b.setTitle(result.getString("title")); 
    b.setAuthor(result.getString("author")); 
    return b; 
    } 

    public void saveBook(Book b) { 
    saveStmt.setString(1, b.getIsbn()); 
    saveStmt.setString(2, b.getTitle()); 
    saveStmt.setString(3, b.getAuthor()); 
    saveStmt.executeUpdate(); 
    } 
} 
関連する問題