2010-11-12 3 views
1

Fondamentalement, je suis à la recherche de commentaires ou de conseils sur quelque chose que j'ai créé cette semaine au travail. Le problème était que j'avais deux types de téléchargement de documents. Ces types à la fois des méthodes partagées comme upload, isUploaded, move etc. Mais, dans certains cas, ils avaient tous les deux une fonctionnalité unique. Donc je pensais que la meilleure approche pour gérer cela serait de créer une classe abstraite qui contient la fonctionnalité commune et 2 classes séparées qui étendent la classe abstraite de base afin d'hériter de la fonctionnalité commune.Recherche de confirmation ou de conseils sur l'utilisation de la classe abstraite dans Php

J'ai donc:

abstract class Upload { 

protected $_id; 
protected $_name; 
protected $_dbTable; 

abstract public function create(Filter $filter) {} 
abstract public function update(Filter $filter) {} 

public function __construct($id){ 
    if(!is_null($id)){ 
    $class = new get_called_class(); 
    return new $class($id); 
    } 
} 

protected function upload(){ 
    //Code implemented 
} 

protected function isUploaded(){ 
    //Code implemented 
} 

protected function move(){ 
    //Code implemented 
} 

} 

Class Book_Upload extends Upload { 

$dbTable = 'book'; 

public function __construct($id){ 
    //Database stuff to obtain record information 
    //Set protected member variables 
    $results = $databaseCall(); 
    $this->_id = $results['id']; 
    $this->_name = $results['name']; 
} 

public function create(Filter $filter) { 
    //Code implemented 
} 

public function update(Filter $filter) { 
    //Code implemenetd 
} 

//Other unique functions 

} 

Class Magazine_Upload extends Upload { 

$dbTable = 'magazine'; 

Same as Booking_Upload but with additional functionality 
plus abstract methods 

} 

Ma requête est, j'utilise des méthodes abstraites correctement? Ai-je suivi le bon chemin? De plus, je ne suis pas sûr d'avoir besoin de la construction dans la classe abstraite. Que se passe-t-il si quelqu'un tente d'appeler $ upload = new Upload ($ id)?

+0

Oh, la logique ci-dessus a été re-tapée à partir de la mémoire afin d'ignorer toutes les erreurs syntaxiques. –

Répondre

0

Toute classe doit fournir un type de fonctionnalité unique (principe de responsabilité unique, exemple: Single Responsibility Principle - A hard to see example?).

Une classe de téléchargement ne doit traiter que des téléchargements. Sans plus de code, je sens une classe trop fonctionnelle de vos mots qui essaie d'accomplir à la fois le téléchargement et les tâches spécifiques au document. Donc, avant d'aller dans ce sens, vous devriez bien définir ce que ces classes vont faire. Ces fonctionnalités document-spécifiques sont-elles réellement liées à l'acte de téléchargement?

+0

Hmm Je vois votre bataillon de points mais mes classes de document doivent utiliser les méthodes de téléchargement. Les méthodes de document créent un enregistrement basé sur le fichier téléchargé et fournissent une fonctionnalité pour accéder aux données d'enregistrement lors de la construction. –

+0

Ensuite, le modèle 'composition' devrait être le chemin à parcourir. Vous pouvez appeler la classe de téléchargement à partir des classes de document. –

0

Vous développez la classe n'appelle pas parent :: __ construct() donc le résumé __construct ne fera aucune différence.

Vous utilisez correctement les classes abstraites; ce sont des classes de base qui doivent être construites par d'autres classes qui partagent des fonctions communes et/ou auront la même fonctionnalité mais qui sont implémentées différemment.

Les classes abstraites constituent une base sur laquelle s'appuyer pour fournir une fonctionnalité et une structure communes à d'autres classes.

Questions connexes