PICTURE進階 - Class類別

回覆文章
頭像
RSA
二等兵
二等兵
文章: 16
註冊時間: 2024-09-24, 13:21

PICTURE進階 - Class類別

文章 RSA »

嗨嗨!一起開發PICTURE的夥伴們,不知道平時寫程式的時候有沒有想過「重複使用程式碼」這件事?在軟體開發中,有一種設計典範(Programming paradigms)叫做「物件導向」可以幫助你實現這個想法。我們使用物件導向進行程式開發通常是為了提高程式碼的
  • 可維護性
  • 擴展性
  • 重複使用性
至於物件導向是怎麼設計以符合上述的三項需求呢?這個問題有需要的話日後會再分享一篇文章說明~讓我們先切入重點,了解一下什麼是物件導向中的「類別(Class)」,以及我們在PICTURE中要怎麼使用?

類別 這個概念有點像是要在程式的世界中去敘述在現實生活中、系統中的「某種」人、事、物的模板。為了敘述出這樣的角色,在物件導向的作法上我們會找出與這個角色相關的特徵以及動作。而在類別中我們有專門的術語來形容特徵,也就是「屬性」;形容動作,也就是「方法」。在圖一中,我們以圖示的方式來看employee的這個例子。

在公司裡,我們可以發現每個員工都會有一些屬於自己的基本資料跟各自負責的工作。我們把每一個員工都會有的基本資料跟員工都會進行的工作抽象出來就會變成類別中的屬性成員跟方法成員。在圖一中第二格中紀錄的就是我們對employee這種類別的屬性成員,第三格裡記錄的是方法成員。這邊特別要注意,在方法成員中一定得有建構子這個特別的函數存在。因為有這樣的方法我們才可以透過類別的來產生實例。那至於建構子要怎麼寫,這個就得視你使用的語言來做調整。有些語言是有預設的建構子,只要你宣告類別就算不特別寫,也可以呼叫這個函數。但有一些語言或特別的函數庫在使用上就會需要你把這個函數寫清楚。
class_example.png
class_example.png (12.59 KiB) 已瀏覽 474 次
圖一、類別範例employee

建構子?實例?那又是什麼?
我們換個例子來解釋~
類別與實例的關係就像章魚燒烤盤與章魚燒的關係,一個規範好了這種好吃麵糊的形狀,另一個則是章魚燒本人。建構子啟動「製作章魚燒」的這個關鍵動作。在圖二中,takoyaki = Takoyaki.new()是ruby 中呼叫建構子的語法。當我們使用建構子時,章魚燒機就會根據我們的預設原料跟流程去做一盒章魚燒給你。但假使今天你不想吃原味章魚燒而是芥末章魚燒該怎麼辦呢?那麼你可以在定義class Takoyaki的建構子函數時去指定引數得包含flavor的變數,並將這項資料存在相關的屬性成員欄位中。
class_takoyaki.jpg
class_takoyaki.jpg (273.66 KiB) 已瀏覽 474 次
圖二、章魚燒機與章魚燒

PICTURE上的實作
這次的範例很簡單,我們只會使用一個按鈕來實驗類別的效果!Ruby Script的部分則是有
  • init.rb : Startup script,在此定義Class
  • timerTest.rb : Timer script,會在進入畫面時彈出MessageBox顯示當前實例狀態
  • variableCheck.rb : 按鈕會呼叫此腳本,彈出MessageBox顯示更改後的實例狀態
操作影片如下
class_example.gif
class_example.gif (4.7 MiB) 已瀏覽 474 次
滿簡單的吧!那我們來看看程式~

在init.rb (圖三)這個startup腳本裡我定義了FANUC這個class。因為模板肯定是一開始就要準備好的材料,所以建議放在Startup script讓專案在剛開始編譯時就先認識它。在ruby 中你可以使用attr_accessor來宣告屬性成員。那可以看到裡面有一個initialize()這樣的函數,它就是剛才提到的建構子函數。在這個函數中我們會把傳入的參數存在個實例的屬性成員欄位並且跳出一個MessgeBox顯示當前姓名。

在這個範例中我的設計是你可以輸入員工的基本資訊來建立員工的實例。此外,員工這個類別還可以做namePrint() 跟 addSalary()兩種功能。

程式的最後是為了使用timerScript而使用的set_handler()函數,這部分就不贅述囉!
initrb.png
initrb.png (41.63 KiB) 已瀏覽 474 次
圖三、init.rb

Okay~~那接下來我們來看一打開App會執行的timerTest裡寫了什麼(圖四)
timerTest.png
timerTest.png (6.96 KiB) 已瀏覽 474 次
圖四、timerTest.rb

