Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-11-2008 12:22:13

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Programmation orientée objet. Classes, méthodes & interfaces !?

Bonjour à tous,

J'ai un peu de mal à comprendre ce que sont les classes abstraites / les méthodes abstraites et pourquoi le Zend Framework en a besoin.

Ce que je sais :

- J'ai bien compris qu'une classe regroupait une famille d'objets dont les caractéristiques (attributs et méthodes) étaient identiques
- L'instanciation représente l'action de créer un objet à partir d'une classe
- L'héritage permet de construire une ou plusieurs classes dérivées qui complètent des classes déjà existantes
- Une classe abstraite est une classe dont toutes les méthodes n'ont pas été implémentées (elle contient donc des méthodes abstraites). Par conséquent cette classe n'est pas instanciable directement, et une classe dérivée d'une classe abstraite implémente obligatoirement les méthodes abstraites de celles-ci.
- Une interface va encore plus loin en proposant des classes qui ne contiennent que des méthodes abstraites.

Si je me réfère au composant Zend_Db sur l'API :

* Zend Db est-ce que c'est aussi une classe ?
* Zend_Db_Adapter_Abstract est une classe abtraite, pourquoi et quelle est l'utilité qu'elle soit abstraite ?
* D'après l'API Zend_Db_Adapter_Pdo_Abstract est également une classe abstraite, mais elle ne contient aucune méthodes abstraites... Ce n'est pas en contradiction avec la définition initiale !?
* Zend_Acl disposes de classes et d'interfaces. Pourquoi dissocier les deux ?


Merci d'avance


aka miboo

Hors ligne

 

#2 21-11-2008 13:15:03

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Programmation orientée objet. Classes, méthodes & interfaces !?

Hello,

Zend_Db est une classe. C'est une Factory ("design pattern factory" sur le net).

