Utiliser la POO dans les thèmes

36

Je vois beaucoup de plugins qui utilisent le codage orienté objet quand ce n'est pas vraiment nécessaire.

Mais ce qui est encore pire, c’est que les développeurs de thèmes commencent à faire la même chose. Les thèmes commerciaux et les thèmes populaires gratuits tels que Suffusion, même mon thème préféré - Hybride, englobent toutes leurs fonctions dans une classe, l'instancient une fois dans functions.php et l'exécutent de manière procédurale :)

Wtf? Quel est le point de faire cela? Évidemment, vous n'utiliserez pas deux instances ou plus du même thème, en même temps.

Supposons que les plugins le font pour l'espace de noms (ce qui est ridicule), mais quel est le prétexte du thème? Est-ce que je manque quelque chose?

Quel est l'avantage de coder un thème comme celui-ci?

onetrickpony
la source
5
@Ambitious Amoeba - Pouvez-vous expliquer pourquoi vous pensez qu'il est ridicule d'utiliser des classes pour les plugins pour minimiser les collisions entre espaces de noms? En ce qui concerne les thèmes, il serait peut-être utile que vous donniez des exemples de ce que vous considérez comme un bon code dans les thèmes et de ce que vous considérez comme inutile. Discuter de cette question dans l’abstrait n’a aucune chance de vous donner une idée, ni celle d’autres, en particulier d’autres qui ne savent pas à quoi vous faites référence.
MikeSchinkel
1
J'utilise des cours partout où je peux personnellement, c'est beaucoup plus facile pour moi de maintenir, mettre à jour et réutiliser. Hormis les préférences personnelles, quelles sont les bonnes raisons d’utiliser une classe?
t31os
1
Bizarre, je viens de perdre mon commentaire original (bug SE peut-être?) .. Je le répète cependant, quelles sont les bonnes raisons pour ne pas utiliser un cours?
t31os
2
@MikeSchinkel: vous pouvez le faire en ajoutant un préfixe au nom de la fonction. Je ne pense pas que cela mérite la surcharge de la classe supplémentaire d'avoir juste de bons noms de fonctions. Quoi qu'il en soit, je suis curieux de savoir pourquoi les thèmes le font, pas tant que ça sur les plugins
onetrickpony
4
@Ambitious Amoeba - Je vais certainement vous dire que vous avez le droit à votre opinion, mais mon opinion est différente. Je pense que la clarté que les classes apportent au code en minimisant les fonctions flottantes dans l'espace de noms global vaut ce que je considère être une quantité supplémentaire inestimable de temps système, en particulier lorsque vous utilisez un IDE de niveau professionnel tel que PhpStorm. Et les classes créent une unité autonome de sorte que le développeur puisse savoir le code requis par un module. Et enfin, après avoir développé mon style de plugin WordPress pour utiliser des classes, toute autre méthode me semble être du codage bâclé.
MikeSchinkel

Réponses:

26

Je peux comprendre votre confusion à partir de l'exemple que vous avez fourni. C'est vraiment une mauvaise façon d'utiliser une classe ... et ce n'est pas parce qu'une classe est utilisée que le système fonctionne.

Dans le cas d'Hybrid, ils utilisent simplement une classe pour nommer leurs fonctions dans l'espace de noms. Considérant que Hybrid est un framework de thèmes , ceci est fait pour que les thèmes enfants puissent réutiliser des noms de fonctions sans que le développeur ait à se soucier de la collision de noms. Dans de nombreux cas, un cadre de thème (thème parent) est si complexe que de nombreux développeurs de thèmes enfants ne comprendront jamais exactement ce qui se passe sous le capot.

Si Hybrid n'utilisait pas de structure de classe, les développeurs de thèmes enfants auraient besoin de connaître tous les appels de fonctions existants pour éviter de réutiliser des noms. Et oui, vous pouvez simplement préfixer toutes vos fonctions avec un slug unique, mais cela rend le code difficile à lire, difficile à maintenir et, par nature, non réutilisable si vous développez d'autres systèmes qui souhaitent utiliser les mêmes fonctionnalités.

Pour répondre à vos questions

Wtf? Quel est le point de faire cela? Évidemment, vous n'utiliserez pas deux instances ou plus du même thème, en même temps.

