6

就MVC框架而言,我应该使用静态方法还是实例方法?模型类(在MVC中)应该使用静态方法还是实例方法?

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

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

User ret = Users.getUserById(123); 

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

+0

这在很大程度上取决于你使用的框架。 – maba 2013-04-28 08:48:51

+0

这里的一些讨论 - http://stackoverflow.com/questions/538870/java-static-methods-best-practices。我个人不会使用静态方法,因为它们通常很难测试。另外,如果您的应用支持多租户(即两个或更多不同的用户组),那么这可能会变得更加困难。 – 2013-04-28 09:05:54

+0

在我看来,MVC模式被用来推广封装的概念,在这个意义上说,没有其他类应该直接访问它的'数据成员'并且有一定的扩展'成员函数'。因此,我猜创建实例方法,应该是第一个选择... :-) – 2013-04-28 09:23:53

回答

4

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

1

如果你有一个用户类,例如一个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(); 
    } 
} 
+1

这不是使用子类作为* is-a *关系的好例子。你基本上使用继承来继承代码。 – 2013-04-28 09:11:30

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(); 
    } 
} 
相关问题