Je sais que dans OOP vous voulez que chaque objet (d'une classe) soit une "chose", par exemple. utilisateur, validateur etc.Comment concevoir les modèles de la manière correcte: Orienté objet ou "Package"-orienté?
Je connais les bases de MVC, comment les différentes parties interagissent les unes avec les autres.
Cependant, je me demande si les modèles dans MVC devraient être conçus selon la conception OOP traditionnelle, c'est-à-dire, chaque modèle devrait-il être une base de données/table/rangée (solution 2)?
Ou est l'intention plus de recueillir des méthodes qui affectent la même table ou un tas de tables connexes (solution 1).
exemple pour un module de carnet d'adresses dans CodeIgniter, où je veux pouvoir "CRUD" un contact et l'ajouter/le retirer d'un groupe de contact CRUD-able.
solution Models 1: bottelage toutes les méthodes liées ensemble (objet non réel, au lieu d'un "package")
class Contacts extends Model {
function create_contact() {)
function read_contact() {}
function update_contact() {}
function delete_contact() {}
function add_contact_to_group() {}
function delete_contact_from_group() {}
function create_group() {}
function read_group() {}
function update_group() {}
function delete_group() {}
}
solution Modèles 2: la voie OOP (une classe par fichier)
class Contact extends Model {
private $name = '';
private $id = '';
function create_contact() {)
function read_contact() {}
function update_contact() {}
function delete_contact() {}
}
class ContactGroup extends Model {
private $name = '';
private $id = '';
function add_contact_to_group() {}
function delete_contact_from_group() {}
function create_group() {}
function read_group() {}
function update_group() {}
function delete_group() {}
}
Je ne sais pas comment penser quand je veux créer les modèles. et les exemples ci-dessus sont mes vraies tâches pour créer un carnet d'adresses. Dois-je regrouper toutes les fonctions ensemble dans une classe. alors la classe contient une logique différente (contact et groupe), elle ne peut donc pas contenir de propriétés spécifiques à l'un ou à l'autre.
la solution 2 fonctionne selon la POO. mais je ne sais pas pourquoi je devrais faire une telle division. quels seraient les avantages d'avoir un objet Contact par exemple. Ce n'est sûrement pas un objet Utilisateur, alors pourquoi un Contact devrait-il "vivre" avec son propre état (propriétés et méthodes)? Parce que j'ai tendance à penser comme ceci: Si quelque chose a besoin d'un état, alors je crée une classe POO afin que les méthodes puissent affecter l'état ou d'autres choses basées sur l'état.
De même, les modèles doivent-ils être "en état"? Si elles ne nécessitent aucun état, pourquoi devrais-je le créer selon le modèle de POO. Ensuite, je pourrais tout regrouper comme la solution "paquet".
vous les gars expérimentés avec POO/MVC, s'il vous plaît donner un éclairage sur la façon dont on devrait penser dans cette tâche très concrète (et en général lors de la création d'un modèle)
EDIT: VENEZ penser à des contrôleurs dans MVC. ils sont créés en fonction de la solution "package". Je me demande ...
Je pense que je comprends votre point de vue. mais est le code sql pour récupérer/insérer des lignes de/vers la base de données dans le mapper_model ou les data_models?Pourquoi devrais-je récupérer les données de mysql et les mettre dans le data_model (chaque objet représentant un contact) via un mappeur? à quoi ça sert? ou ai-je mal compris le flux? CONTROLLER appelle MAPPER_MODEL qui récupère les données de MYSQL et les place dans DATA_MODEL? Je pense que je me trompe. pourriez-vous expliquer le flux pour moi. –
Vous avez raison. Le contrôleur appelle le mappeur (généralement indirectement via un service ou en invoquant un autre modèle en fonction de la distance que vous voulez prendre) et demande un modèle. Le mappeur crée le modèle, le remplit et le renvoie. Le but est l'abstraction; il protège le modèle des modifications apportées au magasin de données. Le code MySQL appartient au mappeur, le modèle ne devrait rien savoir à ce propos. Si vous avez décidé de stocker vos données dans un format différent plus tard, disons XML, vous écrivez un mappeur qui analyse les fichiers XML et renvoie le modèle. De cette façon, toute la logique de persistance est encapsulée. – Duncan
cela me semble tellement logique maintenant! donc fondamentalement je devrais nommer mes cartographes à n'importe quelle couche de données qu'ils utilisent, par exemple. "xml_mapper_model", "mysql_mapper_model". de cette façon particulière, je pourrais utiliser n'importe quel stockage de données que je préfère. et les modèles de données sont "contact_model" et "contact_group_model". c'est comme la matrice .. chaque programme est un "être humain" responsable d'une seule tâche. nous avons eu le «portier», le «fabricant de clés», les «gardes de sécurité» et ainsi de suite. donc une application entière est juste un groupe de ces objets communiquant avec/déléguant à des tâches les uns les autres. aussi comme un gouvernement militaire =) –