2010-09-25 9 views
0

Parfois, je rencontre ce problème où vous avez un ensemble de fonctions qui appartiennent évidemment au même groupe. Ces fonctions sont nécessaires à plusieurs endroits, et souvent ensemble. Pour donner un exemple spécifique: considérons les fonctions filemtime, fileatime et filectime. Ils fournissent tous une fonctionnalité similaire. Si vous construisez quelque chose comme un gestionnaire de fichiers, vous aurez probablement besoin de les appeler l'un après l'autre pour obtenir les informations dont vous avez besoin. C'est le moment où vous pensez à un emballage. PHP fournit déjà stat, mais supposons que nous n'avons pas cette fonction.Fonctions de groupe de fonctionnalité similaire

J'ai regardé le code source php pour savoir comment ils ont résolu ce problème particulier, mais je ne peux pas vraiment savoir ce qui se passe.

De toute évidence, si vous avez une implémentation naïve d'une telle fonction de regroupement, dites filetimes, voudrait ceci:

function filetimes($file) { 
    return array(
     'filectime' => filectime($file) 
     ,'fileatime' => fileatime($file) 
     ,'filemtime' => filemtime($file) 
    ); 
} 

Cela fonctionnerait, mais engage des frais généraux puisque vous devrez ouvrir un pointeur de fichier pour chaque appel de fonction. (Je ne sais pas s'il est nécessaire d'ouvrir un pointeur de fichier, mais supposons que pour l'exemple). Une autre approche serait de dupliquer le code des fonctions fileXtime et de les laisser partager un pointeur de fichier, mais cela introduit évidemment la duplication de code, probablement pire que la surcharge introduite dans le premier exemple.

La troisième solution, et probablement la meilleure, que j'ai trouvée est d'ajouter un deuxième paramètre facultatif aux fonctions fileXtime pour fournir un pointeur de fichier.
Les filetimes fonctions seraient alors ressembler à ceci:

function filetimes($file) { 
    $fp = fopen($file, 'r'); 
    return array(
     'filectime' => filectime($file, $fp) 
     ,'fileatime' => fileatime($file, $fp) 
     ,'filemtime' => filemtime($file, $fp) 
    ); 
} 

D'une certaine manière cela se sent encore « mauvais ». Il y a ce paramètre supplémentaire qui n'est utilisé que dans certaines conditions très spécifiques. Donc, fondamentalement, la question est: quelle est la meilleure pratique dans des situations comme celles-ci?


Modifier:
Je suis conscient que cela est une situation typique où POO entre en jeu. Mais d'abord: tout ne doit pas être une classe. J'utilise toujours une approche orientée objet, mais j'ai aussi toujours des fonctions dans l'espace global. Disons que nous parlons ici d'un système hérité (avec ces parties 'non-oop') et qu'il y a beaucoup de dépendances sur les fonctions fileXtime.

tdammeranswer est bon pour l'exemple spécifique que j'ai donné, mais s'étend-il à l'ensemble de problème plus large? Une solution peut-elle être définie de sorte qu'elle s'applique à la plupart des autres problèmes dans ce domaine?

+0

jetez un coup d'œil à cette question (et à bien d'autres marqués "orienté objet" ou "oop") pour un arrière-plan abondant sur le problème bien connu que vous avez rencontré ici. http://stackoverflow.com/questions/355796/how-do-you-explain-oo-to-new-programmers –

+0

Je connais bien les pratiques générales de la POO. Mais ce n'est pas à propos de la POO, voir la question mise à jour. –

Répondre

0

Je réécrirais les fonctions fileXtime pour accepter un nom de fichier ou un handle de fichier comme seul paramètre. Les langages qui peuvent surcharger des fonctions (comme C++, C#, etc.) peuvent utiliser cette fonctionnalité; en PHP, vous devrez vérifier le type de l'argument au moment de l'exécution.

passant à la fois un nom de fichier et un descripteur de fichier serait redondant et les appels ambigus pourraient être apportées:

$fp = fopen('foo', 'r'); 
$times = file_times('bar', $fp); 

Bien sûr, si vous voulez aller POO, vous voulez juste les envelopper le tout dans un FileInfo classe, et de stocker un fichier privé (paresseux?)?

+0

Il est en effet préférable de le laisser accepter un nom de fichier ou un pointeur. Merci. –

+0

Sur un sidenote, PHP a déjà une classe FileInfo avec 'SplFileInfo' et' SplFileObject', qui fournissent également l'accès aux filetimes. – Gordon

1

Utiliser les classes, Luke.