Non, vous n'utiliserez pas deux ou plusieurs instances du même thème. Mais comme je l’ai dit, considérez la structure de classe dans ce cas comme un espacement des noms des fonctions et non la création d’une instance d’objet traditionnelle. Tout regrouper dans une classe et l'instancier à appeler méthodes ( myClass->method();) ou directement à méthodes ( myClass::method();) est une manière très simple de mettre en forme des éléments d'espace de noms de manière lisible et réutilisable.

Bien sûr, vous pouvez toujours utiliser quelque chose comme à la myClass_method();place, mais si vous souhaitez réutiliser l'un de ces codes dans un autre thème, dans un plug-in ou dans un autre cadre, vous devez revenir en arrière et modifier tous vos préfixes. Garder tout dans une classe est plus propre et vous permet de réaménager et de redéployer beaucoup plus rapidement.

Supposons que les plugins le font pour l'espace de noms (ce qui est ridicule), mais quel est le prétexte du thème? Est-ce que je manque quelque chose?

Dans la majorité des situations, je suis d'accord avec vous. Cependant, cette majorité diminue rapidement. J'héberge plusieurs sites sur une installation MultiSite qui utilisent des variantes du même thème. Plutôt que de recréer le même thème, encore et encore, avec des différences mineures, j'ai une seule "classe" pour le thème parent et tous les thèmes enfants étendent cette classe. Cela me permet de définir des fonctionnalités personnalisées pour chaque site tout en maintenant un sentiment général d'uniformité sur l'ensemble du réseau.

D'une part, les développeurs de thèmes peuvent choisir une approche basée sur les classes pour leurs fonctionnalités d'espaces de noms (ce qui n'est pas ridicule si vous travaillez dans un environnement dans lequel vous réutilisez des morceaux du même code, encore et encore). D'autre part, les développeurs de thèmes peuvent choisir une approche basée sur les classes pour une extensibilité facile par thèmes enfants.

Quel est l'avantage de coder un thème comme celui-ci?

Si vous utilisez uniquement Hybrid sur votre site, il y a peu de choses à savoir pour vous, en tant qu'utilisateur final. Si vous construisez un thème enfant pour Hybrid, l’espacement des noms et l’extensibilité présentent des avantages. Si vous travaillez pour ThemeHybrid , l’avantage réside dans la réutilisation rapide et efficace du code dans vos autres projets (Prototype, Leviathan, etc.).

Et si vous êtes un développeur de thème qui aime une fonctionnalité spécifique d'Hybrid mais pas le thème entier, l'avantage réside dans la réutilisation rapide et efficace du code dans votre projet non-Hybrid (en supposant qu'il s'agisse également de la GPL).

EAMann
la source
Je ne suis pas d'accord avec la partie "extensibilité". Vous avez le même niveau de contrôle sur le thème parent que si vous utilisiez des actions et vos fonctions habituelles. Pourquoi? Vous l'avez dit vous-même, ce n'est pas vrai OOP. Je ne suis pas non plus d'accord avec l'espacement des noms - c'est pourquoi j'ai posé cette question à la 1ère place - Essayez de redéfinir n'importe quelle fonction de Hybrid dans n'importe quel plugin et vous verrez que les fonctions vont s'entrechoquer. Pourquoi pensez-vous qu'ils ont encore ajouté les préfixes? :) Vous ne pouvez pas envelopper le thème entier dans une classe, cela n'a aucun sens ...
onetrickpony
Je ne dis pas de ne pas utiliser la POO dans des thèmes, comme certaines personnes ici l'auraient peut-être compris, au contraire (voir 2.8 widgets pour, par exemple, les marcheurs, etc.), mais pas comme cela.
onetrickpony
1
Il semble que vous ayez un problème avec l'implémentation spécifique d'Hybrid, et non avec la pratique consistant à utiliser la POO dans les thèmes ou même à utiliser une classe pour nommer les fonctions définies dans un thème. J'essayais de répondre à vos questions plus larges concernant: pourquoi faire cela? et re: quels sont les avantages de le faire? Je ne vais pas passer de temps à défendre ce qui semble être une implémentation sans enthousiasme ou à vous disputer contre votre animosité évidente envers la structure d'un cadre de thème spécifique. En bout de ligne, si vous n'aimez pas la façon dont Hybrid est construit, utilisez autre chose.
EAMann
1
pas du tout, j'aime hybride (mais pas la classe bien sûr). Hybrid m'a inspiré pour créer mon propre cadre de thème. Prenons un autre exemple, Suffusion, même type de pratique. Encore une fois, les espaces de noms dans ce cas ne fonctionnent pas avec les thèmes, toutes les fonctions de la classe wrapper seront toujours en conflit avec les plugins, car les plugins sont chargés par WP "au sein de" thèmes.
onetrickpony
1
C'est suffisant. Gardez simplement à l'esprit que la plupart des travaux de WP ne sont pas d'abord de la POO (comme ce n'est pas le cas de WP), mais placer des méthodes de thème dans une classe pour imiter la manière dont cela se fait dans un plug-in est au moins un pas dans la droite. direction ... même s’il s’agit d’une classe à moitié conçue et mal mise en œuvre. Je suis tout à fait d’accord pour dire que le fait de tout emballer dans une classe et d’appeler les choses de manière procédurale est un peu étrange (et inutile du point de vue d’un développeur tiers essayant d’utiliser le système). Mais si cela est fait correctement (et en hybride, ce n'est apparemment pas le cas), la classe de votre code functions.phppeut être très puissante.
EAMann
29

La vitesse

Mon thème de base actuel compte 13 classes. Lorsque je construis un nouveau thème, je les utilise tels quels ou je les développe. Ce système rend le processus de construction d’un nouveau thème très, très rapide.

Portées serrées

J'ai rarement besoin de variables globales, car tout ce que mon code doit savoir est caché dans les membres de la classe. Je peux donc partager une variable entre deux filtres ou actions très différentes sans risque de collision avec des plugins mal écrits.

Entretien

Chaque classe est un fichier. Si j'ai besoin de mettre à jour le thème d'un client, il suffit de mettre à jour certains fichiers. Tout ce qui se passe à l'intérieur des classes est à moi tant que je propose la même API.

Un exemple: au-dessus de l' comment_form();appel, j'utilise une action simple:

do_action( 'load_comment_class' );
comment_form();

La classe de commentaires qui sera chargée décide de mon contrôleur. Ce qui se passe exactement à l'intérieur de la classe de commentaires décide de la classe individuelle.

Essayez ceci avec une approche purement procédurale et vous devenez fou. :)

