c# - 如何设计不同程序使用的对象?
问题描述
让我们假设:
- 我们有一堆 Shape 类
- 每个形状都有一个公共的 Draw() 方法并且知道如何绘制自己
- 我们有一个程序,其唯一任务是从文件加载和显示形状,而不是更改它们
- 我们有一个用于可视化编辑 Shape 类的工具,这意味着一个 Shape 类将被绘制到屏幕上,用户可以选择它并编辑它的数据
- 用户可以将形状序列化为文件,显示形状的程序应该能够反序列化形状,使其看起来与用户从工具中保存的形状相同
- 形状包含确定公共方法行为的非公共字段,例如告诉 Draw() 方法以什么颜色绘制形状的 Color 字段
- 此类字段可以由工具编辑,但对显示形状的程序不可见
因此,问题是如何实现形状?
- 将它们实现在两个程序都可以使用的共享库中会破坏封装,但会有一个实现。
- 对编辑器有一个实现,对绘制形状的程序有另一个实现,这两个实现都应该具有标准化的反序列化(相同的成员),以便它们可以正确地反序列化。这解决了封装问题,但我们必须维护两个实现。
如果我不想让绘图程序知道它们可以被编辑,我应该如何设计这些形状对象?
目前我倾向于第二种选择。有没有我没有看到的第三种选择?你有什么建议,为什么?
解决方案
如果您要在程序之间交换文件,或者可能将它们存储很长时间并在程序更改后稍后加载它们,那么您不要只使用工作对象的默认序列化,它会写出私有字段并在您更改它们时中断。
在这些情况下,数据格式是对象接口的一部分。它需要被设计和指定。
设计数据格式与设计方法调用接口是不同的工作。您的主要考虑因素通常是:
向后兼容性:你将如何确保你现在写的数据可以被未来的程序使用?这通常由版本控制方案处理。
前向兼容性:您将如何确保未来程序写入的数据将尽可能地被今天的程序使用?这通常由扩展机制处理。
语言独立性:您是否需要确保处理数据的程序易于/方便地用其他编程语言编写?这通常意味着您不依赖于由您的语言或库定义的复杂序列化格式。
文本、二进制还是介于两者之间?:文本格式(通常基于 JSON、YAML 或 XML)便于调试且易于记录。二进制格式更紧凑。有时你可以使用中间立场。例如,MS Office 文件是打包在 .zip 存档中的文本文件。
推荐阅读
- grid - 将工具面板放置在 ag 网格的左侧
- python - 如何在 matplotlib 上生成一系列直方图?
- javascript - Ajax Datatable 的导出按钮只导出可见数据
- android - Android APK 未安装
- python - 如何在 python 中使用 map 将分类(包括字母和数字)更改为数字?
- c# - 串口缓冲区值无法翻译和不停流
- c# - 寻找通过 WMI 读取的注册表
- javascript - React JS 通过 onClick 更改图形 html 代码
- java - 如何通过用户插入的月数计算估计日期?
- swift - SignalR 在 Swift 中使用 SwiftR - 协商请求期间出错