Últimamente he estado dando cuenta de los beneficios de (algunos dirían uso excesivo de) los objetos inmutables de reducir drásticamente en temas de lectura-escritura de dependencia en mi modelo de objetos y sus condiciones resultantes y los efectos secundarios, en última instancia, a hacer el código más fácil de administrar (tipo de funcional-programación-esque).¿La mejor manera de separar preocupaciones de lectura y escritura usando interfaces?
Esta práctica me ha llevado a crear objetos de sólo lectura que se proporcionan los valores en la creación de tiempo/construcción y después de hacer disponibles sólo captadores públicas para las llamadas externas para acceder a las propiedades con. Los instaladores protegidos, internos y privados permiten mantener el control interno sobre la escritura en el modelo de objetos.
Al crear las interfaces al hacer una API sobre mi modelo de objeto, he comenzado a considerar los mismos problemas sobre la inmutabilidad. Por ejemplo, al proporcionar solo getters públicos en mis interfaces, y dejar que los implementadores decidan qué setters y cómo manejar ese aspecto.
Un ejemplo de una interfaz de "sólo lectura" para la aplicación que estoy hablando es de este objeto de valor (sólo para demostración):
public interface IValuableItem {
decimal Amount {get;}
string Currency {get;}
}
Sin embargo llegué a preguntarse cómo debería proporcionar una interfaz complementaria que permite escribir (y si debería), y no combinar esas operaciones dentro de la misma interfaz para no "manchar" su inmutabilidad.
Las siguientes ideas han venido a la mente, justo al lado de la parte superior de mi cabeza. Sin proporcionar lo que creo que son ventajas y desventajas para cada uno, ¿cuál crees que es el mejor enfoque? ¿Existe una metodología de codificación común en la industria para gestionar este concepto?
// companion writer
public interface IValuableModifier {
decimal Amount {set;}
string Currency {set;}
}
o
// explicit methods to enforce importance of or deviance in the programming
public interface IValuableModifier {
void SetAmount(decimal val);
void SetCurrency(string cur);
}
o
// companion writer that inherits the original interface
public interface IValuableModifier : IValuableItem { //...
o
// Let a concrete class choose one and/or the other.
class Concrete : IValuableModifer, IValuableItem { //...
o
etc. ..
¿Qué más me puede ayudar a imbuir a escribir en mi modelo de programación de otro modo inmutable y guardo moderadamente flexible o al menos para separar las preocupaciones para un mejor control sobre ella?
Una clase que tiene una propiedad 'public' o' protected' que proporciona solo un acceso 'set' provocará una advertencia de Code Analysis [CA1044: Las propiedades no deben ser solo de escritura] (https://msdn.microsoft.com/ en-us/library/ms182165.aspx). – DavidRR