Lisibilité

Il est tellement plus facile de relire et de comprendre votre propre code quelques mois plus tard si vous avez tout séparé par sa tâche.

Quelques exemples de hiérarchies de classes utiles

  • Meta_Box-> prolongé par Shortdesc_Meta_Boxet Simple_Checkbox_Meta_Box-> prolongé parSidebar_Switch
  • User_Profile_Addon-> prolongé par User_Profile_Checkbox(voir question 3255 )
  • Comment_Form -> prolongé par {$theme_name}_Comment_Form
fuxia
la source
1
Avez-vous une chance d'obtenir vos cours "à thème"? Je veux écrire le mien et j'aimerais savoir comment vous le faites.
Horttcore
1
Je n'ai pas encore décidé cela. Peut-être que je réalise un nouveau thème de base avec @bueltge l'année prochaine, qui utilise certaines de ces classes. Très probablement pas avant mars, j'ai bien peur.
fuxia
5
Spécialement pour vos cas, thèmes et frameworks gratuits, la POO est la voie à suivre. D'autres personnes doivent travailler avec ces codes. Les auteurs devraient rendre ce processus aussi simple et flexible que possible. Le remplacement d'une classe est plus facile que le remplacement de 20 fonctions, car une classe bien écrite a une API clairement définie.
fuxia
2
Je ne peux rien dire sur Hybrid; Je ne l'ai jamais utilisé. Mais, oui, un contrôleur qui organise tout derrière les rideaux, propose de bons filtres et insère un motif MVC dans le désordre de thème habituel - est une bonne chose. Ne me fais pas confiance. L'essayer :)
fuxia
3
Il est temps, WordPress a besoin d’un thème POO pour les développeurs; J'espère que nous trouverons le temps nécessaire pour atteindre notre objectif. Ce petit extrait et ses avantages montrent les grandes possibilités offertes par oop pour les thèmes des clients; un moyen rapide de réaliser de nouveaux thèmes et également idéal pour la maintenance.
bueltge
3

Un autre point à considérer: la vitesse.

if ( !class_exists('cccYourClassName') )  
// VERSUS  
if ( !function_exists('ccc_your_function_name') )

