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(); 
    } 
} 
相關問題