【问题标题】:Is it possible to minimize wrapper pattern to one-liner?是否可以将包装模式最小化为单线?
【发布时间】:2016-04-13 07:57:54
【问题描述】:

考虑这样的场景,你有一些数据,但你不想直接暴露它,而且涉及一些逻辑。所以你写这样的东西:

private string field;
public string Field
{
  get { return this.field; }
  set 
  {
     // some logic with previous value
     this.field = value;
     // some logic with new value
  }
}

好的,很酷,但是一旦你写了 N 次,你就足够了,所以你写了一个类 -- 包装器。由于您不想公开实现,因此您编写以下代码:

private Wrapper<string> field = new Wrapper<string>();
public string Field
{
  get { return this.field.value;}
  set { this.field.value = value; }
}

所以,好吧,通用代码被隐藏了,实现没有暴露,但仍然有很多重复。

问题——是否有可能进一步挤压它?

以上是我关于 C# 中的模式的主要问题,但我将此留作评论——是否有一种语言支持这种模式到只需要单行的程度。像这样的:

public string Field { get; set; } <- new Wrapper<string>(); // pseudo code

【问题讨论】:

  • 使用代码 sn-p - 在您的情况下非常方便,而且比另一种语言更便宜
  • @Fabio,AFAIK sn-ps 在 创建 代码(编写)时是可以的,但是一旦它们在代码中,您就必须手动处理它们。所以它本身不是解决方案,它只是一种自动输入的方式,而不是用于管理代码。
  • 您可以使用 sn-p 来“键入”您的 Wrapper 类。在这种情况下,您的托管逻辑保留在一个地方 -> 在您的包装类中
  • 如果您不止一次编写相同的逻辑 - 那么您创建一个方法或创建一个包含该逻辑的新类型。 但仍然有很多重复 - 没关系,你使用你漂亮的 Wrapper 是对的。例如可以为空的MyNullableProperty.Value 是否也是重复的?

标签: c# design-patterns wrapper


【解决方案1】:

在 C# 中,我相信您可以在 Wrapper&lt;string&gt;string 之间创建一个隐式转换,以便您可以声明:

public Wrapper<string> Field { get; set; }

然后给属性赋值一个字符串:

MyObject.Field = "test string";

您可以在此处阅读有关隐式转换的更多信息:implicit (C# Reference),或查看this answer for an example

【讨论】:

  • 这很好!谢谢,但如果我在传入转换时没有弄错,将再次创建包装器,这意味着需要再次连接它(例如与数据库的某些连接,或类似的东西)。
  • 只为设置和读取所有值的转换将成为未来的性能问题
【解决方案2】:

C# 6.0 可以实现

public string Field { get; } = new Field<string>(); 

【讨论】:

  • 那只是吸气剂。不处理设置。
  • 只有不改变底层价值的只读属性。
  • @Phani -- 你能解释一下这个答案是一个“新问题”吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 2020-03-19
  • 1970-01-01
相关资源
最近更新 更多