关于公共成员的这种使用,有什么好/坏/不必要的?

时间:2010-09-28 17:16:07

标签: c# .net-4.0 class-design

以下是我的代码的概要,它是一个中等复杂的WinForms GUI。

依赖关系的上下文是模型视图演示者模式。

public class StatSyncherFormView : Form, IView 
{ ... }

public class Presenter 
{
   // Here is the member I made public
   public readonly IView view;

   public Presenter(IView view) 
   {
      this.view = view;
   }    
}

static void Main()
{
   IView view = new View();
   Presenter presenter = new Presenter(view);

   // Here is where I'm accessing the public member
   Application.Run((Form)p.view);   
}

1)我喜欢这样的事实,即视图仅由构造函数设置,之后不会被修改。它使我在多线程GUI开发环境中感觉更好。

2)public View {get; private set;}然后我输了(不变性?)。

3)使用private readonly IView view我还需要public View {get {return view;}}感觉(对我来说,至少也许有人可以告诉我),这是多余的。

我的问题:我觉得(3)是避免使用公共会员的唯一方法,但在这种情况下我不理解其中的好处。

我意识到这是细枝末节,所以请提前感谢任何花时间给我建议的人。

4 个答案:

答案 0 :(得分:4)

只需给Presenter一个Run()方法。

答案 1 :(得分:1)

您的第三种方法(我最喜欢)的好处包括:

  • 您可以稍后向getter添加逻辑,而无需重新编译调用代码
  • 封装:代码中只有一个位置可以从实际字段中获取值,允许您添加日志记录或使用任何其他调试机制来解决意外行为。
  • 封装还意味着您可以实际更改字段以保留其他类型,只要它可以转换为IView即可。这种转换可以在getter中进行。

答案 2 :(得分:1)

这实际上只是公开可见字段与属性辩论的变体。

遵循标准指南(您的选项3)是大多数人会推荐的,尽管您称之为“冗余”。顺便说一下,我不确定你的冗余是什么意思

  • 要输入的一些额外字符,或

  • 运行时的额外getter方法(可能会被JITter优化掉)。

在任何情况下,“冗余”都不重要。

话虽如此,在你的具体案例中,Hans Passant的答案是完全避免对财产/领域的需要,这可能是最好的。

答案 3 :(得分:0)

如果使用公共字段,则无法在不重新编译程序集的情况下将其更改为属性。所以我认为最好通过使用属性在第一时间做到这一点。

相关问题