3

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

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

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

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

4

1 回答 1

0

为确保我理解您的要求,以下是我根据我对问题的阅读做出的假设:

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

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

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

因此,您可以定义以下内容(请原谅我的类似 Java 的命名风格;自从我完成 C++ 以来已经有很长时间了):

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

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

于 2014-12-23T23:00:16.530 回答