Comment bien structurer son code?

Bonjour à tous,

En codant, je me rends compte qu’il y a beaucoup de “copier/coller” pour certaines fonctions et je cherche un moyen pour éviter ce copier coller (si un jour je dois modifier quelque chose, je devrais le faire partout! :o)

Un exemple:
J’ai une classe “Personne” (avec REALM pour le stockage), et deux autres ViewController: AjouterPersonneViewController et PersonnesViewController.
Pour chacun de ces deux ViewControllers, j’ai besoin de récupérer toutes les personnes de la classe “Personne”, donc, au départ, j’ai fais une méthode “getPersonnes” que j’ai mis dans AjouterPersonneViewController ET PersonnesViewController, mais donc, il y a duplication de code…

Comment puis-je faire pour éviter cette duplication? Mettre la méthode “getPersonnes” dans la classe “Personne”? Probablement, mais avec REALM, comment le faire? Pour que cette méthode soit accessible facilement dans mes autres ViewController?

Et de manière plus générale, comment bien structurer son code?
Par exemple, si on a des constantes que l’on utilise dans toutes l’application, où les déclarer? Ou mettre les méthodes génériques?

Je me pose toutes ces questions pour essayer d’avoir un code maintenable dans la durée malgré tous les changements qui peuvent survenir…

Un grand merci d’avance,

Bonne soirée,

Alexandre

Bonsoir Alexandre,

C’est une excellente question et il n’y a pas de réponse toute prête :slight_smile:
En fait tu fais référence à ce qu’on appelle la conception : comment organiser mon code de la façon la plus efficace possible.
Une fois que l’on sait programmer, on se rend compte que les applications que l’on développe deviennent de plus en plus complexes et de moins en moins maintenables.
J’ai passé d’innombrables heures de cours (en tant qu’étudiant) sur ce thème et pourtant quand je revois le code que je faisais en sortie d’école, je ne le supporte plus. La vrai réponse c’est qu’il n’y a rien de mieux que l’expérience si tu parviens à tirer des leçons de tes erreurs.
Par exemple dans ton cas la leçon est la suivante : ne fait rien de complexe dans tes contrôleurs graphiques. Ils sont éphémères et doivent se baser sur des contrôleurs plus stables.
Quand on débute et qu’on lit ça, on ne comprend pas vraiment pourquoi. Mais quand on a fait des dizaines de contrôleurs on se rend compte qu’ils deviennent souvent trop complexe avec le temps. Ma solution personnelle est de créer des contrôleurs de données : ils ne doivent absolument pas connaître l’interface graphique et se contentent de manipuler tes objets métier. Dans ton cas je créerais une classe PersonManager qui serait responsable de gérer la liste des personnes (ajouts, suppressions, get, etc).
Ta fonction serait donc là dedans. Et tes contrôleurs graphiques ne font que recevoir des événements depuis les vues (boutons, champs texte, etc) et demandent à tes manager de faire tout le boulot. Quand le manager a terminé le boulot, le contrôleur graphique transmet l’info finale à des vues.

Avec l’expérience tu verras de plus en plus naturellement quelles responsabilité affecter à chaque classe/objet. Mais il te faudra faire des erreurs pour que ça vienne :slight_smile:

Tu peux aussi regarder ce qu’on appelle les design patterns pour te donner quelques idées toutes prêtes de conception logicielle.

Bonjour @mbritto et tout le monde,

Merci pour cette réponse complète! :slight_smile:

J’ai un peu regardé au niveau des Design Patterns pour savoir un peu ce qu’il existe. J’ai vu qu’il y avait notamment le modèle MVC que j’ai l’habitude d’utiliser pour du PHP par exemple, et il y a aussi le Singleton (tu en avais parlé pour ajouter des thèmes dans une application (question/réponses Udemy) ).

J’ai regardé pour faire soit un Singleton, soit une classe (pour PesonManager), mais je me pose quelques questions:

Pour le Singleton:
Quand je veux accéder à une fonction/attribut d’un Singleton, je dois utiliser la syntaxe suivante:
nomClasseSingleton.instance.proprieteCalculee
En fait, cela me parait un peu “lourd”, dans le sens où, pour chaque Singleton, je ne peux utiliser qu’une seule instance (définie par: “static let instance: NomClasse = NomClasse()”).
Existe-t’il une autre possibilité?
Ou, peut-on avoir plusieurs “instances” (pas plusieurs instance du Singleton, puisque c’est le but d’un Singleton), mais par exemple:
pour faire:

  • nomClasseSingleton.nomInstance1.fonction1
  • nomClasseSingleton.nomInstance2.fonction2
    où le nomClasseSingleton est le même dans les deux cas, mais en fonction de l’instance que l’on met (nomInstance1 ou nomInstance2), on a accès à des propriétés différentes?
    Je ne sais pas si c’est clair, si pas, hésitez pas à me le dire, je vous fournirait un exemple plus complet avec plaisir! :slight_smile:

Pour la classe:
Si je fais une classe (par exemple: PersonManager), alors si je veux accéder à une fonction (par exemple: getPersonnes()), alors je dois faire: PersonManager().getPersonnes(), est-ce que la syntaxe est correcte, ou bien existe-t’il une meilleur façon de le faire?

Merci d’avance pour vos réponses,

Alexandre.