IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Conception POO méthode de classe déclarée forcément dans une interface


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de mapmip
    Profil pro
    ulla
    Inscrit en
    Juillet 2006
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ulla

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 326
    Par défaut Conception POO méthode de classe déclarée forcément dans une interface
    Salut,

    dans PHP ou tout autre langage POO,
    pensez vous que ca soit une bonne facon de concevoir les classes de la facon suivante :
    une classe normale ou abstraite ne doit pas déclarer directement une méthode en son sein,
    la méthode doit d'abord être déclarée dans une interface puis la classe implémente l'interface et la méthode en question.

    Merci d'avance

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Pas nécessairement. Une interface est nécessaire lorsque tu peux avoir plusieurs implémentations possibles. Il y a des cas où c'est rarement le cas, comme les value objects ou les data transfer objects; d'autres où ce n'est jamais le cas, par exemple les classes anonymes.

    De plus, une interface est juste une... interface, c'est-à-dire un dispositif pour les objets externes d'accéder à une "famille" d'objet. Mais un objet peut aussi avoir des méthodes propres.

    De manière générale, il ne faut pas essayer de tout prévoir à l'avance (et se dire: peut-être qu'un jour j'aurais besoin d'objets similaires et je dois m'y préparer en créant une interface) parce qu'on ne peut pas tout prévoir justement et que les contraintes du futur sont imprévisibles. Si tu n'as pas besoin de multiples implémentations, déclare directement tes méthodes dans la classe; il sera toujours temps de refactoriser plus tard.

  3. #3
    Membre extrêmement actif Avatar de mapmip
    Profil pro
    ulla
    Inscrit en
    Juillet 2006
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ulla

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 326
    Par défaut
    Citation Envoyé par Tsilefy Voir le message
    Une interface est nécessaire lorsque tu peux avoir plusieurs implémentations possibles .
    Que veux tu dire par implémentations ? Plusieurs méthodes qui portent le même nom voire même nombre et type d'argument mais de classes différentes ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Prend l'exemple d'un code dont le but est d'enregistrer des logs par exemple.

    Tu peux vouloir enregistrer des logs dans un fichier, dans une base de données , dans un syslog, dans un greylog , etc ...
    Ca veux dire que tu vas à voir autant de classe que destination (on va appeler ca des writers).

    A un moment donner tu vas instancier un objet du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $logs = new Logs('file'); // Pour écrire dans un fichier
    //$logs = new Logs('bdd'); // Pour écrire dans une base
    $logs->write('Mon message'); // Quelque soit le type , la fonction est la même
    Pour que ce soit transparent , il faut que tes writers implémentent tous la fonction write(). Et pour imposer ca , c'est l'interface qui entre en jeu.

    Le but de l'interface c'est donc d'imposer un "contrat" aux classes qui l'implémente. Il y'a une vraie signification derrière son utilisation.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    effectivement, soit tu passes par une interface et ton code verifies le type interface, soit par une classe abstraite.

    l'avantage de l'interface c'est que tu as la possibilité d'en avoir plusieurs implémentée dans la meme classe.
    l'avantage de la classe (mère abstraite ou pas) c'est que tu as possibilité de réutiliser du code parent ... mais qu'un seul parent.

    Avant je préfèrai les classes mère, maintenant c'est plus interface.

    Quand aux traits... j'ai peu eu affaire à eux.

    C'est l'éternelle question de la POO. seule l'expérience peu t'aider.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Citation Envoyé par gene69 Voir le message

    Avant je préfèrai les classes mère, maintenant c'est plus interface.
    Pareil, ça fait des années que je n'utilise plus l'héritage sauf contraint et forcé. Je ne vois aucun cas dans lequel l'héritage est la meilleure solution, c'est juste du copier-coller qui ne dit pas son nom (et qui prête donc à confusion, surtout les débutants). Je préfère une interface, la composition. Quite à utiliser du copier-coller, mieu vaut utiliser les traits qui eux au moins sont clairs (même si la composition résout mieux ces problèmes).

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/02/2015, 09h30
  2. Réponses: 5
    Dernier message: 28/11/2014, 14h46
  3. Comment récupérer une variable déclarée GLOBALE dans une classe PHP
    Par Globolite dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 08/03/2013, 13h41
  4. Réponses: 3
    Dernier message: 09/04/2008, 17h45
  5. Réponses: 3
    Dernier message: 05/10/2006, 18h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo