6. Modules, namespaces et organisation du projet
Sections
Réglages de lecture
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
Code et termes techniques en anglais
Désactivé : la voix de la page lit tout, sans pause entre deux voix.
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
D’autres voix : Microsoft Edge propose des voix naturelles en ligne, et Windows (Paramètres › Heure et langue › Voix), macOS et Android en installent d’autres.
Un namespace donne un nom .NET qualifié aux types. Un module regroupe valeurs, fonctions et types. Là où C# utilise souvent une classe statique, F# utilise un module.
Références officielles : namespaces, modules, contrôle d’accès et fichiers de signature.
Modules imbriqués
Section intitulée « Modules imbriqués »Extrait de l06_modules.fsx :
module Music = module Pitch = let private normalize pitchClass = ((pitchClass % 12) + 12) % 12
let name pitchClass = [| "C"; "C#"; "D"; "Eb"; "E"; "F"; "F#"; "G"; "Ab"; "A"; "Bb"; "B" |] |> Array.item (normalize pitchClass)normalize n’est visible que dans Pitch ; Music.Pitch.name est public. internal expose un membre à l’assembly courant, mais pas aux consommateurs. Choisis la visibilité la plus étroite permettant de tester le comportement public.
Namespace ou module ?
Section intitulée « Namespace ou module ? »namespace GuitarAlchemist.Theory
module Pitch = let name pitchClass = ...
type Chord(root: int) = member _.Root = rootUn namespace ne peut pas contenir directement de bindings let. Un fichier entier peut commencer par module GuitarAlchemist.Theory.Pitch.
L’ordre des fichiers est l’ordre des dépendances
Section intitulée « L’ordre des fichiers est l’ordre des dépendances »F# compile les fichiers de haut en bas. Un fichier utilise les définitions listées avant lui, jamais celles qui suivent.
<ItemGroup> <Compile Include="Domain.fs" /> <Compile Include="Parser.fs" /> <Compile Include="Program.fs" /></ItemGroup>Cela rend la direction des dépendances visible et empêche les cycles accidentels.
Fichiers de signature
Section intitulée « Fichiers de signature »Un .fsi précède son .fs et déclare la surface publique :
module GuitarAlchemist.Theory.Pitch
val name: pitchClass: int -> stringL’implémentation peut garder d’autres helpers invisibles. Les signatures sont utiles aux frontières stables d’une bibliothèque, mais coûteuses lorsque tous les détails internes évoluent ; ne les ajoute pas mécaniquement partout.
Exercice
Section intitulée « Exercice »Sépare le script en Pitch.fs, Chord.fs et Program.fs, dans cet ordre. Ajoute Pitch.fsi qui n’expose que name, puis vérifie qu’un appel à normalize depuis Program.fs échoue à la compilation.
Continue avec les erreurs et Result.