Hoje no trabalho, um dos meus colegas revisou meu código e sugeriu que eu removesse uma propriedade somente de conjunto e usasse um método.
Como estávamos ocupados com outras coisas, ele me disse para examinar a Property Design
seção do livro "Framework Design Guidelines". No livro, o escritor disse apenas para evitar:
Propriedades com o setter com acessibilidade mais ampla que o getter
E agora estou me perguntando por que não é recomendável ter propriedade somente de conjunto? Alguém pode esclarecer para mim?
design
code-quality
code-reviews
code-smell
Prashant Cholachagudda
fonte
fonte
Password
propriedade de umaUser
classe. Você pode configurá-lo, mas não pode obtê-lo. Você poderia ter umaHashedPassword
propriedade somente leitura . Chamar o conjunto faria o hash e alteraria aHashedPassword
propriedade. Eu não gritaria com você se você fizesse isso.Respostas:
Eu acho que isso pode ter a ver com expectativas. Propriedades apenas de conjunto são incomuns e geralmente são usadas para conjuntos "burros" apenas para armazenar um valor sem muito processamento. Se você trabalha muito em um levantador, é melhor usar um método - as pessoas esperam que os métodos levem muito tempo para serem executados e que possam ter efeitos colaterais. A implementação de comportamentos semelhantes em uma propriedade pode resultar em código que viola as expectativas.
Aqui está uma seção relevante das Diretrizes de uso da propriedade da Microsoft :
fonte
Porque simplesmente não faz sentido na maioria dos casos. Que propriedade você pode ter, que pode definir, mas não pode ler?
Se o OO tiver a intenção de representar melhor o mundo real, é provável que uma propriedade definida apenas sugira que a sua modelagem esteja bem.
Edit : Veja também: /programming/4564928/are-set-only-properties-bad-practice, que essencialmente diz que não é intuitivo e que uma propriedade set only é basicamente um método com outro nome, portanto, você deve usar um método.
fonte
Foo Foo { private get; set; }
? Eu não chamaria isso apenas de escritaBem, imagino que, se você pode definir uma propriedade em algo, mas nunca obtê-lo, nunca saberá se alguma outra coisa altera / substitui o valor que você definiu. Isso pode ser um problema se você confiar no valor definido e não conseguir (por algum motivo) persistir até o momento em que deseja obtê-lo.
Usar um método em vez de uma propriedade somente de conjunto será um pouco menos confuso para um usuário. O nome do método geralmente indica set- ou get- , mas os nomes das propriedades normalmente não indicam que algo só pode ser definido e não obtido. Suponho que se a propriedade fosse algo como "ReadOnlyBackgroundColour", não seria confuso para outros codificadores, mas isso pareceria estranho.
fonte
Este é um tópico muito antigo, mas que surgiu na minha opinião neste estágio final e eu gostaria de alguns comentários enquanto tentava defender propriedades somente para gravação ...
Eu tenho um conjunto de
ActiveReport
classes que fazem parte de um site que são instanciadas e executadas na postagem após várias seleções de usuários.O código VB é mais ou menos assim:
Esses relatórios usam tripas genéricas, usam
CommonReader
um procedimento armazenado e uma matriz deSqlParameter
s padrão , cada um dos quais possui uma propriedade WriteOnly associada que, dependendo do design do relatório, pode ser transmitida como parâmetro na instanciação ou definida pelo usuário após instanciação antes chamando oRun
método de relatórios .Então, a meu ver, ter propriedade somente gravação neste caso
SqlParameter
s são genéricosSqlParameter
s são classes e não valores primitivos, as Propriedades WriteOnly permitem uma interface mais simples para a configuração de parâmetrosEntão esse é o meu pensamento.
Eu poderia convertê-lo em um método? claro, mas a interface parece ... menos agradável
versus
fonte