資料的四種呈現
從事應用軟體開發,常需要考慮四種資料呈現方式:資料儲存、資料傳輸、使用者介面、業務邏輯
這兩天我寫了一段程式碼,又應用到了生成式 AI 。我在開發給技術會議 (technical conference) 使用的軟體,正在開發的功能需要從資料庫裡,取出一個表示時間的資料,並且將其做一些處理,並且顯示在網頁上。
一方面,已知從資料庫取出的時間,其資料型別是 java.time.Instant 。
另一方面,在網頁上的呈現則會是如下圖。
於是,我給的 prompt 如下
有一個表示時間變數的 x ,它的型態是 java.time.Instant ,我需要取得時間 x 所對應的星期幾、幾月幾日、時間,請用 Clojure 來示範如何處理。這個函式的輸出格式為
{:week-day "Wednesday" :date "18.09" :time "16:15"}
而我得到的程式碼如下:
(ns example.core
(:import [java.time Instant ZonedDateTime ZoneId]
[java.time.format DateTimeFormatter]))
(defn format-instant [instant]
(let [zone-id (ZoneId/systemDefault)
zdt (ZonedDateTime/ofInstant instant zone-id)
day-of-week (.getDayOfWeek zdt)
month (.getMonthValue zdt)
day-of-month (.getDayOfMonth zdt)
time (.toLocalTime zdt)
time-str (format "%02d:%02d" (.getHour time) (.getMinute time))
date-str (format "%02d.%02d" month day-of-month)]
{:week-day (.name day-of-week)
:date date-str
:time time-str}))
;; 範例使用
(def x (Instant/now))
(println (format-instant x))為了複用性而改寫
考慮到之後的可複用性,我把 chatGPT 生成的程式碼改成:
(defn datafy-instant [instant]
(let [zone-id (ZoneId/systemDefault)
zdt (ZonedDateTime/ofInstant instant zone-id)
day-of-week (.getValue (.getDayOfWeek zdt))
month (.getMonthValue zdt)
day-of-month (.getDayOfMonth zdt)
time (.toLocalTime zdt)]
{:hour (.getHour time)
:minute (.getMinute time)
:day-of-week day-of-week
:month month
:day-of-month day-of-month}))這樣子改寫 format-instant 之後,新的 datafy-instant 只做了將 java.time.Instant 改成用五個整數來表示,省略了格式化的工作。於是,如果日後網頁的呈現還有許多其它的修改,比方說,從德國式的 18.09 改寫成我們常用的 09.18 ,現在的這個 datafy-instant 函數都不用修改,只要修改格式化的函數即可。
不同的階段、不同的考量
仔細思考的話,同一個資料,當它處在不同的階段會有不同的考量,也因此會需要不同的呈現方式。
以資料儲存來講,首要的考慮自然是節省空間,是否人可以直接閱讀則不是最重要的。
以資料傳輸來講,節省空間當然也是很重要、如果人可以直接閱讀的話更好。
以使用者介面來講,因為要考慮一般使用者的理解,所以要考慮區域化、美觀因素,所以這個階段通常是以「字串」的格式,甚至是圖的格式來輸出。
以業務邏輯來講,資料通常以『鍵/值』的集合來呈現最適合。
不同階段會有不同考量,似乎也不是那麼容易解釋給 chatGPT 理解,所以,真的有需要的時候,我還是自己動手改寫吧。



