12

我理解使用面向对象编程作为概念的利弊。我正在寻找的是专门使用 oo in progress/openedge 的优缺点。我需要考虑哪些挑战?语言中是否存在与 oo 不匹配的部分?类似的东西。

编辑:使用 10.2b

4

3 回答 3

19

我会给你我的意见,但请注意,我可能是最讨厌进步的人。;) 也就是说,我已经在 OOABL 中编写了几个中型项目,因此我在该领域有一些经验。这些是我写的一些东西,只是为了让你知道我不是在说我的帽子:

  • 客户端和服务器的 STOMP 协议框架
  • 一个模仿ActiveRecord的简单 ORM
  • 我所在组织的 ABL 编译器接口(后端和前端)
  • 用于构建 Excel 和 Word 文档的库(使用 MS Office 2003 XML 模式对其进行序列化;没有那些愚蠢的 COM 东西)
  • 可以使用多种策略发送电子邮件的电子邮件客户端

OOABL 优点

  • 如果您绝对必须编写 Progress 代码,那么它是创建可重用代码的绝佳选择。
  • 清理现有程序代码库的好方法

OOABL 缺点

  • 类层次结构是有限的;您不能在 10.2B 中创建继承(子)接口(我认为这将在 11 中添加)。旧版本的 OpenEdge 有其他限制,例如缺少抽象类。这会限制您创建干净的 OO 设计的能力,并且会在您开始构建重要的东西时伤害您。
  • 错误处理很糟糕 - CATCH/THROW不允许您抛出自定义错误并强制调用者捕获它们。向后兼容性阻止了这种进一步发展,所以我怀疑它会不会得到改善。
  • 对象内存占用很大,并且没有 AVM 调试工具来追踪原因(一定要喜欢这些封闭的系统!)
  • 垃圾收集直到 10.2A 才存在,即使在 11 中仍然存在一些错误(有关一些示例,请参见官方 OE 论坛)
  • 网络编程(使用套接字)是一个 PITA - 您必须运行一个单独的持久过程来管理套接字。我认为 OOABL 中的事件编程通常是一个 PITA。我记得在尝试使用它们时遇到了很多关于“窗口环境”或类似情况的错误。PUBLISH/SUBSCRIBE也不起作用,如果有记忆的话。
  • 根据您的环境,代码审查可能很困难,因为大多数 Progress 开发人员不执行 OOABL,因此可能无法理解您的代码
  • 如果上述观点属实,您可能会面临来自根深蒂固的开发人员的积极抵制,他们感到不得不学习新事物的威胁

OO 就是构建小的、可重复使用的部分,这些部分可以组合成一个更大的整体。OOABL 的一个大问题是“ABL”部分因其粗糙的数据结构和缺乏枚举器而拖累你,这使你无法真正用它构建真正漂亮的东西。不幸的是,由于它是一种封闭的语言,你不能只是回避你的手,并在外部为它创建自己的新数据或控制结构。

现在,理论上可以尝试使用 MEMPTR、固定数组 (EXTENT) 和 WORK-TABLE 构建其中的一些东西。然而,我曾在 10.1C 中尝试过,但由于缺少接口继承和抽象类,设计失败了,正如我所料,性能相当糟糕。后一部分可能只是由于我的能力差,但我怀疑这是一个几乎无法克服的实现限制。

如果您绝对必须在 OpenEdge 中编码,最重要的是使用 OOABL - 它比程序 ABL 更好,并且在 OpenEdge 的每次迭代发布后,粗糙的边缘会变得稍微平滑一些。但是,它永远不会是一门漂亮的语言(OO 或其他)。

如果您想学习正确的面向对象编程并且不局限于 ABL,我强烈建议您研究一种将对象视为一等公民的语言,例如 Ruby 或 Smalltalk。

于 2012-04-24T18:54:07.630 回答
8

在过去的四年中,我 80% 的时间都在使用 OOABL(从 10.1c 开始)。我绝对推荐使用OOABL,但我认为考虑使用OOABL 与其他OO 语言相同的方式充满问题是非常重要的。“相同方式”是指在 oo 世界中常见的设计模式和实现实践。此外,某些类型的应用程序,尤其是在技术框架领域,很难使用 OpenEdge(例如 ORM)。

原因是OOABL 的性能问题和语言中缺少OO 特性。

例如,如果您使用 C# 或 Java 进行编程,那么在许多情况下,对象的内存占用和实例化时间并不是一个大问题。使用 ABL 这经常成为一个大问题。这会导致其他设计决策并阻止某些模式和框架的实现。

一些缺失或不好的 OO 特性:

  • 没有类库,oo 不需要数据结构
  • 在 java 中没有包可见性(在 c# 中是内部的)这变得相关,尤其是在大型应用程序中
  • 没有泛型
  • 非常糟糕的异常处理
  • 反射能力非常有限(在 oe11 中改进)

因此,如果您熟悉其他语言的 oo 编程并开始使用 OOABL,您可能会错过很多您期望在那里的东西,并在尝试在 ABL 中实现这些东西时感到沮丧。

如果您的应用程序必须仅在 Windows 上运行,也可以在 C# 中实现新的 oo 代码,并通过 clr 桥从您现有的进度代码中调用它,这非常顺利。

于 2012-04-29T20:14:21.970 回答
3

钾+

只有一件事——“错误处理很糟糕”——这很糟糕,但不是因为你不能让你自己的错误类在调用者块中捕获它们——这行得通,我正在使用它。糟糕的是旧的 NO-ERROR / ERROR-HANDLE 选项和 Progress.Lang.Error / CATCH 块和 ROUTINE-LEVEL ON ERROR UNDO, THROW 的混合。这是一个大问题,当团队中没有约定时,将使用哪种错误处理以及如何使用。

于 2012-04-25T07:58:42.147 回答