Joh*_*n K 8 .net c# interface immutability
最近我一直在意识到(一些人会过度使用)不可变对象的好处,以大大减少我的对象模型中的读写依赖性问题及其产生的条件和副作用,最终使代码更易于管理(一种功能性编程式的.
这种做法使我创建了只读对象,这些对象在创建/构建时提供了值,然后只允许公共getter用于外部调用者访问属性.受保护的内部和私有设置器允许在写入对象模型时保持内部控制.
在通过我的对象模型创建API 时创建接口时,我已经开始考虑有关不变性的相同问题.例如,通过在我的接口上仅提供公共getter,并将其留给实现者来决定setter以及如何处理该方面.
我正在讨论的用于实现的"只读"接口的一个例子是这个有价值的项目(仅用于演示):
public interface IValuableItem {
decimal Amount {get;}
string Currency {get;}
}
Run Code Online (Sandbox Code Playgroud)
但是我想知道我应该如何提供一个允许写入的伴随接口(如果我应该),而不是在同一个接口中组合这些操作,以免"污染"它的不变性.
我想到了以下想法,就在我的脑海中.如果不提供我认为对每个人的利弊,你认为最好的方法是什么?是否有行业中常用的编码方法来管理这个概念?
// companion writer
public interface IValuableModifier {
decimal Amount {set;}
string Currency {set;}
}
Run Code Online (Sandbox Code Playgroud)
要么
// explicit methods to enforce importance of or deviance in the programming
public interface IValuableModifier {
void SetAmount(decimal val);
void SetCurrency(string cur);
}
Run Code Online (Sandbox Code Playgroud)
要么
// companion writer that inherits the original interface
public interface IValuableModifier : IValuableItem { //...
Run Code Online (Sandbox Code Playgroud)
要么
// Let a concrete class choose one and/or the other.
class Concrete : IValuableModifer, IValuableItem { //...
Run Code Online (Sandbox Code Playgroud)
要么
等等...
还有什么可以帮助我灌输我不可改变的编程模型,并保持适度的灵活性,或者至少将问题分开以便更好地控制它?
Gab*_*abe 10
我想我可能会使用你的想法的变体,如下所示:
public interface IValuableItem
{
decimal Amount { get; }
string Currency { get; }
}
public interface IMutableValuable : IValuableItem
{
new decimal Amount { set; get; }
new string Currency { set; get; }
}
class Item : IMutableValuable
{
public decimal Amount { get; set; }
public string Currency { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这种方式你的可变接口有完整的getter和setter(我觉得有一个有setter但没有getter的接口是没有意义的),但实现它的任何对象也会有一个你可以使用的接口的不可变版本任何纯功能代码.