2010-09-23 28 views
1

Je cherche de l'aide pour identifier ce modèle de design et apprendre le vocabulaire "typique" qu'il utilise:Programmation générale: Quand un ensemble d'objets est géré par un autre objet, comment l'appelez-vous?

Je travaille sur un projet en PHP, et j'ai créé une fine couche ORM qui enregistre des objets génériques et de la base de données. Deux classes fonctionnent:

  • "my_object" est essentiellement un conteneur pour différents types de données. Après avoir été créé, cet objet peut être sauvegardé dans la base de données. "My_object_manager" est utilisé pour gérer un ensemble d'objets, par exemple si vous voulez en récupérer plusieurs et les parcourir.

Comme un exemple simplifié, vous pourriez faire quelque chose comme:

$post = new my_object('post'); 
$post->title = 'foo'; 
$post->body = 'bar'; 
$post->author = 'baz'; 

... et si vous vouliez charger un tas de messages que vous pourriez faire quelque chose comme:

$posts = new my_object_manager('post'); 
$somePosts = $posts->getBy('author','baz'); 
foreach($somePosts as $aPost) { 
    ...loop stuff here... 
} 

Donc, ma question est la suivante: Dans la définition de classe pour "my_object_manager" j'ai besoin de stocker une propriété qui identifie quel type d'objet est géré. Il ressemble à ceci:

class my_object_manager { 
    protected $theKindOfObjectThatThisManages; 

    function __construct($whatToManage) { 
     $this->theKindOfObjectThisManages = $whatToManage; 
    } 
} 

Maintenant, pardonnez-moi de ne pas savoir ce genre de choses de base, mais je suis autodidacte et un vocabulaire de programmation assez limité. Je suis sûr que ce genre de modèle de design est commun, mais pour la vie de moi, je n'ai pas été capable de comprendre comment ça s'appelle. J'essaie d'écrire du code que d'autres programmeurs peuvent lire et comprendre, donc, ma vraie question est de savoir si vous lisiez ce code, comment vous attendez-vous à ce que "$ theKindOfObjectThatThisManages" soit appelé? Comment s'appelle ce modèle de conception de programme, et comment appelez-vous ce type d'objet si vous voulez que d'autres programmeurs sachent ce qu'il fait? Enfin, l'éditeur de questions est apparu et m'a dit que cette question avait l'air subjective et risquait d'être fermée. J'espère que cette question est, en fait, correcte pour Stack Overflow - mais sinon, où pourrais-je poser cette question et obtenir une réponse?

Merci!

Répondre

1

Pour vos exemples de code, j'utiliser

class my_object_manager { 
    protected $my_object_type; 

    function __construct($whatToManage) { 
     $this->my_object_type = $whatToManage; 
    } 
} 

Maintenant, vous semblent suivre de près le qui Active Record pattern, de beaucoup implementationsexist, vous pouvez aller voir comment ils le font dans la pratique :)

Habituellement, vous ne fournissez pas d'accès aux objets _manager(), mais vous en faites hériter my_object(). Donc, vous auriez quelque chose comme

$posts = new Posts(); //Where Posts() extends my_object_manager 
$somePosts = $posts->getBy('author','baz'); 
foreach($somePosts as $aPost) { 
    ...loop stuff here... 
} 
+0

Ah, alors ** c'est ce que ActiveRecord est. Vous savez, j'en avais entendu parler, mais je ne comprenais pas exactement ce que cela signifiait jusqu'à ce que je lis la page PHPActiveRecord à laquelle vous étiez lié. Merci! – Andrew

1

Départ:

http://en.wikipedia.org/wiki/Design_pattern_(computer_science)

Votre gestionnaire de conception objet, en fonction de la complexité qu'il obtient, peut tomber sous plusieurs motifs.Par exemple:

Composite: Peut-être que votre gestionnaire d'objets vous permet d'exécuter des mises à jour sur plusieurs objets à la fois (scénario de base de données typique) en utilisant la même interface. Vous pouvez modifier des objets individuels de la même manière que vous modifiez les collections. Façade: Si votre gestionnaire d'objets fournit des méthodes pour combiner différentes parties de votre système dans une interface unique et facile à utiliser, il utilise le modèle de façade. Par exemple, votre gestionnaire d'objets crée peut-être un objet 'utilisateur' et génère automatiquement son premier 'message' via un seul appel d'API. Peut-être que vous auriez pu utiliser les fonctions create() sur les objets post et utilisateur pour le faire vous-même, mais le pattern Facade les combine (et aide peut-être aussi à gérer les problèmes de concurrence) dans une API plus simple. Médiateur/Observateur: Votre gestionnaire d'objets peut être responsable de l'observation des modifications apportées aux objets et de la gestion de la «médiation» entre eux. Votre gestionnaire d'objets peut fournir une méthode pour commenter un message. Mais lorsque cette méthode est appelée, l'auteur de la publication peut avoir besoin d'être averti par e-mail. Ainsi, votre gestionnaire d'objets pourrait être responsable de la communication entre les objets pertinents et de la notification d'un service de courrier électronique d'écoute en envoyant un événement ou un message similaire.

+0

Merci pour le lien, et les pointeurs. FWIW, qu'appelez-vous "theKindOfThingThisObjectManages"? – Andrew

+0

Je ne sais pas s'il existe un très bon nom générique pour couvrir ce modèle autre que 'Object' ou 'ObjectType'. En fonction de ce qui est géré, des noms plus spécifiques peuvent inclure 'Record'/'RecordType', 'Document'/'DocumentType' ou simplement 'DatabaseObject'. Désolé de ne pas avoir de réponse plus définitive! :) – dlongley