8

就 MVC 框架而言,我应该使用静态方法还是实例方法?

例如,假设一个Users类和一个getUserById()返回User类的方法,哪个是更好的选择?

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

或者

User ret = Users.getUserById(123);

假设类中没有实例变量Users,哪个是更好的选择?

4

3 回答 3

4

我会倾向于实例变量。仅仅是因为它会更容易编写测试。另外,很多当前的服务器技术(Spring、JavaEE 等)都很好地支持注入 bean/资源。哪个更好地支持这一点而不是静态方法。

于 2013-04-28T08:47:08.907 回答
2

坚决不。实际上你应该看看 DAO(数据访问对象)模式。

模型类本身只负责将信息从一个逻辑实例传输到另一个逻辑实例,并且应该只包含 geter 和 setter 方法。

DAO 类负责从某些数据源(数据库)存储更新或检索信息。这是 DAO 模式的示例:

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();
  }
}
于 2013-04-28T09:17:35.357 回答
1

如果您有一个 User 类,例如 Product 类,并且其中有带有 id 的对象,我建议将“User”和“Category”扩展为具有一个“getById”方法,该方法收到一个 $id被跑。

这样,您可以在两种不同类型的对象中使用相同的方法。

我希望这个例子有意义:

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();
    }
}
于 2013-04-28T09:06:21.507 回答