這裡你可以看到我就只有呼叫建構子建立一個名叫RSA的實例!
根據我們傳入的參數可以知道RSA這個人呢,他所儲存的相關屬性資料有
  • name = RSA
  • department = DX
  • salary = 100
那我們試著按按鈕改資料吧!我在variableCheck(圖五)中做了這個設定
variableCheck.png
variableCheck.png (7.48 KiB) 已瀏覽 474 次
圖五、variableCheck.rb

要讀寫實例的屬性資料,你只需要在【實例名稱】.【屬性名稱】就可以對這筆資料做讀寫。
想要使用實例的方法則是使用【實例名稱】.【方法】就可以啦!是不是很直觀、簡潔?
所以以上面的說明來理解這兩行程式碼,我在第一行把 RSA 的"name" 改成了 "Bernard"。並且在第二行透過 MessageBox 來顯示RSA 的 name。

以上是這次的類別使用分享。個人是覺得只要一熟悉這樣的概念,在做軟體開發上會更事半功倍!不僅是像開頭所說的幾個好處,以提高軟體的重用性、擴充性、可維護性在軟體開發生命週期中進行時間或金錢上的cost down。物件導向在當今的軟體開發領域中是一個太重要、太盛行的概念,所以有時候可能參考其他人的程式範例也會看到這樣的寫法。若是沒有掌握基本觀念的狀態下來進行程式碼的閱讀,那真的是非常痛苦的一件事。此外,在實際使用上的經驗也會發現越來越多函數庫都是以這樣的方式在做開發。所以為了使用更多的好用工具,花點時間了解物件導向我覺得是滿划算的投資。 @onion20@

希望透過以上的分享,可以讓閱讀這篇文章的你感受到物件導向的魅力並產生興趣與動力了解他!
Given enough eyeballs, all bugs are shallow (e.g., given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone).
Yungho
上士
上士
文章: 151
註冊時間: 2018-05-26, 19:49

Re: PICTURE進階 - Class類別

文章 Yungho »

收藏起來!
@onion20@
頭像
RSA
二等兵
二等兵
文章: 16
註冊時間: 2024-09-24, 13:21

Re: PICTURE進階 - Class類別

文章 RSA »

紀錄一下我在開發PICTURE的Ruby script踩過的雷 - ruby的實例名稱記得首字母要大寫
Given enough eyeballs, all bugs are shallow (e.g., given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone).
頭像
RSA
二等兵
二等兵
文章: 16
註冊時間: 2024-09-24, 13:21

Re: PICTURE進階 - Class類別

文章 RSA »

記錄到目前為止在PICTURE Ruby script 使用 Class 的應用場景:
  • 建立可跨腳本使用的陣列: 在Startup, Timer 或一般的script間都可以共用
  • 建立浮點數的全域變數: 在原本的PICTURE中可以使用的都是整數型態的全域變數,透過建立一個共用變數為目的的class就可以使用浮點數了
Given enough eyeballs, all bugs are shallow (e.g., given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone).
B2021
新兵
新兵
文章: 8
註冊時間: 2023-09-25, 16:37

Re: PICTURE進階 - Class類別

文章 B2021 »

按照大大的教學測試後,遇到一些問題想請教
我希望建立一個實例變數能夠在Timer Script內每秒+1
VAR_TEST是我的實例變數
Startup.png
Startup.png (73.82 KiB) 已瀏覽 232 次
Script(903)用來處理變數+1
Script903.png
Script903.png (41.45 KiB) 已瀏覽 232 次
TimerScript.png
TimerScript.png (1.13 KiB) 已瀏覽 232 次
實際運行後Pcode(27777)會每秒+1
但是實例變數的屬性都無法被正確賦值
請問是哪個步驟設定錯誤了嗎?
頭像
RSA
二等兵
二等兵
文章: 16
註冊時間: 2024-09-24, 13:21

Re: PICTURE進階 - Class類別

文章 RSA »

B2021 寫: 2025-07-21, 15:12 按照大大的教學測試後,遇到一些問題想請教
我希望建立一個實例變數能夠在Timer Script內每秒+1
VAR_TEST是我的實例變數
Startup.png
Script(903)用來處理變數+1
Script903.png
TimerScript.png
實際運行後Pcode(27777)會每秒+1
但是實例變數的屬性都無法被正確賦值
請問是哪個步驟設定錯誤了嗎?
在你的範例中無法正常賦值是因為PICTURE 的set_handler()中,type 1, 2這兩種與時間有關的腳本無法跨腳本共享變數或類別實例的關係。所以不是程式碼的問題,而是PICTURE原本就有的限制。
Given enough eyeballs, all bugs are shallow (e.g., given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone).
B2021
新兵
新兵
文章: 8
註冊時間: 2023-09-25, 16:37

Re: PICTURE進階 - Class類別

文章 B2021 »

了解!謝謝。
回覆文章