Question

Si vous avez une classe avec des propriétés simples get / set, existe-t-il une raison d'utiliser les getters dans les méthodes de classe ou devez-vous simplement utiliser les variables de membre privé? Je pense qu'il pourrait y avoir plus d'argument autour des setters (logique de validation?), Mais je me pose des questions sur les accesseurs.

Par exemple (en Java) - existe-t-il une raison d'utiliser l'option 2?

public class Something
{
    private int messageId;
    public int getMessageId() { return this.messageId; }
    public void setMessage(int messageId) { this.messageId = messageId; }

    public void doSomething()
    {
        // Option 1:
        doSomethingWithMessageId(messageId);

        // Option 2:
        doSomethingWithMessageId(getMessageId());
    }
}
Était-ce utile?

La solution

En général, les programmeurs Java ont tendance à utiliser les méthodes de lecture de manière très cohérente. Je programme plusieurs langues et je ne suis pas si cohérent à ce sujet;)

Je dirais que tant que vous ne ferez pas de getter, vous pourrez utiliser la variable brute - pour les variables privées . Lorsque vous faites un getter, vous ne devriez utiliser que cela. Lorsque je crée un getter pour un champ privé, mon IDE suggère de remplacer automatiquement les accès au champ brut lorsque je présente un getter. Passer à l’utilisation d’un getter n’est qu’à quelques touches (et sans risque d’erreurs), j’ai donc tendance à le retarder jusqu’à ce que j’en ai besoin.

Bien sûr, si vous voulez des choses comme l’injection de getter, certains types de framworks de proxy et de sous-classes comme hibernate, vous devez avoir des getters d’utilisateur!

Autres conseils

Avec les getters, vous ne modifierez pas les variables par inadvertance :) De même, si vous utilisez les deux getters et le paramètre "raw" variable, votre code peut devenir confus.

De plus, si vous utilisez l'héritage et redéfinissez les méthodes de lecture dans les classes enfants, les méthodes d'utilisation de l'outil de lecture fonctionneront correctement, alors que celles utilisant les variables brutes ne fonctionneraient pas.

Si vous utilisez la méthode getter partout - et que vous effectuerez ultérieurement une recherche de code sur tous les appels de getMessageId (), vous les retrouverez tous. Si vous aviez utilisé des appels privés, vous risquez d'en manquer certains.

De plus, s'il y a une logique à introduire dans la méthode setter, vous n'aurez pas à vous soucier de changer plus d'un emplacement pour elle.

Si la valeur que vous affectez à la propriété est une valeur connue ou vérifiée, vous pouvez utiliser en toute sécurité la variable privée directement. (Sauf peut-être dans certaines situations spéciales, où il serait évident de comprendre pourquoi ce serait mauvais.) Que vous le fassiez ou non, c'est davantage une question de goût ou de style. Ce n’est pas non plus un problème de performances, car le getter ou le setter sera intégré par le compilateur s’il est assez simple.

Si la valeur est inconnue de la classe, vous devez utiliser la propriété pour la définir, afin de la protéger des valeurs illégales.

Voici un exemple (en C #):

public class Something {

   private string _value;

   public string Value {
      get {
         return _value;
      }
      set {
         if (value == null) throw new ArgumentNullException();
         _value = value;
      }
   }

   public Something() {
      // using a known value
      _value = "undefined";
   }

   public Something(string initValue) {
      // using an unknown value
      Value = initValue;
   }

}

Si vous utilisez le getter, vous vous assurez que vous obtiendrez la valeur une fois que toute logique / décision aura été appliquée. Ce n’est probablement pas votre cas habituel, mais vous vous en remercierez quand même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top