1
votes

Constructeurs avec trop de paramètres

Sans trop en dire, je crée un objet qui a 9 attributs. Prenons un RPG par exemple.

force de flottement, constitution, courage, dextérité, intelligence, charisme, sagesse, volonté, perception;

Étant donné que l'objet est appelé joueur , le constructeur de

public Player(float strength, float constitution, float fortitude, float dexterity, 
float intelligence, float charisma, float wisdom, float willpower, float perception){}

Selon SonarLint: "Constructor a 9 paramètres, ce qui est supérieur à 7 autorisés."

Bien que je sache que SonarLint dit que cela n'arrêtera pas le code de fonctionner réellement, s'il existe une manière "appropriée" de gérer ces situations , J'aimerais beaucoup le savoir!

Merci

Ps, si ce n'est pas le bon forum pour une telle question, veuillez me diriger vers le bon!

p>


3 commentaires

stackoverflow.com/questions/58060511/…


Merci pour les réponses à ce jour. Je vais chercher le modèle Builder et 'EnumMaps' comme suggéré. Après avoir décidé celle qui convient le mieux à ma situation, j'accepterai la meilleure réponse!


Si vous n'utilisez pas de EnumMap , vous le regretterez lorsque vous commencerez à ajouter plus de fonctionnalités à cette classe.


4 Réponses :


1
votes

Essayez d'utiliser Builder Pattern, cette méthode est très bonne pour les classes avec plus de 4 paramètres.


0 commentaires

1
votes

Idéalement, vous diviseriez la classe en unités plus petites et composeriez.

Dans ce cas, comme ils semblent tous être du même genre de chose, une Map (en particulier EnumMap ) semble être approprié.

En dernier recours, il y a le modèle Builder.

 Player player = Player.builder()
     .strength(       )
     .constitution(   )
     // ...
     .perception(     );


1 commentaires

Un EnumMap est la meilleure solution dans ce cas particulier.



0
votes

Essayez le modèle de générateur

final class Player {
  private final float strength;

  ...

  static final class Builder {
    private float strength;

    ...

    Builder setStrength(float strength) {
      this.strength = strength;
      return this;
    }

    ...

    Player build() {
      return new Player(this);
    }
  }

  private Player(Builder builder) {
    strength = builder.strength;
    ...
  }

  ...

  public static void main(String[] args) {
    Player player = new Player.Builder()
      .setStrength(18)
      .setConsitution(18)
      .setFortitude(18)
      .build();
   }
}


0 commentaires

0
votes

Il n'est jamais conseillé et une manière correcte de définir une fonction qui a autant d'arguments.Idéalement, elle ne devrait avoir que 2 à 3 paramètres.Si il y a plus de paramètres spécifiés, vous pouvez faire l'une des choses ci-dessous.

  • Créez une classe en encapsulant le paramètre (sorte de groupement de paramètres).
  • Utilisez les modèles de construction comme spécifié ci-dessus
  • Fournissez à plusieurs constructeurs uniquement les paramètres requis.
  • Utilisez des méthodes de définition pour peu de choses, si vous pouvez certains paramètres.

3 commentaires

Lisez le livre nommé comme code propre, il a tellement de choses pour les techniques de codage appropriées.


Par Robert Cecil Martin?


@MJDeveloping Oui - Oncle Bob .