iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0

在前面我們曾經說過世界上有很多種不同的程式語言,程式設計師們會依自己的專長,選一個適合的程式語言,像是寫 Apple iOS 會選 Swift,網頁前端選 JavaScript,寫網站選 Ruby 或是 Elixir 等。但這些語言的邏輯運作方式差異不會太多,通常學了一種之後,要上手其它的會快很多。(但精通就比較不容易)

不過有幾種語言跟上面的通用程式語言不同,能做的事很少,卻是所有程式設計師都應該要會的。

這些語言用來專門處理一個很獨特的領域,我們叫他們領域特定語言,英文縮寫是 DSL (Domain-Specific Language)。就像水果削皮刀,雖然不像一般刀子什麼都能切,但是想要削水果的果皮時就又快又方便。

而大家都要會的 DSL 有兩種:

  • 資料庫查詢用的 SQL
  • 文字模式匹配用的 Regular expression

資料庫

記得我們之前寫網頁應用程式時,把記帳的資料存在瀏覽器的 LocalStorage 裡嗎?我們那時有提到 LocalStorage 的容量蠻小的。想要存很多人的很多資料時,通常會用到資料庫這種東西。

如果你在上電腦課時用過 Excel,就想像資料庫是一種可以存無敵多張 Excel 表的倉庫就可以了。

世界上有很多種資料庫

最主流的資料庫叫關聯式資料庫,著名的有 MySQL、PostgresQL 及 MS SQL,以及手機或是單機程式用,輕量的 SQLite。

[補: MySQL、PostgresQL 及 MS SQL 圖示]

當然還有其它不同功能,但不是用一般 SQL 操作的資料庫。但只要知道這件事就好了。

SQL 程式碼大概長這樣

我們會在資料庫裡做的事,基本上分成四種,新增 (Create)、查詢 (Read)、修改 (Update) 及刪除 (Delete)。這四個動作用英文字開頭簡稱 CRUD

-- 新增學生資料
INSERT INTO students (name, age, grade) VALUES ('王小明', 10, '四年級');

-- 查詢特定學生
SELECT * FROM students WHERE name = '王小明';

-- 查詢年齡大於 10 歲的學生
SELECT * FROM students WHERE age > 10;

-- 修改王小明年齡
UPDATE students 
SET age = 11 
WHERE name = '王小明';

-- 刪除年齡小於 8 歲的學生
DELETE FROM students WHERE age < 8;

文字模式比對

你有沒有用過一些網站,在輸入 email 帳號,或是身份證字號時,會很快的跟你說「這個 email/身份證的格式不對,請重新輸入」呢?

我們之前有教過 if/else 語法,那麼我們來想像一下,要用幾個 else if 條件,才能把所有輸入的文字是正確 email 格式的可能性都列出來比較呢?

答案是:辦不到,因為輸入的文字有無限多種組合,要一個個列出條件,列到世界末日也列不完。

那麼這個功能是怎麼辦到的呢?就是用 正規表示法(Regular expression),來比對文字的格式

所謂的格式,就像是「這段文字前面有幾個英文或數字,後面跟著一個 @。再接著是幾個英文或數字,再跟著一個 .」...之類的。

Regular expression 範例

Regular expression 這個英文字太長,常常被縮寫成 Regex。

Regex 寫起來非常像外星文 👽。下面是簡單的判斷 email 格式的 regex。

^[\w\.-]+@[\w\.-]+\.\w+$

如果你看了之後,心裡發出很大的「ㄏㄚˊ ???」,是超級正常的,快速解釋一下:

^           開頭
[\w\.-]+    一個或多個:字母、數字、底線、點、減號
@           一定要有 @
[\w\.-]+    一個或多個:字母、數字、底線、點、減號
\.          一定要有點
\w+         一個或多個:字母或數字
$           結尾

其它的 DSL

除了 SQL 跟 Regex 之外,還有很多不同的 DSL,有些是自己獨特的語法,例如用來處理網路程式間傳輸資料的 jq。

有些是跑在通用語言裡的 DSL,例如寫自動化測試程式時,Ruby 的 RSpec 及 Elixir 的 ExUnit,看起來像是在讀英文的規格書一樣,不懂程式的人也能猜出在做什麼,相當漂亮。

(跟 Regex 完全相反,很多人寫出了會動的 Regex,過一個月自己就看不懂了。)

自己寫 DSL

如果有一天,你想要自己設計程式語言,來解決特定的問題時,可以考慮用某些很靈活的語言,來設計一套自己的 DSL。

適合做這件事的程式語言有 Elixir, Ruby, Kotlin 及 Lisp 這個比較小眾的語言,Python 跟 JavaScript 勉強可以做到。

營火前的複習

  • 領域特定語言 (DSL) 不像通用語言什麼事都能做,會用來做特定的事
  • SQL 會用來處理資料庫查詢
  • 處理資料庫的動作基本上有四種,簡稱 CRUD。
  • 有很多種資料庫,最有名的是 PostgresQL 、MySQL 及單檔案的 SQLite
  • Regular expression 專門用來比對文字的格式
  • Regular expression 很像外星文,但會寫的人很厲害。
  • 高手可以自己寫 DSL !

地圖



上一篇
Ch 23. 怎麼查字典最快?
下一篇
Ch 25. 用不同的角度來看待邏輯與資料
系列文
Just enough code with AI: 給新手們的程式設計世界觀26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
taiansu
iT邦新手 3 級 ‧ 2025-10-10 00:00:12

壓線更新完成 XD

我要留言

立即登入留言