首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用接口分离读写关注点的最佳方法?

使用接口分离读写关注点的最佳方法?
EN

Stack Overflow用户
提问于 2010-11-30 05:59:29
回答 5查看 2.1K关注 0票数 9

最近,我已经意识到(有些人会认为过度使用)不可变对象的好处,它可以极大地减少对象模型中的读写依赖问题及其产生的条件和副作用,最终使代码更易于管理(某种形式的函数编程-esque)。

这种做法使我创建了在创建/构造时提供值的只读对象,然后只为外部调用方提供公共获取器来访问属性。受保护的、内部的和私有的设置器允许维护对对象模型的写入的内部控制。

在创建接口时,在我的对象模型上创建API时,我已经开始考虑同样的不可变问题。例如,在我的接口上只提供公共的getter,并由实现者来决定setter和如何处理这个方面。

我正在讨论的用于实现的“只读”接口的一个例子是这个有价值的项目(仅供演示):

代码语言:javascript
复制
public interface IValuableItem {
    decimal Amount {get;}
    string Currency {get;}
}

然而,我想知道应该如何提供一个可以编写(如果应该的话)的配套接口,而不是将这些操作合并在同一个接口中,以免“污染”它的不可变性。

下面的想法已经浮现在我的脑海中,就在我头上。在不提供我认为是利弊的东西的情况下,,您认为最好的方法是吗?在业界是否有一种通用的编码方法来管理这个概念?

代码语言:javascript
复制
// companion writer
public interface IValuableModifier {
    decimal Amount {set;}
    string Currency {set;}
}

代码语言:javascript
复制
// explicit methods to enforce importance of or deviance in the programming
public interface IValuableModifier {
    void SetAmount(decimal val);
    void SetCurrency(string cur);
}

代码语言:javascript
复制
// companion writer that inherits the original interface
public interface IValuableModifier : IValuableItem { //...

代码语言:javascript
复制
// Let a concrete class choose one and/or the other.
class Concrete  : IValuableModifer, IValuableItem { //...

等等。

还有什么可以帮助我在我本来不变的编程模型上进行写作,并保持其适度的灵活性,或者至少可以分离出对它的更好控制的关注点呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-30 06:15:57

我想我可能会使用你的想法的一个变体,比如:

代码语言:javascript
复制
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; }
}

这样,您的可变接口就有了完整的getter和setters (我不认为有一个有setters但没有getters的接口),但是任何实现它的对象都会有一个不可变的接口版本,您可以将其用于任何纯功能代码。

票数 10
EN

Stack Overflow用户

发布于 2010-12-02 19:26:43

您应该为ReadableFoo、ImmutableFoo和MutableFoo提供独立的接口。后两者应继承第一个。ReadableFoo应该包含一个"AsImmutable“方法,该方法将返回一个可以保证是不可变的Foo (一个不可变的实例应该返回自己;一个可变的实例应该返回一个包含其数据的新的不可变实例),并且可能包含一个"AsNewMutable”成员(它将创建一个包含相同数据的新的可变实例,不管原始数据是否是可变的)。

没有一个类应该同时实现ImmutableFoo和MutableFoo。

票数 4
EN

Stack Overflow用户

发布于 2010-11-30 07:44:51

如果您的对象是不可变的(并且您围绕不可变数据的概念来设计您的应用程序),那么对象实际上必须保持不变。

在不可变场景中修改数据的规范方法是创建新对象,因此我建议如下所示:

代码语言:javascript
复制
public interface IValuableItem<T>
{
    decimal Amount { get; }
    string Currency { get; }
    T CreateCopy(decimal amount, string currency);
}

public class SomeImmutableObject : IValuableItem<SomeImmutableObject>
{
    public decimal Amount { get; private set; }
    public string Currency { get; private set; }

    public SomeImmutableObject(decimal amount, string currency)
    {
        Amount = amount;
        Currency = currency;
    }

    public SomeImmutableObject CreateCopy(decimal amount, string currency)
    {
        return new SomeImmutableObject(amount, currency);
    }
}

SomeImmutableObject obj = new SomeImmutableObject(123.33m, "GBP");
SomeImmutableObject newObj = obj.CreateCopy(120m, obj.Currency);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4310963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档