6

Czy w przypadku szkieletu MVC należy zastosować metodę statyczną lub metodę instancji?Czy klasa modelu (w MVC) powinna używać metody statycznej lub metody instancji?

np. Załóżmy klasę Users i metodę getUserById(), która zwraca klasę User, która z nich jest lepszym wyborem?

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

lub

User ret = Users.getUserById(123); 

Załóżmy nie ma zmiennej instancji w klasie Users, których jeden jest lepszym wyborem?

+0

To zależy w dużej mierze od ram używasz. – maba

+0

Niektóre dyskusje tutaj - http://stackoverflow.com/questions/538870/java-static-methods-best-practices. Nie użyłbym metod statycznych osobiście, ponieważ często są trudniejsze do przetestowania. Ponadto jeśli Twoja aplikacja obsługuje wiele dzierżaw (czyli dwa lub więcej różnych zestawów użytkowników), może to być o wiele trudniejsze. –

+0

W mojej skromnej opinii wzór MVC służy do kontynuacji koncepcji Encapsulation, w tym sensie, że żadna inna klasa nie ma dostępu do swoich "członków danych" bezpośrednio i do pewnego rodzaju "funkcji członka". Dlatego domyślam się, że tworzenie metod instancji powinno być pierwszym wyborem ... :-) –

Odpowiedz

4

Chciałbym pochylić się do zmiennej instancji. Po prostu dlatego, że łatwiej będzie pisać testy. Ponadto wiele aktualnych technologii serwerowych (Spring, JavaEE itp.) Obsługuje bardzo dobrze wtryskiwanie fasoli/zasobów. Które lepiej obsługuje to zamiast statycznych metod.

1

Jeśli masz klasę użytkownika i, na przykład, klasę produktu, a masz obiekty z identyfikatorami ids, proponuję rozszerzenie "użytkownika" i "kategorii", aby mieć jedną metodę "getById", która otrzymał identyfikator $ do uruchomienia.

W ten sposób można użyć tej samej metody dla dwóch różnych typów obiektów.

Mam nadzieję, że ten przykład ma trochę sensu:

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

Nie jest to doskonały przykład użycia podklas jako relacji * is-a *. Zasadniczo do dziedziczenia kodu używasz dziedziczenia. –

2

Zdecydowanie Nie. Właściwie powinieneś spojrzeć na wzór DAO (Data Access Object).

Same klasy modeli są odpowiedzialne jedynie za przesyłanie informacji z jednej instancji logicznej do drugiej i powinny zawierać tylko metody getera i settera.

klas DAO są odpowiedzialne za przechowywanie aktualizacji lub pobierania informacji tworzą pewne źródła danych (bazy danych) .Tutaj jest przykładem DAO wzoru:

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(); 
    } 
} 
Powiązane problemy