L'importance des modèles de conception avec Javascript, NodeJs et al

36

Javascript apparaissant comme le langage de programmation omniprésent sur le Web au cours des prochaines années, de nouvelles infrastructures apparaissent toutes les cinq minutes et la programmation événementielle prend le pas sur les serveurs et les clients:

En tant que développeur Javascript, considérez-vous que les modèles de conception traditionnels sont importants ou moins importants qu’ils ne l’ont été avec d’autres langages / environnements ?.

Veuillez nommer les trois principaux modèles de conception que vous utilisez régulièrement en tant que développeur Javascript et donnez un exemple de la façon dont ils ont contribué à votre développement Javascript.

Lewis
la source
5
Certaines personnes affirment que les modèles de conception (en particulier ceux du GoF) sont des signes de déficience de la langue (voir cette discussion ). Comme JavaScript est de nature prototypique et fonctionnelle, je dirais qu’un autre ensemble de modèles est applicable / utile.
très intéressé par les réponses ... +1 pour la question :)
usoban
2
Le livre JavaScript Patterns de Stoyan Stefanov est une excellente ressource sur de nombreux modèles que vous pouvez utiliser dans JS. Beaucoup d'entre eux existent spécifiquement pour JS, et pour aucune autre langue.
IgorGanapolsky
Javascript a ses propres modèles. En plus du livre mentionné par Igor, il existe également Learning Learning Design Patterns ( Modélisation du design Javascript) d' Addy Osmani , qui est gratuit.
user16764

Réponses:

23

En tant que développeur Javascript, considérez-vous que les modèles de conception traditionnels sont importants ou moins importants qu’ils ne l’ont été avec d’autres langages / environnements ?.

Les modèles de conception classiques ne s'appliquent pas à JavaScript.

Ce qui s’applique, c’est l’écriture de code modulaire et fonctionnel.

Vous devriez utiliser un mélange de constructeurs et de fonctions de première classe.

En tant que développeur JavaScript, je préconise personnellement de traiter JavaScript en tant que LISP plutôt que Java. Essayez donc d’imiter les monades et le code de style fonctionnel de haut niveau plutôt que d’essayer d’imiter le code OOP classique.

Veuillez nommer les trois principaux modèles de conception que vous utilisez régulièrement en tant que développeur Javascript et donnez un exemple de la façon dont ils ont contribué à votre développement Javascript.

Encore une fois, les modèles de conception ne s’appliquent pas vraiment beaucoup, mais vous trouverez ci-dessous trois concepts importants.

  1. Utilisation de fermetures
  2. Utilisation de fonctions de première classe
  3. Utilisation de fabriques d'objets avec ou sans new

Veuillez laisser un type de contexte pour lequel je peux montrer des exemples de ce type de techniques par rapport à la création du même type de code à l'aide de modèles de conception traditionnels.

Jetons un coup d'oeil à quelques-uns des modèles de conception classiques et à la façon de les implémenter dans js ainsi qu'à d'autres modèles plus adaptés à js lui-même:

Modèle d'observateur:

En node.jscela est simplement events.EventEmitter. En jQueryceci est $.fn.bind&& $.fn.trigger. En backbonecela est Backbone.Events.triggeret Backbone.Events.bind. C'est un modèle très courant utilisé dans le code au jour le jour.

Je ne m'arrête jamais et pense "Hey, j'utilise un motif d'observateur ici!". Non, il s'agit simplement d'un moyen de bas niveau de faire passer des messages ou d'un moyen de changer en cascade.

Par exemple, dans le réseau principal, toutes les vues MVC sont liées à l' onchangeévénement models. Ainsi , si vous modifiez le modèle, toutes les modifications apportées à la vue sont automatiquement répercutées. Oui, il s’agit d’un modèle puissant, mais son utilisation est si courante dans la programmation événementielle qu’elle ne réalisait pas qu’elle l’utilisait partout.

