面向對象的 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 表達式。它可以使用函數式編程乾淨地完成您需要的一切。查看這篇文章,了解比較兩種編程方法的一些優缺點:代碼新手