【问题标题】:C# Design Problem Regarding Data Encapsulation关于数据封装的 C# 设计问题
【发布时间】:2011-05-10 06:30:41
【问题描述】:

我有四门课:
1:拥有数据的人
2:另一个更新数据
3:第三个是由第一个通知数据的某些变化
4:最后一个从第一类中读取某些属性

我不希望任何其他类,但第二个能够更新数据。
那么在这里使用的最佳设计模式是什么?

有关问题的更多信息:
第一类称为 Schema,它拥有一个计数器,用于记录有多少使用该 Schema 的实例。
第二类称为工厂,它创建/删除这些实例,因此我需要更新架构实例计数器并在必要时创建新的架构对象。
第三类称为 Config,它包含各种共享配置,包括有关每个新 Schema 对象的信息。
第 4 类称为 View,它只是查看 Schema 信息。
架构对象可以通过 ID 访问,因为它们保存在静态列表中。

【问题讨论】:

  • 第二类的原因是什么,只有那个类可以改变第一类的属性。为什么第一类中没有该代码(因此要注意封装?

标签: c# oop design-patterns encapsulation


【解决方案1】:

从过程代码切换到面向对象的代码,并将前两个类合并为一个同时具有数据和行为的类。

【讨论】:

    【解决方案2】:

    这是对您的场景的非常抽象的描述,很难看出您的问题和您想要做什么。

    在谈论“oop”时,您通常会有一个描述对象的类。在您的情况下,您的对象是“数据”。因此,您的第一个类应该是数据并封装对该数据的任何操作。

    类描述对象——它们不是函数的集合。听起来你的第二个类只是一个函数的集合。

    您需要进一步描述您的情况,因为目前它确实无法解释太多。

    【讨论】:

      【解决方案3】:

      这里不需要设计模式。只是一些原则。

      想法很简单:

      对象由其行为定义
      对象只修改自身的状态
      对象保护它的状态

      public class SecondClass{
        public FirstClass First{get;private set;}
        public ThirdClass Third{get; private set;}
        public void DoSomething(){
          First.Something++;
          Second.NotifySomethingHasBeenDone();
        }
      }
      

      如果第 2 类和第 3 类之间的关系不是那么直接,您可能希望使用事件进行通知:

      public class SecondClass{
        public FirstClass First{get;private set;}
        public void DoSomething(){
          First.Something++;
          RaiseEvent<SomethingHasBeenDone>(this);
        }
      }
      
      public class ThirdClass:IHandles<SomethingHasBeenDone>{
        public void Handle(SomethingHasBeenDone @event){
          MessageBox("First has {0} something".With(@event.First.Something));
        }
      }
      

      【讨论】:

        【解决方案4】:

        不确定模式(可能是 this ?)名称,但基本上你有:

        1:拥有数据的人(数据更改时触发事件)

        2:另一个更新数据的

        第 3 类基本上是您的“客户端代码” - 使用其他代码的代码(在本例中为第 1 类)可以是订阅第一个类的事件的任何类

        编辑:我认为您所描述的可能接近Visitor 模式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-26
          • 1970-01-01
          • 2021-07-03
          • 1970-01-01
          • 1970-01-01
          • 2019-09-10
          • 2011-08-17
          相关资源
          最近更新 更多