gpt4 book ai didi

oop - 在构建词法分析器/扫描器时如何使用面向对象的设计范例?

转载 作者:行者123 更新时间:2023-12-04 19:47:32 24 4
gpt4 key购买 nike

我正在尝试设计一个小型正则表达式引擎(在 Smalltalk 中)来帮助增强我的面向对象技能。

我已经确定了一些其他语言的正则表达式引擎(以及 Smalltalk native 语言),它们似乎都有一个单一的“Lexer”或“Scanner”类。这让我感到困惑,因为我认为词法分析器是一个单一的函数,它应该将模式作为输入(可能还有一个定义标记类型的“语法”对象),并返回一个标记流。我无法确定接口(interface)将具有哪些额外功能,以及对象需要保持什么额外状态。

如何将其分解为面向对象的设计?我应该补充一点,当我阅读源代码时,我似乎经常看到这一点:一个在其名称末尾添加动词+“er”的类。这似乎违背了像“Clean Code”和“Code Complete”这样的书所教导的“正确的面向对象设计”。

最佳答案

这是一个非常宽泛的问题,因此我们只能为您提供同样宽泛的答案。这是我的。

在思考面向对象时,我们试图在数据和行为之间建立明确的区别。一个对象同时具有这两种行为,一般来说,行为与数据的独立性越强越好。

这些基本指导原则并不总能带来乍一看自然的设计。原因是有时我们倾向于将与某些数据相关的行为附加到完全相同的数据上。这可能会隐藏应该拥有这种行为的实际对象。

这种现象的典型案例是算法。我们有一些数据:算法输入和一些行为:算法输出,并认为这种行为应该附加到数据上。因此,我们很难将其实现为上述数据的函数

然而,在大多数情况下,这种简单化的方法是有问题的。例如,许多算法可能会产生多个输出。以两个多项式的除法为例,其中输出是商和余数。即使算法只产生一个输出,我们也可能会想问它花了多长时间,甚至告诉它取消执行并停止自己等等。

由于这些原因(以及其他同类原因),始终建议将算法视为对象而不是函数。这种对象的实例变量通常指的是

inputs        - "one or more depending on the algorithm"
outputs - "idem"
auxiliary - "for holding the algorithm internal state while running"
progress - "for recording degree of advancement"
state - "various uses"

将算法实现为对象将有助于添加以下功能:

  1. 重复使用具有不同输入的同一个实例
  2. 有放置输出的地方
  3. 向用户提供反馈
  4. 告诉算法取消并停止执行(通过将其状态设置为#cancel)
  5. 计算迭代次数并注册其他用于调试的东西

如你所见,作为对象的算法比作为函数的算法要丰富得多。这并不意味着您将不得不放弃功能性方法。只需具体化算法并让您的客户端对象提供一个函数,该函数将使用该算法并返回与该上下文相关的结果。

关于oop - 在构建词法分析器/扫描器时如何使用面向对象的设计范例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51215140/

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