6

In termini di framework MVC, dovrei utilizzare un metodo statico o un metodo di istanza?Una classe Model (in MVC) dovrebbe utilizzare un metodo statico o un metodo di istanza?

ad es. Assumere una classe Users e un metodo getUserById() che restituiscono una classe User, quale è la scelta migliore?

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

o

User ret = Users.getUserById(123); 

Assumere non v'è alcuna variabile di istanza della classe Users, che uno è una scelta migliore?

+0

che dipende in larga misura il quadro che si usa. – maba

+0

Alcune discussioni qui - http://stackoverflow.com/questions/538870/java-static-methods- best-practice. Non userei i metodi statici personalmente, poiché sono spesso difficili da testare. Inoltre, se l'app supporta la multi-tenancy (ovvero due o più gruppi distinti di utenti), ciò potrebbe risultare molto più difficile. –

+0

A mio modesto parere, il pattern MVC viene utilizzato per portare avanti il ​​concetto di incapsulamento, nel senso che nessun'altra classe deve accedere ai suoi 'membri dati 'direttamente e ad alcuni' funzioni membro '. Quindi immagino che la creazione di metodi di istanza, dovrebbe essere la prima scelta ... :-) –

risposta

4

Vorrei inclinarmi alla variabile di istanza. Semplicemente perché sarà più facile scrivere test per. Inoltre, molte delle attuali tecnologie server (Spring, JavaEE, ecc.) Supportano l'iniezione di bean/risorse molto bene. Quale migliore supporta questo piuttosto che i metodi statici.

1

Se si dispone di una classe utente e, ad esempio, di una classe di prodotto e di oggetti con id, suggerirei di estendere 'Utente' e 'Categoria' per avere un metodo 'getById', che ricevuto un $ id da eseguire.

In questo modo, è possibile utilizzare lo stesso metodo in due diversi tipi di oggetti.

Spero che questo esempio fa un certo senso:

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

Questo non è un ottimo esempio di utilizzo di sottoclassi come una relazione * is-a *. In pratica stai usando l'ereditarietà per ereditare il codice. –

2

Defiantly no. In realtà dovresti considerare il pattern DAO (Data Access Object).

Le classi modello sono responsabili solo del trasferimento di informazioni da un'istanza logica a un'altra e devono contenere solo metodi geter e setter.

classi DAO sono responsabili per la conservazione o il recupero di aggiornamento Modulo di qualche fonte dei dati (database) .Qui è esempio di modello 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(); 
    } 
} 
Problemi correlati