Question

Voici une question concernant l'utilisation des propriétés dans la classe.

J'utilise les propriétés publiques au lieu d'exposer les variables membres publiquement. La majorité conseil que cette approche permet l'encapsulation. Cependant, je ne comprends pas l'avantage d'encapsulation en faisant une propriété.

beaucoup de gens donot connaître la vraie raison de l'utilisation des propriétés. Ils le font juste dans le cadre de la norme de codage.

Quelqu'un peut-il expliquer clairement comment une propriété est meilleur que variable membre public et comment il améliore l'encapsulation?

Était-ce utile?

La solution

Encapsulation aide en appelant isolant les classes de changements.

Laissez vous imaginer avoir une classe simple que les modèles un moteur de voiture (car tous les exemples OO devraient impliquer une analogie avec la voiture :)). Vous pouvez avoir un champ simple comme ceci:

private bool engineRunning;

Il suffit de faire ce public sur le terrain ou la fourniture d'un getter IsEngineRunning () ne semble pas être différent.

Supposons maintenant que vous faites votre classe plus sophistiqué, vous voulez supprimer ce champ et le remplacer par:

private bool ignitionOn;
private bool starterWasActivated;

Maintenant, si vous avez beaucoup de classes qui accèdent au vieux champ engineRunning vous devez aller les changer tous les (mauvais moments).

Si au contraire, vous aviez commencé avec:

public bool IsEngineRunning()
{
    return this.engineRunning;
}

vous pouvez maintenant changer à:

public bool IsEngineRunning()
{
    return ignitionOn && starterWasActivated;
}

et l'interface de la classe reste le même (bon temps).

Autres conseils

Il est préférable d'exposer les propriétés au lieu des variables membres, parce que cela vous permettra de faire toutes sortes de vérifier lors de la mise ou obtenir la valeur de la variable membre.

u supposer ont une variable membre:

private int id;

et vous avez une propriété publique:

public int ID
{
    get 
    { 
       // do something before returning
    }
    set 
    {
      // do some checking here may be limits or other kind of checking
    }
}

Je vais faire court. Propriétés = flexibilité

1 sont utiles pour la création de membres que vous ne voulez pas tenir dans une classe tout le temps ou qui sont des regroupements / fonctions des membres existants.

Par exemple. l'âge peut être émis sur la base de la date de naissance, CANnage peut être généré à partir des flotteurs de hasLimbs

2 Les membres Révéler que les propriétés peuvent être utiles lorsque des modifications inattendues [Quelqu'un at-il jamais prédire les demandes de tous les clients?] Dans les systèmes avec une base de données existante.

Par exemple. isAllowed est vrai lorsque l'utilisateur est sur 18ans et est mise en mémoire cache pour la performance. Le client veut exécuter le service aux États-Unis et vous pouvez retourner false si faux est chached et l'âge de vérifier que lorsque le cache est vrai

Quelques réflexions:

  • Vous pouvez modifier la représentation interne de vos données sans affecter les classes d'appel.

    par exemple. (avant)

    public boolean isActive() {
        return this.is_active;
    }
    

    (après)

    public boolean isActive() {
        return this.is_active && this.approved && this.beforeDeadline;
    }
    

    Ceci est particulièrement important si votre code est utilisé par d'autres (par exemple votre code est 3ème partie ). Dans une certaine mesure l'interface / API doit rester stable. De petits changements ne devraient pas affecter le code d'un autre code qui l'utilise.

  • Vous pouvez avoir des opérations plus complexes. Considérons une is_active variable. peut-être changer la valeur de cette variable affecte également d'autres propriétés de l'objet. Si vous l'accès à encapsuler une méthode, vous pouvez prendre soin de ce à l'intérieur de cette méthode et l'appelant ne doit pas prendre soin.

    par exemple.

    public void setActive(boolean active) {
        this.is_active = active;
        this.startTimeout();
        this.updateOtherInformation();
    }
    

    Il applique donc une certaine série d'actions. Vous ne pas ont compter sur le fait que l'appelant exécute ces actions correctement. Votre objet sera toujours dans un état correct.

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