Comment accéderiez-vous aux propriétés d'objet à partir d'une méthode d'objet ?

Quelle est la manière « puriste » ou « correcte » d'accéder aux propriétés d'un objet à partir d'une méthode d'objet qui n'est pas une méthode getter/setter ?

Je sais que de l'extérieur de l'objet, vous devriez utiliser un getter/setter, mais de l'intérieur feriez-vous simplement :

Java :

String property = this.property;

PHP :

$property = $this->property;

ou feriez-vous :

Java :

String property = this.getProperty();

PHP :

$property = $this->getProperty();

Pardonnez-moi si mon Java est un peu décalé, cela fait un an que je n'ai pas programmé en Java...

MODIFIER :

Il semble que les gens supposent que je parle uniquement de variables/propriétés privées ou protégées. Quand j'ai appris OO, on m'a appris à utiliser des getters/setters pour chaque propriété même si elle était publique (et en fait, on m'a dit de ne jamais rendre aucune variable/propriété publique). Donc, je pars peut-être d'une fausse hypothèse dès le départ. Il semble que les personnes qui répondent à cette question disent peut-être que vous devriez avoir des propriétés publiques et que celles-ci n'ont pas besoin de getters et de setters, ce qui va à l'encontre de ce que j'ai appris et de ce dont je parlais, bien que cela doive peut-être être discuté comme bien. C'est probablement un bon sujet pour une autre question cependant...

请先 登录 后评论

9 réponses

Greg Hurlman

Cela a un potentiel de guerre religieuse, mais il me semble que si vous utilisez un getter/setter, vous devriez également l'utiliser en interne - l'utilisation des deux conduira à des problèmes de maintenance sur la route (par exemple, quelqu'un ajoute du code à un setter qui doit s'exécuter chaque fois que cette propriété est définie, et la propriété est définie en interne sans que ce setter soit appelé).

请先 登录 后评论
Shawn

Cela dépend de la façon dont la propriété est utilisée. Par exemple, disons que vous avez un objet étudiant qui a une propriété name. Vous pouvez utiliser votre méthode Get pour extraire le nom de la base de données, s'il n'a pas déjà été récupéré. De cette façon, vous réduisez les appels inutiles vers la base de données.

Maintenant, disons que vous avez un compteur entier privé dans votre objet qui compte le nombre de fois que le nom a été appelé. Vous voudrez peut-être ne pas utiliser la méthode Get depuis l'intérieur de l'objet, car cela produirait un compte non valide.

请先 登录 后评论
pix0r

Est-ce que j'exagère ?

Peut-être ;)

Une autre approche consisterait à utiliser une méthode privée/protégée pour effectuer réellement l'obtention (caching/db/etc), et un wrapper public pour cela qui incrémente le compte :

PHP :

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

puis depuis l'objet lui-même :

PHP :

$name = $this->_getName();

De cette façon, vous pouvez toujours utiliser ce premier argument pour autre chose (comme envoyer un indicateur pour savoir s'il faut ou non utiliser les données mises en cache ici).

请先 登录 后评论
Coincoin

Eh bien, il semble qu'avec C

请先 登录 后评论
svrist

Comme indiqué dans certains des commentaires : parfois vous devriez, parfois vous ne devriez pas. La grande partie des variables privées est que vous pouvez voir tous les endroits où elles sont utilisées lorsque vous modifiez quelque chose. Si votre getter/setter fait quelque chose dont vous avez besoin, utilisez-le. Si cela n'a pas d'importance, vous décidez.

Dans le cas contraire, si vous utilisez le getter/setter et que quelqu'un change le getter/setter, il doit analyser tous les endroits où le getter et le setter sont utilisés en interne pour voir si cela gâche quelque chose.

请先 登录 后评论
MojoFilter

Personnellement, je pense qu'il est important de rester cohérent. Si vous avez des getters et des setters, utilisez-les. La seule fois où j'accéderais directement à un champ, c'est lorsque l'accesseur a beaucoup de frais généraux. Vous aurez peut-être l'impression de gonfler votre code inutilement, mais cela peut certainement vous éviter bien des maux de tête à l'avenir. L'exemple classique :

Plus tard, vous souhaiterez peut-être modifier le fonctionnement de ce champ. Peut-être devrait-il être calculé à la volée ou peut-être souhaitez-vous utiliser un type différent pour le magasin de sauvegarde. Si vous accédez directement aux propriétés, un changement comme celui-ci peut casser énormément de code d'un seul coup.

请先 登录 后评论
Telcontar

Je peux me tromper car je suis autodidacte, mais je n'utilise JAMAIS de propriétés publiques dans mes classes Java, elles sont toujours privées ou protégées, de sorte que le code extérieur doit y accéder par des getters/setters. C'est mieux à des fins de maintenance / modification. Et pour le code de classe interne... Si la méthode getter est triviale, j'utilise la propriété directement, mais j'utilise toujours les méthodes setter car je pourrais facilement ajouter du code pour déclencher des événements si je le souhaite.

请先 登录 后评论
Brendon-Van-Heyzen

J'ai trouvé que l'utilisation de setters/getters rendait mon code plus facile à lire. J'aime aussi le contrôle qu'il donne lorsque d'autres classes utilisent les méthodes et si je modifie les données, la propriété sera stockée.

请先 登录 后评论
Mel

Champs privés avec des propriétés publiques ou protégées. L'accès aux valeurs doit passer par les propriétés et être copié dans une variable locale si elles seront utilisées plus d'une fois dans une méthode. Si et UNIQUEMENT si vous avez le reste de votre application si totalement peaufiné, secoué et autrement optimisé pour que l'accès aux valeurs en passant par leurs propriétés associées soit devenu un goulot d'étranglement (et cela n'arrivera JAMAIS, je vous le garantis) devriez-vous même commencer envisager de laisser autre chose que les propriétés toucher directement leurs variables de support.

Les développeurs .NET peuvent utiliser des propriétés automatiques pour appliquer cela puisque vous ne pouvez même pas voir les variables de sauvegarde au moment de la conception.

请先 登录 后评论