Zend_Db_Adapter_Abstract est une classe abstraite car elle n'est pas concrètement liée à une base de données. Elle regroupe des méthodes communes à tout adaptateur concret en décrivant des méthodes abstraites qui devront être concrètement déclaré dans la classe d'adaptateur finale.
Quand ton code utilisera un adaptateur (n'importe lequel), il ne saura pas concrètement lequel il a en face de lui mais saura les méthodes qu'il pourra utilisé.
Par exemple, on sait qu'un adaptateur concret possèdera la méthode _connect(), celle-ci variera en fonction de la base de données.

La classe Zend_Db_Adapter_Pdo_Abstract regroupe des méthodes à tous les adaptateurs de type pdo sans pour autant être concrètement lié à une base de données donc elle reste abstraite.

Il ne faut pas confondre classe Abstraite et Interface (voir aussi sur le net).

A+

Dernière modification par mikaelkael (21-11-2008 13:16:49)


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 21-11-2008 13:42:47

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: Programmation orientée objet. Classes, méthodes & interfaces !?


----
Gruiiik !

Hors ligne

 

#4 21-11-2008 18:39:45

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Programmation orientée objet. Classes, méthodes & interfaces !?

C'est très simple en fait.
si je te dis pour aller à lyon tu prends une voiture, tu passe à la station
tu fait le plein de la voiture et tu file sur l'autoroute
etc.

Tu comprends facilement que tu dois avoir une voiture pour faire cela et que la voiture de mon discours ne te perpétra pas d'aller à lyon.

bref pour mettre en place la procédure aller à lyon j'ai besoin d'une voiture. mas matérielle, juste la notion de voiture. une voiture abstraite.

si je te donne la procédure. il te suffit de trouver une vrai voiture une voiture concrète pour pouvoir aller à lyon.

dans ZF c'est la même chose. il a par fois besoin d'une notion au sens large pour définir son algorithme mais il lui faudra une vrai instance de la chose pour la mettre en œuvre.

c'est le cas par exemple l'accès à la base. pour pouvoir fonctionner il lui faut un objet qui représente l'accès à la base. peu importe comment il fonctionne peut importe quelle base. il suffit qu'il remplisse un certain nombre de critères (API)
pour définir ces critères de façon générale on vas utiliser une classe abstraite Zend_DB_Adapter_Abstract.

tout objets qui sera un Zend_DB_Adapter_Abstract sera utilisable pour accéder à une base de donnée. j'ai donc tout ce qu'il faut pour construire mes objet utilisant une base.

mais si je ne fait pas une vrai classe qui sais se connecter à une vrai base ça ne fonctionnera pas.
On va donc faire des classes dérivées qui elle seront concrètes. comme ce sont des classe dérivées. elle aurons obligation d'implémenter toutes les méthodes abstraites.

de cette façon les classe qui utilisent Zend_DB_Adapter_Abstract pourront utiliser ces classes concrètes.

ainsi un ensemble d'objet peut utiliser un adaptateur pour se connecter à une base sans avoir à savoir quel type de base. pour que le système fonctionne avec de nouvelle base il suffit d'ajouter des adaptateurs.

On pourrait très bien utiliser un classe concrète. (imagine qu'à chaque fois qu'on te fourni un manuel d'entretien automobile tu te retrouve avec tous les vrais outils toutes les vrais pièce et la vrai voiture, le marché des manuel serait une vrai galère)

bref on pourrait avoir un Zend_Db_Adpater concret donc dont tous nos adapter spécifique à un type de base dérive. ça marcherait de la même façon.
sauf que rien n'empêche de créer un objet de cette classe et de l'utiliser pour se connecter
Mais à quoi vu que cette classe ne connait aucun moteur ?
là à la rigueur ça demande un peut de vigilance.
Mais si elle est concrète elle vas avoir toute les méthode qui ne feront rien ou n'importe quoi.
que se passerait-il si une classe dérivée n'implémentait pas une de ces méthodes ?

ce serait vite la cata.
Les classes abstraite vont donc permettre de rendre du code très générique et de maitriser les classes concrètes qui en dérive.

pour les interface c'est un peut différent.
dans les système objet à base de classes il peut être intéressent de définir de l'héritage multiple.

par exemple j'ai une classe feuille de calcul qui me fourni une multitude de méthode de calcul sur des grille de données.
j'ai d'un autre côté une superbe classe document qui sait faire de belle impression
pour faire une facture il est très simple de voir qu'avec un double héritage je vais facilement construite ma classe facture.

une facture est bien une feuille de calcul bien présenté et imprimable.

mais voilà c'est plutôt difficile à mettre en œuvre l'héritage multiple. l'héritage simple suffit souvent.

alors comment faire ?

on constate que dans de très nombreux cas ou l'héritage multiple semble être la seule issue on a en fait un héritage concret et un héritage abstrait.

essayez d'imaginer la complexité de ma classe document ci-dessus si elle est concrète. il faut qu'elle sache mettre en forme quasiment tout type de document....

en fait c'est typiquement c'est une classe abstraite dont de nombreux type de document dérive et implémente les méthodes.

ma classe facture dérive donc d'une classe concrète feuille de calcul et d'une classe abstraite document. c'est très souvent le cas.

dans ce cas là ont peut s'en tirer avec un héritage simple. il suffit de prendre pour convention qu'on n'a pas de classe document mais que toutes les classes qui voudront se comporter comme telle devront implémenter un ensemble de méthodes.

ce contrat que l'on définit ainsi s'appelle une interface. ma classe facture va donc dériver de feuille de calcull et s'engage à implémenter le contrat d'interface des document.

Une classe manipulant les document sera donc en mesure de l'utiliser.

A+JYT

Hors ligne

 

#5 28-11-2008 12:24:49

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: Programmation orientée objet. Classes, méthodes & interfaces !?

J'apporte ma modeste pierre à ce post, à l'attention particulièrement des novices en POO :

* les classes abstraites, comme les interfaces (ou presque), n'apportent *aucune* focntionnalités supplémentaires aux classes
* plus exactement, elles en retirent...

Je m'explique (brièvement) :

Dans les deux cas, classes abstraites ou interfaces, on ne fera qu'orienter le développeur dans l'élaboration d'une classe "concrète" (terme non-technique - on devrait simplement parler de classe), en lui imposant l'implémentation de certaines méthodes.

En résumé, les classes abstraites comme les interfaces ne servent qu'à forcer l'architecture des classes qui seront utilisées dans un projet.

Petite illustration, parallèle à Zend_Db :

Si tu écris à un endroit une fonction ou méthode fetchAll() par exemple qui attend un objet en paramètre (un Db_Adapter), et que sur cet objet tu dois toujours pouvoir exécuter une méthode donnée (query()), mais qu'en même temps tu veux te laisser la possibilité d'utiliser différents type d'objet en entrée (un Db_Adapter par moteur de BDD), alors tu vas faire comme suit :

* définir une interface ou une classe abstraite qui définit la signature de query($sql)
* forcer le type du paramètre de ta méthode fetchAll d'après le nom de ton interfac/class abstraite  => fetchAll(Db_Adapter $adapter)
* créer différents adapteurs qui implémentent l'interface (ou étendent la classe abstraite), et qui implémentent également la méthode query()

Ainsi, il sera impossible de passer à fetchAll() un objet qui ne dispose pas d'une méthode query($sql).

Super c'est super, non ?? smile

Mais en conclusion, tu aurais pu atteindre le même résultat avec des classes "normales". Tu aurais simplement dû effectuer toi-même les tests de compatibilité des objets passés à fetchAll (présence d'une méthode query($sql)), ce qui n'est pas aisé.

Le recours aux classes abstraites et interfaces et particulièrement important lorsque l'on travaille en équipe sur un même projet. Cela permet de rendre les composants cohérents plus aisément.


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

Hors ligne

 

#6 11-12-2008 16:34:20

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Programmation orientée objet. Classes, méthodes & interfaces !?

Bon, je n'ai pas pu répondre avant parce que je suis pas mal débordé en ce moment. J'ai tout lu et certains points se sont éclaircis smile
Je vais compléter vos explications et exemples avec les annexes du bouquin de Julien mais aussi de Guillaume sur le ZF :p

Merci à tous pour vos réponses, je ne m'attendais pas à tant de détails. Vraiment merci.

Dernière modification par miboo (11-12-2008 17:49:09)


aka miboo

Hors ligne

 

#7 11-12-2008 17:48:33

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: Programmation orientée objet. Classes, méthodes & interfaces !?

Pas de soucis pour les détails, c'est à ça que sert le forum, non ?

N'hésite pas si tu veux d'autres infos.

Ah, j'allais oublier :

les annexes du bouquin de Julien sur le ZF

de Julien ET Guillaume wink

Dernière modification par gauthier (11-12-2008 17:50:23)


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

Hors ligne

 

#8 11-12-2008 17:49:35

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Programmation orientée objet. Classes, méthodes & interfaces !?

gauthier a écrit:

les annexes du bouquin de Julien sur le ZF

de Julien ET Guillaume wink

Bah quoi c'est ce que j'ai mis !? yikes



big_smile


aka miboo

Hors ligne

 

#9 11-12-2008 17:51:03

gauthier
Membre
Date d'inscription: 30-09-2008
Messages: 116
Site web

Re: Programmation orientée objet. Classes, méthodes & interfaces !?

ah oui tiens, au temps pour moi, c'est mon copier/coller qui a du déconner wink


Consultant Zend Technologies // Blog perso : Logiciel libre et développement web -- http://freeblogware.org

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages