2017-06-03 1 views
1

Quelle est la convention pour organiser les interfaces et leurs implémentations dans un projet Go?Quelle est la convention pour organiser les interfaces et leurs implémentations dans un projet Go?

Je suis nouveau aller et la création d'un petit projet, j'ai actuellement cette structure de dossier:

src/ 
    my-repo/ 
     solve/ 
      backtracksolve.go 
      permutatesolve.go 
      ... 
      solver.go 

... (some repositories and packages omitted for brevity) ... 

backtracksolve et permutatesolve à la fois implémenter l'interface solver il logique de les garder dans le même paquet que le interface et autres implémentations de cette interface, venant de Java/C# c'est une convention commune par exemple, java.util contient des interfaces telles que Set, Map, List, tout en ayant également des implémentations telles que HashSet, HashMap et ArrayList.

Toutefois, dans Go, car ils implémentent tous les deux un func Solve() et les deux dans le package solve il y a redeclared exception.

Est-ce la convention de créer un sous-répertoire pour chaque implémentation (ci-dessous) ou quelque chose de complètement différent?

src/ 
    my-repo/ 
     solve/ 
      backtrack/ 
       backtracksolve.go 
      permutation/ 
       permutatesolve.go 

      solver.go 
+1

Peut-être que vous voulez créer deux types 'BacktrackSolver' et' PermuteSolver' qui ont tous deux la méthode 'Solve()'. Cela aiderait contre le conflit de nom. – md2perpe

Répondre

1

Vous définiriez généralement différents types qui mettent en œuvre l'interface Solver puis définir la fonction Solve sur ces types. Comme les types ont des noms distincts, il n'y a pas de conflit de noms. Vous pouvez l'essayer en ligne en the go playground. À propos de la question relative à votre convention de forfait: Je pense qu'une bonne approche consiste à commencer avec tout le code dans un seul paquet et à n'exporter que les types et les fonctions que vous souhaitez réellement exposer à vos appelants. Ensuite, plus tard, quand vous perdrez code cohesion, vous devriez commencer à diviser le code en plusieurs paquets.

Jetez également un coup d'œil à l'article "Organizing Go code" du go blog, sous-section "Que mettre dans un paquet" (lecture courte).