gpt4 book ai didi

oop - 代码设计: Who's responsible for changing object data?

转载 作者:行者123 更新时间:2023-12-04 19:43:08 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

因此您可以定义以下内容(请原谅我的 Java 式命名风格;我已经有很长时间没有使用 C++ 了):

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

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

关于oop - 代码设计: Who's responsible for changing object data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27246773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com