Abstraction et interfaces PHP

Tags:: php :: copix :: développement

Une question s'est levée lors de mon développement sur une implémentation de classes dans Copix. En effet, rares sont les occasions pour moi de devoir définir des classes abstraites complémentées d'interfaces et je me suis retrouvé devant une implémentation intéressante mais interrogative :)

Je vais simplifier mon concept avec des classes simples. Mais avant cela, un petit rappel sur les principes de bases des classes et méthodes abstraites ainsi que les interfaces.

Les interfaces sont de simples définitions de capacités pour une classe qui doivent être implémentées. En l'occurrence, un véhicule sait "démarrer", "avancer", "reculer", et "freiner"... on va définir un ensemble de capacités pour les objet mobiles:


interface Movable {
   public function start();
   public function stop();
   public function forward();
   public function backward();
}
 

Passons à la classe Véhicule, un Véhicule est une définition dont on pourra hériter, c'est quelque chose d'abstrait car un véhicule doit aussi se décliner en véritable objet: voiture, bateau, avion... ils auront tous les même attributs (couleurs, type de carburant, marque...) mais pourront aussi avoir des capacités particulière, par exemple "voler" pour un avion, flotter pour une bateau...

Par contre, tous véhicule sait démarrer, avancer, freiner... chaque véhicule aura sa propre manière d'avancer... nous avons donc plusieurs moyens de définir ces méthodes... nous allons donc donner ces capacités à tout les véhicule qui redéfinirons ces méthodes.


abstract class Vehicule implements Movable {
   protected $color;
   protected $type;
   protected $mark;

   /**
   * Example for constructor
   */

   public function __construct($stdObject){
      $this->color = $stdObject->color;
      $this->type = $stdObject->type;
      $this->mark = $stdObject->mark;
   }
}
 

Prenons l'exemple d'une voiture, elle hérite d'un véhicule:


class Car extends Vehicule {
   public function start(){
      //how to start...
   }
   public function stop(){
      //how to stop...
   }
   public function forward(){
      //how to forward... press pedal... etc...
   }
   public function backward(){
      //how to backward... change state, press pedal...
   }
}
 

Les classes dérivants de Vehicule doivent, dans tous les cas, redéfinir les méthodes déclarées dans l'interface Movable...

Jusque là tout me paraissait clair et puis je me suis demandé... pourquoi utiliser une interface ?

En l'occurrence, les méthodes définies pour un véhicule sont appliquées via l'interface, mais comme la classe véhicule est abstraite, les méthodes de l'interfaces le deviennent par la même occasion.

Nous pourrions alors définir Vehicule de cette manière:


abstract class Vehicule {
   protected $color;
   protected $type;
   protected $mark;

   /**
   * Example for constructor
   */

   public function __construct($stdObject){
      $this->color = $stdObject->color;
      $this->type = $stdObject->type;
      $this->mark = $stdObject->mark;
   }

   //methods to redefine on extended classes
   abstract public function start();
   abstract public function stop();
   abstract public function forward();
   abstract public function backward();


}
 

Ce qui revient au même... La seule différence est que nous n'avons plus besoin de l'interface.

Le choix, selon moi, réside dans l'aptitude d'extraire les méthodes dans un autre bloc qui pourra être utiliser pour autre chose. Effectivement l'interface pourrait parfaitement être utile à autre chose qu'un véhicule... un robot pourrait parfaitement utiliser l'interface "Movable" alors qu'il n'est pas un véhicule...

Je ne sais pas si je me trompe, mais j'aimerai bien être éclairé sur ces questions, dans quel cas vaut-il mieux définir une interface ou des méthodes abstraites ?

Selon vous alors ? Merci à ceux qui pourraient m'aider à y voir plus clair.

Utilisez le code barre pour ouvrir le ticket dans votre mobile:
This ticket on you mobile
1 Mercredi 24 Septembre 2008 08:28:52, pseudo.nash

Salut !
Je pense que tu as trouvé la raison de faire un choix ou l'autre : il s'agit de la réutilisabilité du composant (ici de l'interface). Si tu penses utiliser d'autres classes "movables", alors le mieux sera certanement d'utiliser cette interface.
Personnellement j'ai tendance à découpler au maximum (donc, dans cet exemple, je pense que je créerais l'interface), mais il est vrai que c'est une question délicate, dans le sens où l'utilité finale ton interface sera l'utilisation qui en est faite dans l'ensemble de l'application/du framework

2 Mercredi 24 Septembre 2008 11:11:58, Metal3d

Merci à toi pour ces réponses, je me doutais bien que le système d'interface était juste un déports de capacités.

Je suis assez d'accord sur le fait de découpler au maximum les fonctionnalités tant qu'on ne perd pas en lecture.

Faudrait avoir d'autres avis tout de même :) hein ?

Ajouter un commentaire
Veuillez répondre à la question suivante : Pim pam et tapez "poom" sans les guillemets

Trackbacks

Pour ajouter un trackback (retrolien) sur ce ticket, utilisez cette adresse: http://www.metal3d.org/index.php/trackback/default/tb?id=blog%2F120

Tags

Blog Copix Communication PC Config Fedora Vidéo Humour Autre Web Materiel Informatique PHP Développement Mootools HTML Linux WEB IE CSS Vista Microsoft Sympa XHTML Quizz Widget Klik CWE Voeux Bonne année Musique CCRMA Son Audio MAO Reconnaissance vocale Windows Mac Compiz MacOS Mysql Sun Base de données BD Screenlets Screenlet RPM compiz Ubuntu Live FireFox Derambarsh Facebook media informations Sécurité javascript SSH Commande Marketing concours ipod wii QT Trooltech Nokia Libre Logiciels GPL Attali Gnome Dock Compiler Bench undelete reiserfs recovery recover Thread Serveur Optimisation Server Apache Album RSS Flash Air XML Firefox Blender Opensource Orange Internet LiveBox Animaux Droits Logiciels Libres Google Loi RBS netcat Bash Téléphone Spam 3D NIDIA Standards Widgets Merise UML Streaming Developpement Perl MySQL Firewall Parfeu Bayes Novell Réseau Python LVS Salon FTP Dedibox Chrome Administration IRC Gentoo troll video Nouveauté Finance Etudiant spéctacle OpenOffice Javascript Java Info Eclpise ATI design mootools KDE Bureau Design GNU C Pages Jaunes Fun Bijoux Art mail Admin vmware fedora linux VirtualBox VMWare Qemu KVM vim Grep Fglrx Webkit GTK google web JQuery Coup de gueule coup de gueule Lois SVG Raycaster Canvas Hadopi Desktop Jeux Les Sims développement astuces Screen firefox Mobile Safaru Wine bash commande astuce Wave ooc C++ C# Netbook Hercules Bureautique Twitter Safari W3C chrome kazehakaze midori navigateur gecko webkit Links Liens Pyhon Nouvelles Metal Perso Conférence JDLL PCC Roadsend OOC News Acteur Cinéma Chanteur Seven windows orthographe pcc php jdll Slide Application mysql Html twitter python screen curses SVN Android Gphone iPhone OpenGL MindMap Projet Javascrtip Ajax Guitare Tab Tablature JSON firebug Chromium Iphone Titanium music sound android ogg ogv streaming Arkyne svn subversion gnome VLC Tv encoder ffmpeg Cryptage apple microsoft HTML5 Max Apple code youtube quvi git uzbl webgl chromium

  Catalogue professionnel de musique libre


  • twitter entries...
follow me on Twitter

Valid XHTML 1.0 Strict

tumblr visitor