Hoy, en el trabajo, uno de mis colegas revisó mi código y sugirió que eliminara una propiedad de solo conjunto y utilizara un método.
Como ambos estábamos ocupados con otras cosas, me dijo que mirara la Property Design
sección del libro "Pautas de diseño del marco". En el libro, el escritor acaba de decir que evite:
Propiedades con el setter que tiene una accesibilidad más amplia que el getter
Y ahora me pregunto por qué no se recomienda tener una propiedad de solo conjunto. ¿Alguien puede aclararme?
design
code-quality
code-reviews
code-smell
Prashant Cholachagudda
fuente
fuente
Password
propiedad en unaUser
clase. Puede configurarlo, pero no puede obtenerlo. Entonces podría tener unaHashedPassword
propiedad de solo lectura . Llamar al conjunto haría el hash y cambiaría laHashedPassword
propiedad. No te gritaría si hicieras eso.Respuestas:
Creo que puede tener que ver con las expectativas. Las propiedades de solo conjunto son poco comunes y las propiedades se usan generalmente para conjuntos "tontos" solo para almacenar un valor sin mucho procesamiento. Si está haciendo mucho trabajo en un setter, es mejor usar un método: las personas esperan que los métodos tarden mucho tiempo en ejecutarse y que tengan efectos secundarios. La implementación de un tipo similar de comportamiento en una propiedad puede generar un código que viola las expectativas.
Aquí hay una sección relevante de las Pautas de uso de propiedades de Microsoft :
fuente
Porque simplemente no tiene sentido en la mayoría de los casos. ¿Qué propiedad podría tener que pueda establecer pero no leer?
Si OO está destinado a representar mejor el mundo real, es probable que una propiedad de conjunto único sugiera que su modelado es bastante incorrecto.
Editar : Consulte también: /programming/4564928/are-set-only-properties-bad-practice que esencialmente dice que no es intuitivo y que una propiedad de solo conjunto es básicamente un método con otro nombre, por lo que debe usar un método.
fuente
Foo Foo { private get; set; }
? No llamaría a eso solo escribirBueno, me imagino que si puede establecer una propiedad en algo pero nunca obtenerla, nunca sabrá si algo más cambia / sobrescribe el valor que estableció. Eso podría ser un problema si confía en el valor que establece y no puede (por alguna razón) persistir hasta el momento en que desea obtenerlo.
El uso de un método en lugar de una propiedad de solo conjunto será un poco menos confuso para un usuario. El nombre del método generalmente indica set- o get- , pero los nombres de propiedad normalmente no indican que algo solo se puede establecer y no obtener. Supongo que si la propiedad fuera algo así como "ReadOnlyBackgroundColour" no sería confuso para otros codificadores, pero eso se vería raro.
fuente
Este es un tema muy antiguo, pero que ha saltado a mi vista en esta etapa tardía y me gustaría algunos comentarios mientras trato de defender las propiedades de solo escritura ...
Tengo un conjunto de
ActiveReport
clases que forman parte de un sitio web que se instancian y se ejecutan en la devolución de datos después de varias selecciones de usuarios.El código VB se parece a esto:
Estos informes usan agallas genéricas,
CommonReader
toman un procedimiento almacenado y una matriz deSqlParameter
correos predeterminados , cada uno de los cuales tiene una propiedad WriteOnly asociada que, según el diseño del informe, podría pasar como un parámetro en la creación de instancias o establecido por el usuario después de la creación de instancias antes llamando alRun
método de informes .Entonces, como lo veo, tener propiedad de solo escritura en este caso
SqlParameter
s son genéricosSqlParameter
s son clases y no valores primitivos, las propiedades WriteOnly permiten una interfaz más simple para configurar parámetrosAsí que esos son mis pensamientos.
¿Podría convertirlo a un método en su lugar? seguro, pero la interfaz parece ... menos agradable
versus
fuente