2010-09-03 6 views
3

À titre d'illustration DISONS Je construis une application simple blog et une classe appelée Blog:Où placer les fonctions générales dans OOP?

Class Blog(){ 
    __constructor(){ 
     connectToDatabase(); 
    } 
} 

Class BlogPost($id) extends Blog { 
    public $title; 
    public $body; 
    etc. 
} 

La classe BlogPost peut être instancié comme un objet représentant un billet de blog particulier. Mais quand je veux lister tous les enregistrements dans la base de données, je dois mettre cette fonction ailleurs.

Je pourrais le mettre dans la classe Blog, mais en supposant que j'ai beaucoup, beaucoup de telles fonctions qui ne s'appliquent pas à un objet particulier, où devrais-je les mettre? Ou peut-être que j'écris une ligne dans un fichier journal. Il semble stupide d'avoir une classe 'logfile' contenant une seule fonction qui écrit une chaîne passée dans le fichier texte.

Est-il préférable de les regrouper dans une classe Utility(), ou devrais-je créer plusieurs classes telles que util_commenting(), util_archives()? Où dois-je stocker toutes ces petites fonctions autonomes?

Répondre

0

C'est un objet de couche de persistance. Généralement, il s'agit d'un objet d'accès aux données (DAO) ou d'un référentiel, et non d'un utilitaire ou d'une fonction générale.

Je prendrais cette fonction de connexion à une base de données de votre constructeur. Cela n'appartient pas là.

Si je devais écrire ce en Java, il pourrait ressembler à ceci:

public class Blog 
{ 
    private Long id; 
    private String title; 
    private String body; 
    private String author; 
    private Date publishDate; 
    // Other attributes and functions here. 
} 

public interface BlogDao 
{ 
    Blog find(Long id); 
    List<Blog> find(); 
    List<Blog> find(Date begDate, Date endDate); 
    List<Blog> find(String author); 
    void saveOrUpdate(Blog blog); 
    void delete(Blog); 
} 

Il avait une classe qui a mis en œuvre l'interface BlogDao en utilisant toute technologie que je voulais (JDBC, Hibernate, etc.)

+1

-1: L'OP ne s'applique pas clairement à DAO. – Puppy

+0

+1: Et @DeadMG - votre objection est absurde. Si vous avez une meilleure solution, par tous les moyens poster une réponse. –

+0

N'avez-vous pas lu la question, DeadMG? "Mais quand je veux lister tous les enregistrements dans la base de données, je dois mettre cette fonction ailleurs." Un DAO est un endroit parfait pour mettre cette fonctionnalité. – duffymo

0

Vous pouvez avoir un objet BlogPostRepository ou un objet Base de données, qui peut renvoyer tous les objets BlogPosts.

0

La plupart du temps, les fonctions libres doivent simplement être placées dans un espace de nommage bien nommé. Si vous regardez les bibliothèques standard C++, il y a un certain nombre de fonctions libres dans std (comme le tri, par exemple). Vous pouvez créer un espace de nom de blog, avec une classe de blog contenue dans (blog :: blog), puis avoir d'autres fonctions libres d'utilité pour faire des blogs dans cet espace de noms.

Ils n'ont pas besoin d'entrer dans une classe et ce n'est certainement pas les meilleures pratiques pour aller dans un style singleton.

1

"Classes for Concepts" est un bon aphorisme à retenir. Essayez d'écrire des histoires/scénarios/cas d'utilisation pour décrire le fonctionnement du système.

Vous trouverez probablement que les fonctions libres tombent dans des groupes qui sont nécessaires pour satisfaire certaines des histoires.

Je recommande le "Responsibility-Driven Design" de Rebecca Wirfs-Brock. Il y a une belle overview paper sur son publications page.

+0

Merci Andy, une bonne approche que j'aurais dû retenir de mes années d'université dans ces longues et ennuyeuses leçons UML! J'apprécie certainement la poussée dans la direction de Rebecca Wifs-Brock, des choses très intéressantes qui, je pense, prendront quelques lectures pour vraiment me faire comprendre. – lewiswalsh