Dans le WebSocketprotocole que nous avons, .onnous utilisons pour nous lier aux on("message", ...événements. Encore une fois, c'est très courant, mais c'est un observateur sur un flux plutôt que votre POO classique while (byte b = Stream.ReadNextByte()).

Ce sont toutes des utilisations puissantes du modèle Observer. Mais ce n'est pas un motif que vous utilisez. Ceci est une partie simple de la langue. Ceci est juste du code.

Mémento Pattern:

Ceci est simplement JSON. Il vous permet de sérialiser l'état d'un objet afin de pouvoir annuler une action.

function SomeObject() {
    var internalState;

    this.toJSON = function() {
        return internalState;
    }

    this.set = function(data) {
        internalState = data;
    }

    this.restore = function(json) {
        internalState = JSON.parse(json);
    }
}

var o = new SomeObject();
o.set("foo"); // foo
var memento = JSON.stringify(o);
o.set("bar"); // bar
o.restore(memento);

En JavaScript, nous supportons nativement une API pour les souvenirs. Il suffit de définir une méthode appelée toJSONsur n'importe quel objet. Lorsque vous appelez, JSON.stringifyil appelle en interne .toJSONvotre objet pour obtenir les données réelles que vous souhaitez sérialiser en JSON.

Cela vous permet de créer des instantanés de votre code de manière triviale.

Encore une fois, je ne réalise pas que ceci est un motif de souvenir. Il s’agit simplement d’utiliser l’outil de sérialisation JSON.

Modèle d'état / modèle de stratégie:

Vous n'avez pas besoin d'un modèle d'état. Vous avez des fonctions de première classe et des types dynamiques. Il suffit d’injecter des fonctions ou de modifier les propriétés à la volée.

Raynos
la source
Raynos, bonne réponse. En ce qui concerne les exemples, je pensais plus au niveau conceptuel. Par exemple: "un modèle d'observateur a aidé dans la situation ..."
@ Lewis choisit quelques modèles de design que vous aimez et j'essaierai de suggérer des alternatives fonctionnelles plus appropriées plus tard.
Raynos
L'approche de l'effort et la réponse sont brillants Raynos. Merci.
Lewis
@Lewis J'ai essayé de regarder quelques autres, mais je me suis retrouvé perplexe, car ils sont tous conçus pour les langages OO classiques. Si vous souhaitez que je vérifie d'autres motifs de conception, faites-le moi savoir.
Raynos
Vous avez oublié le motif Prototype - javascript, dit stupide, n'a même pas de
problème
10

Prenez cette réponse comme un avis subjectif.

En tant que développeur Javascript, considérez-vous que les modèles de conception traditionnels sont importants ou moins importants qu’ils ne l’ont été avec d’autres langages / environnements?

Si vous parlez de modèles de conception traditionnels tels que Gang of Four , la plupart des techniques sont agnostiques en langage / plate-forme, telles que "Programmer une interface, pas une implémentation" ou "Favoriser la composition d'objet par rapport à l'héritage de classe" et revêtent une importance égale pour les développeurs JavaScript.

Des modèles plus spécifiques tels que création, structure et comportement peuvent ou ne doivent pas nécessairement être utilisés de la même manière ou aussi fréquemment que dans d'autres langues, car les fonctionnalités de la langue peuvent affecter grandement leur utilisation. Certaines langues (JavaScript inclus) ont donc leurs propres modèles de conception basés sur la fonctionnalité ou le sucre syntaxique qu’elles offrent.

En général, je dirais que les modèles de conception traditionnels sont aussi importants que dans d'autres langues, mais les modèles spécifiques à JavaScript sont plus importants que les modèles traditionnels.

Nommez les trois modèles de conception que vous utilisez régulièrement en tant que développeur Javascript et donnez un exemple de la manière dont ils ont contribué à votre développement Javascript.

Parmi les modèles de conception JavaScript essentiels, j'utilise principalement ceux-ci:

1. Modèle de constructeur (avec prototypes)

Particulièrement côté serveur lors de l’écriture de choses dans node.js, car il est bien adapté à l’écriture de modules bien qu’il manque une encapsulation native. En outre, il est populaire pour de nombreux autres développeurs si vous parcourez les référentiels sur GitHub. Par conséquent, la connaissance de ce modèle peut vous aider à mieux comprendre les autres codes.

2. Modèle de module révélateur

Offre une modularité avec encapsulation.

3. Modèle DRY

Ceci est plutôt spécifique à un scénario, bien que tous les développeurs devraient l’utiliser autant que possible.

yojimbo87
la source
Merci! Bonne réponse et le genre de réponse que j'espérais. Bien que la question puisse être considérée comme subjective, une bonne réponse comme celle-ci suggère qu'il existe une réponse appropriée. Attendra plus de réponses avant de «signer».
2

Les modèles de conception sont enseignés dans les classes de conception pour CS. Elles ne sont pas essentielles, mais très utiles si vous pouvez trouver des situations analogues pour trouver une solution réfléchie.

Cela permet également aux programmeurs de communiquer plus facilement. Vous pouvez également parler à votre collègue des modèles. Si vous dites ici que j’ai mon Observateur, alors on comprend assez bien ce qui se passe.

Les gens vont naturellement proposer des solutions qui s’intègrent dans un modèle de conception, mais ces derniers permettent de définir une terminologie et des idées standard qui peuvent être utiles.

Il n’ya rien de particulièrement remarquable en ce qui concerne les modèles. Le plus gentil, c’est que ce sont des idées qui sont canonisées et définies de manière toujours utile.

autocollants personnalisés
la source
1

En tant que développeur Javascript, considérez-vous que les modèles de conception traditionnels sont importants ou moins importants?

Ils sont vitaux.

En effet, les concepts de solutions réutilisables peuvent transcender le langage. - Modifications de la syntaxe - Modifications de la mise en œuvre - La notion de modèle existe toujours.

Les développeurs de toutes les langues peuvent apprendre le JS avancé en apprenant des modèles plutôt que la syntaxe. Ceux qui ne le savent pas manquent.

Veuillez nommer les trois principaux modèles de conception que vous utilisez régulièrement en tant que développeur Javascript.

Il existe des schémas fréquemment utilisés contre lesquels certains pourraient "argumenter". Cependant, ils sont intéressants à connaître car ils sont extrêmement courants et puissants dans les systèmes de stockage avancés avancés.

1- Namespace - encapsulez votre code dans un objet.

var x = (fonction () {}) ();

2- ObjectConfiguration, modèle de type usine. -Passer un objet à une fonction, pas un tas de vars.

var produit = usine ({});

3- Fonction de rappel. - Passer une fonction en tant que paramètre, à appeler une fois la tâche terminée.

function longTask (function () {// m'appelle quand c'est fait});

Comme je l'ai dit, certains pourraient dire que ce ne sont pas des schémas, mais ils sont très courants et très puissants, et il convient de les mentionner car ce sont en effet des solutions réutilisables très utiles à des problèmes communs. Quelle est la définition du motif de conception.

Excellente question.

J'espère que ça t'as aidé.

Jack Stone
la source