面向对象的 JSL - 示例?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />继德鲁·福利亚 (Drew Foglia) 在欧洲发现会议上发表的精彩演讲之后(面向对象的 JSL – 编写可维护/可扩展的 JSL 代码的技术),我正在尝试编写我的第一个面向对象的 JSL。
我能够使用 ObjectClass.jsl(来自 Drew 提供的核心示例文件)来获取和设置我创建的对象的属性。
我的问题是,是否有人可以分享一些简单的例子,以了解这个想法的实施方式。 例如,下面的示例看起来如何作为对象(考虑到在现实世界中我可能想要存储诸如表名,不。科尔斯,列名称,不。每个表的行、标签列等)?
名称默认到这里(1);
dt1 = 打开("$SAMPLE_DATA/Cars.jmp");
dt2 = Open("$SAMPLE_DATA/汽车 1993.JMP");
//连接表(假设使用某些函数来查找匹配的列名称)
dt3 = 数据表( dt1 ) << Join(
With( 数据表( dt2 ) ),
合并同名列,
通过匹配列( Column(dt1,1) = Column(dt2,1), Column(dt1,2) = Column(dt2,2) ),
删除倍数( 0, 0 ),
包括不匹配项( 0, 0 ),
保留主表顺序( 1 )
);
//显示结果
win1 = dt3 << 图形生成器(
尺寸(534、447)、
显示控制面板( 0 ),
变量( X( :尺寸 ), Y( :名称( "轮距(英寸)" ) ) ),
元素( 点( X, Y, 图例( 38 ) ), 箱线图( X, Y, 图例( 39 ) ) )
);
//整理
win1 << 关闭时(dt1 << 关闭窗口;dt2 << 关闭窗口; dt3 << 关闭窗口(不保存) );
我什么时候决定创建一个新班级? 只要我能记住我已将哪个属性分配给哪个键,通用 ObjectClass 对于表就可以很好地工作!
谢谢,
斯蒂芬
回复:面向对象的 JSL - 示例?德鲁福利亚
首先,我喜欢你在这方面的细节。如果您不介意我唱反调,为什么当函数返回名称空间时要创建顶级名称空间?命名空间不会堆叠,并且在除一个示例之外的所有示例中,该命名空间中的唯一函数是实例函数。我只是认为该类应该可以通过名称进行实例化,并且所有内容都应该在其中,而不是 ObjectClass:newObject()。我只是好奇你的思维过程。
我已经嘲笑面向对象的东西有一段时间了,但你的“this=namespace(expr(ns<
谢谢,
文斯
回复:面向对象的 JSL - 示例?斯蒂芬·皮尔逊
我知道德鲁福利亚已经回答了你的问题,但是,我正在起草一个答复,所以我只是提出它的价值。
首先,在我看来,数据表本身已经可以被认为是一个对象。
dt1 = NewTable() - 创建数据表的新“实例”
ShowProperties(dt1) - 显示数据表对象 dt1 的所有“属性”和“方法”。
人们可以考虑使用附加属性和方法“扩展”现有的数据表对象,如 Drew 的回复中所示。 我考虑过添加额外的功能,例如:
1.行状态处理程序。
2. 列和行、添加/删除检测。
3. 表格单元格更改历史记录。
4. 数据框(显示框)
因此,DatatableObject 的可能“构造函数”可能如下所示,其中声明了成员变量和函数。 (注意 Expr( New Namespace() )。
以这种方式声明对象背后的想法不仅是建立一个可复制的实体,而且还允许人们清楚地看到一旦完全定义就可以使用的函数和表达式名称。

我的 NewDatatableObject 版本(部分列表)。 这是成员函数实际定义的地方:


例如,我们创建 2 个独立的 DatatableObject 实例:

这些表现在具有内置的“扩展”属性。 在此示例中,跟踪一些表操作,例如检测行选择和列/行删除。


人们还可以想象许多其他有用的功能,也可以使用这种方法来实现。
回复:面向对象的 JSL - 示例?你好,菲利普
这是非常微妙的。 如果您查看 DataTableClass 定义的第 30 行,您将看到以下内容:

super 被定义为局部变量(作用域为函数的生命周期),并被分配已存在的 deleteChildReferences 函数的定义。
再读一遍。
让我换个方式说吧。 命名空间上已经有一个函数,deleteChildReferences(在包含的 ObjectClass.jsl 中定义,并在执行第 6 行的 ObjectClass:newObject() 调用时进行分配)。 在 DataTableClass 中,第 29 行替换了该分配。 然而,在重新分配的过程中,我们创建了一个局部变量“super”,它保存对原始函数定义(在 ObjectClass 中声明的函数定义)的引用。 通过这种方式,我们可以重写该函数的行为,添加代码来关闭本例中的表引用,然后仍然可以使用 super() 调用来调用原始函数声明。
回复:面向对象的 JSL - 示例?德鲁福利亚,
这真的很有帮助,谢谢。 我当前的项目具有非线性交互,因此我认为这种方法将更容易地让我处理从用户收集的元数据。
回复:面向对象的 JSL - 示例?德鲁福利亚
如果我错过了请原谅我,但是“super()”在哪里?定义?
回复:面向对象的 JSL - 示例?斯蒂芬·皮尔逊,
我很抱歉这么长时间才回复。 对于您提供的示例,我将给出“类”定义及其用途的示例。 重要的是要考虑您是否想要/需要这个。 正如您所指出的,“您什么时候决定开设新课程?” 您可能还记得我的演讲,我建议在确定 OO 构造是否是最佳方法之前应考虑项目规模、协作开发、寿命、重用需求等。 我会回应姆夏普的评论以及有关该主题的更多内容。
回到你的例子。 使用 ObjectClass 作为父类(尽管不是必需的),我们可以创建一个 DataTableClass:

DataTableClass 实例的字段用法如下所示:

对于这样一个简单的例子,没有理由使用面向对象的结构。 但是,如果您要考虑这样一种情况:您想要管理表集合,使用户和外部系统能够添加注释和其他属性,传递这些集合,处理和响应给定事件,计划未来的扩展和扩展,建立一个“契约”,其他人可以通过它轻松地使用这些表等。然后,使用诸如此类的面向对象结构是非常有益的。
回复:面向对象的 JSL - 示例?别误会我的意思。OOP 是一种伟大的方法,可以产生出色的代码,但是 FP 也是如此。如果您是一位经验丰富的程序员,您将能够以 FP 方式编写出所需质量的代码,并且编写伪 OOP 更多的是关于它是否可以完成而不是应该完成的练习。如果您是一名只了解 OOP 的中级程序员,因此想以熟悉的方式进行编码,我建议您学习 FP,因为它将帮助您成长、以不同的方式思考并更好地使用多种语言进行编程。如果您是一名只了解 FP 的中级程序员,并且想要学习 OOP 来拓宽您的视野,我建议您先学习另一种语言,该语言实际上在该语言中实现了类和对象。如果您是一个真的什么都不知道的新手程序员,并且您只是听说 OOP 很酷,那么请接受我的建议,暂时忘记它。特别是如果您主要使用 JSL 编写脚本。
就我个人而言,我会等到JMP实现类和对象,这样才能实现真正的OOP。我不确定这是否在他们的雷达范围内,但我确信它会发生,我的意思是,我们现在在 JavaScript 中有类和对象。你永远不知道未来会带来什么。
回复:面向对象的 JSL - 示例?斯蒂芬·皮尔逊,
我很高兴看到其他人对这个话题感兴趣。姆夏普说 JSL 不是 OOP 语言是正确的。 但是,最近我已经能够在 JSL 中实现“伪 OOP”构造。 我很高兴与您分享我的工作。 我会看看是否可以对您提出的问题做出适当的答复...... 支持
菲尔
回复:面向对象的 JSL - 示例?只是我的 2 美分:忘记你在那次演讲中学到的一切。
JSL 不是面向对象的语言。OOP 对于没有内置数据结构的语言来说非常有用,但它远不是唯一的编程方式。然而,大多数具有 Java、C++、C# 背景的程序员无法理解非 OOP 方式的编程。在 JMP 中,数据结构最好留给数据表。这有好处也有坏处。在我看来,您可以将 JSL 数据表中的 Frankenstein 对象散列在一起,但这样您就会面临所有缺点,而没有任何好处。
什么JSL我S擅长的是函数式编程。JSL 支持函数 AND 表达式。它可以使用函数式编程干净地完成您需要的一切。查看这篇文章,了解比较两种编程方法的一些优缺点:代码新手