2

我有一个我正在维护的 ASP Classic 站点,我想合并对对象和属性的访问。我编写了一些带有属性的简单类,用于获取数据、插入数据和更新特定对象的数据。这些类中的大多数对应于一个表。

我想知道我应该在哪里做一些事情,比如为屏幕创建 HTML 输出,或者我应该在哪里放置使用多个类的方法。例如,我可能有一个使用作业和学生信息来生成输出的学生年级班级。

我是否制作了一个“演示文稿”类,它从对象中获取记录集(或数组?)并呈现输出?

谢谢!!

4

2 回答 2

1

首先,我想建议为此使用 WSC。与类不同,WSC 可以有条件地加载/实现。在我工作的公司,我们使用 WSC 构建了一个非常稳定和快速的多层 ORM。WSC 是用脚本代码编写的对象,具有属性和方法。

WSC 说明
WSC 示例

和您一样,我们每个表都有一个 WSC,具有列属性。此外,每个 WSC 都有一个 initialise() 方法,该方法接受一个 ID,并使用数据库中该 ID 的值加载所有对象属性。它还有一个 save() 方法。这会检查是否存在 id。如果没有,它执行一个 INSERT,如果有一个 id,这是一个现有的记录,它执行一个 UPDATE。它还有一个删除函数()。我们有一个小的 ASP 网页,可以为给定的表动态生成这些 WSC。

在 WSC 中,我们有一个数据访问层对象,它执行 WSC 中的所有查询。每个 WSC 只是构建 SQL 字符串并将它们发送到 DAL,DAL 返回一个记录集(或者只是执行而没有结果)。这个 DAL 是唯一需要知道数据库连接字符串的组件。如果需要,它还可用于记录所有查询。

我们还有用于记录/调试、翻译的 WSC,以及一个非常重要的用于转义所有 SQL 以防止 SQL 注入的 WSC。

回到你的问题;

通常,您会尽可能地将逻辑与表示分开。在诸如 asp.net mvc 或 django 之类的现代框架中,您只能将信息传递到可以添加到的通用字典中的页面,或者传递到页面的模型中。(模型是您的类映射表之一)。如果您可以模仿这种行为,那么您可以很好地分离逻辑和代码。

我会告诉你我们做了什么来解决你描述的问题,但我也会告诉你我们的解决方案并不理想,如果我们从头开始我会怎么做:

我们在当前应用程序中所做的是向我们的 WSC 添加方法。因此,假设我们有一个 user() wsc,它映射到一个用户表,我们已经可以执行以下操作:

user.firstname = "erik"
user.lastname = "test"
user.save()

然后我们将“user-stuff”添加到这个 WSC,比如一个 login() 函数,它接受用户名和密码,并返回一个用户 ID(或者当登录不成功时不返回任何内容):

dim userid
    userid = user.login("test", "test")

通过这种方式,我们通过将属于特定实体的逻辑放在它所属的 WSC 中来分离属于它的逻辑。

所以我们实际上做的是给对象本身添加逻辑。这不是真正的面向对象风格的方式。在真正的面向对象编程中,您会将对象(如用户对象)作为参数或函数结果传递,并保持您的(处理)逻辑分开。经典 ASP 并不是真正面向对象的,因此我们选择将逻辑添加到对象本身,但事后看来,如果您愿意,可以在经典 ASP 中实现类似的东西。

此外,还有一些程序会引发它们属于何处的问题。向用户发送格式化的 PDF 信件,逻辑是放在用户对象还是信件对象中?我们回答这个问题的方法就是查看代码。我们是否已经有可用的用户 WSC 并已初始化?然后我们可以很容易地向用户添加一个方法。如果我们需要批量发送信件,并且我们从一个开放的 letters.wsc 开始,我们将功能添加到信件 wsc。老实说,它主要是自己安排的。

如果您要完全分离您的业务逻辑和您的 ORM(将表映射到类或 WSC),那么您将不会遇到这个问题。这就是为什么现代 OO 语言可以很好地解决这个问题的原因。在经典 ASP 中,您可以通过将处理逻辑放在 ASP 页面中来做到这一点,而对象就在那里供处理逻辑使用。

我们目前所做的是我们有一个专用的 WSC,可以将信息存储在数据库中。我们在一个 ASP 页面上进行处理,但我们不显示它。相反,我们将结果放在这个 WSC 中(它将它存储在一个大的键值表中)。然后我们重定向到不同的 ASP 页面,该页面显示来自同一个 WSC/表的数据,从而分离代码表单逻辑。

用于经典 ASP 的 memcached

不久之后,就可以使用经典 ASP 中的 memcached。memcached 是一个完全在内存中的 key-value 存储,facebook 也使用它。它比用于存储的数据库快得多。我会重新开始吗,我会这样实现它:

  1. 使用 WSC 来创建像我们现在这样的 ORM
  2. 不要把业务逻辑放在WCS里,默认放在ASP页面里
  3. 让 asp 页面将结果存储在 memcached 中(这可以是简单的变量,也可以是序列化的记录集,甚至是 json 对象,如果您使用的是 jscript 而不是 vbscript)
  4. 重定向到可以显示存储在 memcached 中的信息的演示页面。

Dammit Caveatrob,正如你所看到的,我对这些东西非常热情,好像我写了一本关于实现它的小书。从头开始做这件事会做很多工作,我意识到我说的比你问的要多,但我不想在写完之后删除它。
我希望其中一些信息对您有利,即使您可能不会实现整个框架。(如果你这样做,请告诉我:))

埃里克

于 2012-08-23T08:39:23.583 回答
0

在我工作的地方,我们将“页面”编写如下:

开始控制器

页面控制器代码(SQL 查询、参数、会话等)

在这里,我们计算整个事物以进行演示并根据用户操作采取行动

结尾

开始演示

使用服务器端显示 html 页面包括常见的 html 片段(分页、常见脚本等),以及在控制器端准备的数据。

结束演示

在演示方面(无论您在哪里/无论您如何做),您都可以调用您的对象方法来根据需要显示/检索数据

我认为,除非它真的很常见,否则您的业务对象的表示不应该被封装到它们的类中,而是在其他地方。

也许你可以为你的对象构建几个实现不同渲染器的类。但我认为大多数时候很难将整个演示文稿封装成对象:(

希望这可以帮助!干杯!

于 2012-08-23T12:34:34.050 回答