53 votes

Écrivez-seules les propriétés ont des applications pratiques?

Je ne sais pas pourquoi j'ai commencé à penser à ce sujet, mais maintenant je n'arrive pas à arrêter.

En C# - et probablement beaucoup d'autres langues, je me souviens que Delphi utilisée pour vous permettre de faire de ce trop - il est légal d'écrire cette syntaxe:

class WeirdClass
{
    private void Hello(string name)
    {
        Console.WriteLine("Hello, {0}!", name);
    }

    public string Name
    {
        set { Hello(name); }
    }
}

En d'autres termes, la propriété dispose d'un setter mais pas de lecture, c'est en écriture seule.

Je suppose que je ne peux pas penser à une raison pourquoi cela devrait être illégal, mais je ne l'ai jamais vu à l'état sauvage, et j'ai certains semblent assez brillant/horrible code dans la nature. Il semble comme une odeur de code; il semble que le compilateur doit être de me donner un avertissement:

CS83417: la Propriété 'Name' semble être complètement inutile et stupide. Mauvais programmeur! Envisager de remplacer une méthode.

Mais peut-être que je n'en ai pas fait assez longtemps, ou qui ont travaillé dans un champ trop étroit pour voir des exemples de l'utilisation efficace d'une telle construction.

Sont là des exemples de la vie réelle de l'écriture uniquement les propriétés qui ne peuvent pas être remplacés par des droites les appels de méthode ou deviendrait, à moins intuitif?

17voto

Dan Points 3922

L'Analyse de Code (aka FxCop) ne vous donner un diagnostic:

CA1044 : Microsoft.Conception : Parce Que la propriété 'WeirdClass.Name " est en écriture seule, ajouter une propriété de lecture avec un l'accessibilité est supérieure ou égal à son setter ou de convertir cette propriété dans une méthode.

17voto

dfa Points 54490

Ma première réaction à cette question: "Que faut-il penser de la java.util.Random#setSeed méthode?"

Je pense qu'écrire uniquement les propriétés sont utiles dans plusieurs scénarios. Par exemple, lorsque vous ne voulez pas exposer la représentation interne (encapsulation), tout en permettant de changer l'état de l'objet. java.util.Le hasard est un très bon exemple d'une telle conception.

15voto

Kaleb Brasee Points 25776

Écriture seule propriétés sont en fait très utile, et je les utiliser fréquemment. Il est tout au sujet de l'encapsulation -- la restriction de l'accès à un objet d'une de ses composantes. Vous avez souvent besoin de fournir un ou plusieurs composants d'une classe qu'elle doit utiliser à l'interne, mais il n'y a aucune raison de les rendre accessibles à d'autres classes. Le faire tout à fait de votre classe plus de confusion ("puis-je utiliser ce getter ou cette méthode?"), et il est plus probable que votre classe peut être altéré ou avoir son véritable but ignoré.

Voir "Pourquoi les méthodes getter et setter sont mal" pour une discussion intéressante sur ce. Je ne suis pas assez hardcore à ce sujet que l'auteur de l'article, mais je pense que c'est une bonne chose à penser. En général, je dois utiliser les setters, mais rarement d'utiliser les accesseurs.

13voto

Robert Lamb Points 474

J'ai un code semblable au suivant dans un projet XNA. Comme vous pouvez le voir, l'Échelle est en écriture seule, il est utile et (raisonnablement) intuitive et une propriété de lecture (get) n'aurait aucun sens pour elle. Assurez-vous qu'il pourrait être remplacé par une méthode, mais j'aime bien la syntaxe.

public class MyGraphicalObject
{
    public double ScaleX { get; set; }
    public double ScaleY { get; set; }
    public double ScaleZ { get; set; }

    public double Scale { set { ScaleX = ScaleY = ScaleZ = value; } }

    // more...
}

2voto

Mehrdad Points 70493

Faire quelque chose en écriture seule est usefulwhenever vous n'êtes pas censé lire ce que vous écrivez.

Par exemple, lors de l'élaboration des choses sur l'écran (c'est précisément ce que le Gestionnaire de fenêtres du Bureau dans Windows):
Vous pouvez certainement attirer un écran, mais vous ne devriez jamais avoir besoin de lire les données (et encore moins s'attendre à obtenir le même design que avant).

Maintenant, que ce soit en écriture seule propriétés sont utiles (par opposition à des méthodes), je ne suis pas sûr de savoir comment elles sont souvent utilisées. Je suppose que vous pourriez imaginer une situation avec un "BackgroundColor" de la propriété, où l'écriture elle définit la couleur d'arrière-plan de l'écran, mais la lecture n'a pas de sens (forcément).
Donc, je ne suis pas sûr de la partie, mais en général, je voulais juste faire remarquer qu'il y sont des cas d'utilisation pour des situations dans lesquelles vous seulement écrire des données, et de ne jamais le lire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X