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

时间:2014-12-02 10:12:23

标签: oop class-design responsibility

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

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

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

有人可以勾勒出一个好的,失败的方法的一般结构来实现这样吗?

1 个答案:

答案 0 :(得分:0)

为了确保我明白你在问什么,这是基于我对这个问题的解读的假设:

  1. 数据是某种二进制格式(可能是图像,但正如你所说它可以是任何东西),可以表示为字节数组
  2. 有许多处理步骤(我将它们称为转换)可以应用于数据
  3. 某些转换依赖于其他转换,例如,如果尚未应用转换,则您希望避免应用转换。您希望它是健壮的,以便检测并阻止尝试应用非法转换。
  4. 问题是如何以面向对象的方式做到这一点,以避免未来的错误,因为程序的复杂性增加。

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

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

    1. 名为TransformationType
    2. 的枚举类型
    3. 一个名为Transformer的抽象类,具有以下方法:
      • 一种名为'getType'的方法,它返回TransformationType
      • 一种名为'canTransform'的方法,它接受TransformationType列表并返回一个布尔值。该列表指示已应用于数据的转换,布尔值表示是否可以执行此转换。
      • 一种名为'transform'的方法,它接受一个字节数组并返回一个(大概是修改过的)字节数组
    4. 一个名为BinaryData的类,包含一个字节数组和一个TransformationType列表。此类实现方法'void transform(Transformer t)'来执行以下操作:
      • 查询变换器的'canTransform'方法,传递转换类型列表;如果canTransform返回false,则抛出异常或返回
      • 将he字节数组替换为调用t.transform(data)
      • 的结果
      • 将transfomer的类型添加到列表
    5. 我认为这可以实现你想要的 - 图像转换算法在类中以多态方式定义,但转换的实际应用仍然由数据对象“控制”。因此,我们不必信任外部代码来设置/检查标志等正确的事情。