Conseils de structuration
Exporter au plus haut niveau possible
Les utilisateurs de votre module devraient avoir le moins de frictions possible lors de l'utilisation des éléments que vous exportez.
Ajouter trop de niveaux d'imbrication a tendance à être fastidieux.
Réfléchissez bien à la manière dont vous voulez structurer les choses.
L'exportation d'un espace de noms à partir de votre module est un exemple d'ajouter trop de couches d'imbrication.
Bien que les espaces de noms aient parfois leur utilité, ils ajoutent un niveau supplémentaire d'indirection lors de l'utilisation de modules.
Cela peut rapidement devenir un problème pour les utilisateurs et est généralement inutile.
Les méthodes statiques sur une classe exportée ont un problème similaire: la classe elle-même ajoute une couche d'imbrication.
à moins d'augmenter l'expressivité ou l'intention de manière clairement utile, envisagez simplement d'exporter une fonction d'aide.
Si vous n'exportez qu'une class
ou plusieurs function
, utilisez export default
Tout comme "exporter au plus haut niveau" réduit les frictions sur les consommateurs de votre module, il en va de même pour une exportation par défaut.
Si l'objectif principal d'un module est de stocker une exportation spécifique, vous devez envisager de l'exporter en tant qu'exportation par défaut.
Cela facilite à la fois l'importation et l'utilisation de l'importation.
Par exemple :
MyClass.ts
MyFunc.ts
Consommateurs
C'est optimal pour les consommateurs.
Ils peuvent nommer votre type comme ils veulent (
t
dans ce cas) et n'ont pas besoin de faire un point excessif pour trouver vos objets.
Si vous exportez plusieurs objets, mettez-les tous au plus haut niveau.
MyThings.ts
Inversement lors de l'importation :
Liste explicite des noms importés
Consommateurs
Utilisez le modèle d'importation d'espace de noms si vous importez un grand nombre d'éléments.
MyLargeModule.ts
Consommateurs
Réexporter pour étendre
Vous aurez souvent besoin d'étendre les fonctionnalités d'un module. Un modèle
JS
courant consiste à compléter l'objet d'origine avec des extensions,
de la même manière que les extensions
JQuery
. Comme nous l'avons mentionné précédemment, les modules ne fusionnent pas comme le feraient des objets
d'espace de noms global. La solution recommandée consiste à ne pas muter l'objet d'origine, mais à exporter une nouvelle entité fournissant la nouvelle fonctionnalité.
Prenons une implémentation simple de la calculatrice définie dans le module
Calculator.ts
. Le module exporte également une fonction d'assistance
pour tester la fonctionnalité de la calculatrice en passant une liste de chaînes d'entrée et en écrivant le résultat à la fin.
Calculatrice.ts
Voici un test simple pour la calculatrice utilisant la fonction
test
exposée .
TestCalculator.ts
Maintenant, pour étendre ceci pour ajouter un support pour la saisie avec des nombres dans des bases autres que 10, créons
ProgrammerCalculator.ts
ProgrammerCalculator.ts
Le nouveau module
ProgrammerCalculator
exporte une forme d'API similaire à celle du module
Calculator
d'origine , mais n'augmente aucun objet du module d'origine.
Voici un test pour notre classe
ProgrammerCalculator
:
TestProgrammerCalculator.ts
Ne pas utiliser les espaces de noms dans les modules
Lors du passage à une organisation basée sur des modules, une tendance commune consiste à intégrer les exportations dans une couche d'espaces de noms supplémentaire.
Les modules ont leur propre portée et seules les déclarations exportées sont visibles de l'extérieur du module. En gardant cela à l'esprit,
l'espace de noms n'apporte que très peu, voire aucune, valeur lorsqu'on travaille avec des modules.
Sur le plan organisationnel, les espaces de noms sont pratiques pour regrouper des objets et des types liés de manière logique dans la portée globale.
Par exemple, en
C#
, vous allez trouver tous les types de collection dans
System.Collections
. En organisant nos types dans des espaces de noms hiérarchiques,
nous fournissons une bonne expérience de "découverte" aux utilisateurs de ces types. Les modules, en revanche, sont déjà nécessairement présents dans un système de fichiers.
Nous devons les résoudre par chemin et nom de fichier. Il existe donc un schéma d'organisation logique à utiliser.
Nous pouvons avoir un dossier / collections / generic / avec un module de liste.
Les espaces de noms sont importants pour éviter de nommer des collisions dans la portée globale.
Par exemple, vous pourriez avoir
My.Application.Customer.AddForm
et
My.Application.Order.AddForm
- deux types avec le même nom, mais un espace de noms différent.
Ceci, cependant, n'est pas un problème avec les modules. Dans un module, il n'y a aucune raison plausible d'avoir deux objets portant le même nom. Du côté de la
consommation, le consommateur d'un module donné doit choisir le nom qu'il utilisera pour faire référence au module, de sorte que les conflits
de noms accidentels sont impossibles.
Remarque : Pour plus d'informations sur les modules et les espaces de noms, voir Espaces de noms et modules.
Drapeaux rouges
Tous les éléments suivants sont des drapeaux rouges pour la structuration du module.
Vérifiez deux fois que vous n'essayez pas de nommer vos modules externes dans l'espace de noms si l'un de ces cas s'applique à vos fichiers :
- Un fichier dont la seule déclaration de niveau supérieur est export namespace
Foo { ... }
(supprime Foo
et déplace tout ce qui est "élevé" d'un niveau)
- Un fichier qui a un seul
export class
ou export function
(envisager d'utiliser export default
)
- Plusieurs fichiers ayant les mêmes
export namespace Foo {
au plus haut niveau (ne pensez pas qu'ils vont se combiner en un Foo
!)