代码设计:谁负责更改对象数据?



假设我有某种数据结构要处理(例如图像(,我想以不同的方式进行预处理和后处理,以使进一步的处理步骤更容易。使用像 C++ 这样的 OOP 语言实现此责任的最佳方式是什么?

此外,假设我有许多不同的处理算法,具有固有的复杂性,我很可能希望将它们封装在专用类中。这意味着,尽管外部算法实现必须在我的数据中设置某种信息,以指示它已被处理。对我来说,这看起来也不像是干净的设计,因为经过处理似乎是与数据相关的信息,因此数据对象本身应该自行确定和设置。

它看起来也是复杂应用程序中非常常见的错误来源:有人实现了另一种处理算法,忘记在数据中适当地设置标志,应用程序完全不同的部分中的某些内容将无法按预期工作,并且有人会有很多乐趣发现错误。

有人可以概述一个好的和失败保存的方式来实现这样的sth的一般结构吗?

为了确保我理解你在问什么,以下是我根据对问题的阅读做出的假设:

  1. 数据是某种二进制格式(大概是图像,但正如你所说,它可以是任何东西(,可以表示为字节数组
  2. 有许多处理步骤(我将它们称为转换(可以应用于数据
  3. 某些转换依赖于其他转换,例如,如果尚未应用转换的先决条件,则您希望避免应用转换。您希望它可靠,以便检测并防止尝试应用非法转换。

问题是如何以面向对象的方式做到这一点,以避免随着程序复杂性的增加而出现未来的错误。

一种方法是让图像数据对象(封装二进制数据和已应用于它的转换的记录(负责通过转换对象委托执行转换;转换对象实现处理算法和是否可以基于以前的转换应用它的知识。

所以你可以定义以下内容(请原谅我类似Java的命名风格;我已经很久没有做C++了(:

  1. 名为转换类型的枚举类型
  2. 一个名为 Transformer 的抽象类,具有以下方法:
    • 一个名为"getType"的方法,它返回一个转换类型
    • 一个名为"canTransform"的方法,它接受 TransformationType 的列表并返回一个布尔值。该列表指示已应用于数据的转换,布尔值指示是否可以执行此转换。
    • 一种称为"transform"的方法,它接受字节数组并返回(可能已修改的(字节数组
  3. 一个名为 BinaryData 的类,包含一个字节数组和一个 TransformationType 列表。此类实现方法"void transform(Transformer t("执行以下操作:
    • 查询转换器的"canTransform"方法,传递转换类型列表;如果 canTransform 返回 false,则抛出异常或返回
    • 将字节数组替换为调用 t.transform(data( 的结果
    • 将转换器的类型添加到列表中

我认为这实现了您想要的 - 图像转换算法在类中多态定义,但转换的实际应用仍然由数据对象"控制"。因此,我们不必信任外部代码来做正确的事情,wrt设置/检查标志等。

最新更新