Question

Problème

Supposons que vous ayez un utilisateur de classe. Vous voulez être en mesure de retourner cet objet utilisateur à d'autres afin qu'ils puissent l'utiliser pour extraire des informations à l'aide getters. Cependant, vous ne voulez pas que les gens soient en mesure de mettre facilement l'état interne parce que l'information interne doit se rapporter directement à une ligne dans la base de données. Est-il logique d'avoir protégé mutators (setters), de sorte que seule une classe étendue pourrait définir les variables? Est-ce une mauvaise pratique, hors de propos, surpuissant ou inutile?

J'ai envisagé d'essayer de limiter __construct à une utilisation (je crois que ce qui est parfois arbitré comme un singleton -. Bien que je ne suis pas sûr si je comprends tout à fait)

Je suis un amateur programer, pardonne toute ignorance. Merci.

Exemple:

<?php

    class user
    {

    private username;

    protected function set_username($username)
    {
        $this->username = $username;
    }

    public function get_username()
    {
        return $this->username;
    }

?>
Était-ce utile?

La solution

Cela dépend. Si rien ne doit en particulier se produire lorsque l'état est modifié, vous pouvez laisser les setters complètement. Toute sous-classe aura un accès direct aux propriétés qui sont définies protégées ou plus souples.

Si vous avez besoin quelque chose de se produire lorsque les changements d'état (par exemple ayant une base de données UPDATE se produisent lorsque les changements d'état), puis les setters vous rendront la vie beaucoup plus facile, que l'appel au code de mise à jour de base de données mis en setter . Cela signifie que si vous toujours passer par le poseur alors le DB sera toujours à jour lorsque vous changez l'état de l'objet.

Donc en bref, ça dépend.

Autres conseils

Si vous avez un constructeur qui accepte une carte d'identité par exemple, pourquoi voudriez-vous avoir setters du tout. Il n'y a pas de règle qui vous oblige à donner un setters objet juste parce qu'il a getters. Si votre usecase construit quelque part l'objet et après utiliser seulement pour extraire les données qu'il contient, créez tout simplement pas du tout poseur.

L'extension des objets peuvent manipuler les variables de classe protégées elle-même afin qu'ils ne nécessitent aucune forme de setter aussi bien. Si vous ne voulez que le « monde extérieur » pour pouvoir quelque chose ensemble à la classe, ne permettent pas.

Votre code est bien totaly et à mon avis, il résume parfaitement. Tt supporte également le couplage lâche.

Pour une utilisation plus facile, vous pouvez ajouter tous les membres nécessaires (doit avoir) en tant que paramètres du constructeur.

En ce qui concerne le modèle singleton, utilisez-le avec soin. Les utilisateurs en commun ne sont pas singletons. Reportez-vous à refactorisation à motifs (Joshua Kerievsky).

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