8
votes

Si une classe de modèle (en MVC) utilise une méthode statique ou une méthode d'instance?

en termes de cadre MVC, devrais-je utiliser une méthode statique ou une méthode d'instance?

E.g. Supposez un utilisateur CODE> classe et une méthode getuserByID () code> qui renvoie une classe code> utilisateur code>, lequel est meilleur choix? P>

User ret = Users.getUserById(123);


4 commentaires

Cela dépend fortement du cadre que vous utilisez.


Quelques discussions ici - Stackoverflow.com/questions/538870/... . Je n'utiliserais pas personnellement des méthodes statiques, car elles sont souvent plus difficiles à tester. De plus, si votre application est prise en charge multi-location (c'est-à-dire deux ensembles d'utilisateurs ou plus distincts), cela pourrait être beaucoup plus difficile.


À mon humble avis, le motif MVC est utilisé pour transporter le concept d'encapsulation, dans ce sens, que, aucune autre classe ne doit accéder à ses membres directement directement et à certaines fonctions des membres . Par conséquent, je suppose que la création de méthodes d'instance doit être le premier choix ... :-)


Ne pensez-vous pas que la création d'objets de mélange avec la logique de domaine signifierait une violation de SRP?


3 Réponses :


4
votes

Je me pencherais vers la variable d'instance. Tout simplement parce qu'il sera plus facile d'écrire des tests pour. De plus, beaucoup de technologies de serveur actuelles (printemps, Javae, etc.) soutiennent très bien les haricots / ressources injectables. Qui soutient mieux cela plutôt que des méthodes statiques.


0 commentaires

1
votes

Si vous avez une classe d'utilisateurs et, par exemple, une classe de produit, et que vous disposez d'objets avec IDS, je suggère d'étendre la «catégorie» et la «catégorie» d'avoir une méthode 'GetByID', qui a reçu Un identifiant $ pour être couru.

De cette façon, vous pouvez utiliser la même méthode dans deux types d'objets différents. P>

J'espère que cet exemple est un sens: P>

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 commentaires

Ce n'est pas un excellent exemple d'utilisation de sous-classes comme une relation une relation . Vous utilisez fondamentalement l'héritage pour hériter du code.



2
votes

Nope défiant. En fait, vous devriez regarder le modèle DAO (objet d'accès aux données).

Les classes de modèle lui-même ne sont responsables que pour le transfert d'informations d'une instance logique à une autre et ne doivent contenir que des méthodes d'obtention et de réglage. p>

Les classes DAO sont responsables du stockage de la mise à jour ou de la récupération de formulaire d'information de la source de données (base de données). Il existe un exemple de motif DAO: p>

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();
  }
}


0 commentaires