Après un bref aperçu / impression, j'ai trouvé ~ 1.700 fonctions internes et ~ 1.400 fonctions utilisateur = ~ 3.100 / 3.200 fonctions VS. ~ 250 classes. Je suppose que cela en dit long sur la quantité de recherche nécessaire. Si vous appelez !function_exists('')environ 50 à 100 fonctions de votre thème, définissez une minuterie et commencez à faire des calculs. Même si ce n'est pas la POO, c'est un bon moyen de créer du code

1) réutilisable
2) maintenable
3) échangeable
4) peu plus vite

Lorsque vous jetez un coup d'œil aux différentes classes flottant sur le Web qui vous aident à créer rapidement des méta-boîtes, des widgets, etc., il est bon d'utiliser un contrôleur comme celui mentionné par @toscho, car vous pouvez simplement brancher des classes et les remplacer. certaines lignes dans le contrôleur qui gère vos classes.

kaiser
la source
2

Certains prétendent que l'encapsulation est le seul (ou du moins le principal avantage) qu'offre la POO, et que l'héritage et l'état se situent entre l'ennui et le mal:

http://obiecte.blogspot.com/2008/09/oop-sucks.html

L'auteur parle davantage de l'utilisation de classes / d'objets en tant que structures que de conteneurs pour des fonctions statiques, mais il est intéressant de lire la question sous un angle complètement différent, à partir de quelqu'un qui se trouve carrément à l'extérieur du camp de la POO.

Je pourrais écrire mon prochain plugin WordPress dans Haskell.

Texas
la source
1
Blog ouvert uniquement aux utilisateurs "invités", malheureusement. Juste un autre rappel pourquoi nous ne devrions jamais publier nos informations sur un service gratuit, mais plutôt héberger nos propres blogs. Facebook est à peu près la même chose à cet égard. Un lien de ressource mis à jour serait bien. FWIW J'ai vu le côté sombre de la programmation orientée objet et ne l'utilisera plus jamais à moins que cela ne soit absolument nécessaire dans le contexte, car les fonctions d'ordre supérieur peuvent généralement étendre les fonctionnalités et aider à réduire le passe-partout et la mauvaise utilisation du classmot clé.
Josh Habdas
2

Oh bien la discussion! Je dois également admettre que j’utilise beaucoup plus souvent les classes pour l’encapsulation. L'idée étant ici que dans mes plugins, je peux envelopper mes fonctions dans une classe et utiliser dans cette classe des noms de méthodes très simples et significatifs qui sont génériques, même parmi les autres plugins que j'écris. Dans ce cas, les classes remplacent les espaces de noms, ce que je suis obligé d'éviter pour les environnements 5.2.x.

Bien que rares soient les cas où la programmation orientée objet est utile pour la modularité, le simple fait de wrapper vos fonctions crée également le bonus supplémentaire de l'extensibilité multi-plug-in. Par exemple, j'ai récemment étendu une solution de facturation basée sur les classes, ce qui m'a permis d'étendre la classe principale, d'ajouter du code supplémentaire à diverses fonctions (w / parent :: call) ou même de remplacer des fonctions, le tout sans internaliser le plugin étendu.

Pour résumer, le retour à la classe n'est généralement qu'un substitut des espaces de noms.

Jester831
la source
-4

Quel est l'intérêt de se plaindre d'un code que vous n'avez pas écrit?

Si vous n'aimez pas le code, écrivez le vôtre!

Simple. Problème résolu.

Les programmeurs aiment faire les choses à leur façon. Donc, ne présumez pas que vous pouvez leur dire comment écrire du code, quel type de whisky boire, quelle marque de cigarette pour fumer ou quelle religion suivre. Ils vont juste déboguer une telle diatribe et continuer à faire ce qu'ils veulent. ;-)

Le code n'est pas de la poésie. Code est une variante de la chanson de Sinatra "My Way" ...

marque
la source
10
Cette question ne se plaint pas du code, elle demande une explication claire de la raison pour laquelle le code serait écrit d'une manière particulière. La majeure partie du noyau de WP est procédurale, avec quelques nouvelles fonctionnalités utilisant une approche POO. De nombreux plug-ins modernes utilisent également la POO pour encapsuler des fonctionnalités. Mais la plupart des thèmes ne le sont pas. Le PO se demandait pourquoi une approche pseudo-POO serait utilisée et a donné l'exemple à Hybrid. Vous ne répondez pas à la question, vous vous déchaînez.
EAMann