就MVC框架而言,我应该使用静态方法还是实例方法?
e.g。假设Users
类和方法getUserById()
返回User
类,哪一个更好?
Users users = new Users();
User ret = users.getUserById(123);
或
User ret = Users.getUserById(123);
假设班级Users
中没有实例变量,
哪一个是更好的选择?
答案 0 :(得分:4)
我倾向于实例变量。仅仅因为它更容易编写测试。此外,许多当前的服务器技术(Spring,JavaEE等)都非常支持注入bean /资源。哪个更好地支持这个而不是静态方法。
答案 1 :(得分: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();
}
}
答案 2 :(得分: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();
}
}