And*_*eir 47 c# oop io design-patterns
注意:很抱歉这个问题很长!
我试图理解面向对象背后的一些关键领域,我无法以某种方式决定我的特定问题.
假设我有一个充满可爱数据的对象.班级鲍勃.
Bob myBob = new Bob("This string is data");
Run Code Online (Sandbox Code Playgroud)
假设我想将myBob的内容保存到xml文件(bob.xml)
我是否应该在bob上写一个对象来写出内容,或者我应该让myBob这样做吗?
案例1:对象行为
Writer myWriter = new Writer(myBob, "C:\\bob.xml");
Run Code Online (Sandbox Code Playgroud)
案例2:保存方法
myBob.Save("C:\\bob.xml");
Run Code Online (Sandbox Code Playgroud)
有些人支持选项一,因为这意味着如果更改了编写文件的代码,则不需要在每个Save方法中更新; 我想,促进代码重用.我的问题是从对象中获取所有数据,这些对象可能没有访问者的私有数据.
选项二的情况是该方法仅对对象持有的数据起作用,这就是它应该的方式.不受其他物体的干扰.
或者是我的问题的答案之一是"案例依赖"问题?如果是这样,你怎么知道何时一种方法优先于另一种?
Gre*_*g D 36
一般来说,正确的方法是你的案例1.这样就保持了对类(无论它做什么)的单一责任,而没有将它耦合到特定的持久性机制(磁盘).
您正在研究一个更普遍的问题的特定情况:序列化.一个对象有一些方法来指示它应该如何被序列化是好的和好的 - 毕竟它是唯一知道反序列化它的必要实体.但是,如果您将对象保存到磁盘,则会将该对象与特定实现紧密耦合.
相反,请考虑创建一个接口,广义的"编写者"可以使用该接口将对象"序列化"为编写器序列化的任何内容.这样,您就可以序列化到磁盘,网络,内存,以及您实际需要序列化的任何内容.:)
Col*_*ett 25
我会Bob
知道如何序列化自己,因为它有私人数据.另一个对象(例如你的Writer
)将把它放在磁盘上.Bob知道如何最好地处理其数据,但它不需要关心存储的方式和位置.您的Writer知道如何最好地保存数据,但它不需要关心如何创建数据.
这是可以使用策略设计模式的示例.您的myBob
对象可以具有将其写出的类的实例.您可能希望编写器实现接口或从抽象类派生,以便可以轻松更改保存例程.
今天你保存到xml,但你可能还需要最终将对象保存到数据库.此模式将允许您轻松更改保存例程.您甚至可以选择更改在运行时保存的方式.