iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Mobile Development

攜手神隊友ChatGPT:攝護腺自我照護App開發歷程!系列 第 9

D9-Records介面,國際攝護腺症狀評分表輕鬆填_part3

  • 分享至 

  • xImage
  •  

Part1:今日目標

1.問題討論&問卷資料傳輸流程
2.程式實作
3.Dart語言學習: 縮減操作(reduce/fold)

Part2:今日內容

1.問題討論&問卷資料傳輸流程

Q: 每題的分數是如何被計算和"症狀總分"如何加總

  • 每個問題的分數基於用戶選擇的選項動態計算。
  • 所有問題的選項都有固定的選擇,例如 '從來沒有', '幾乎沒有', '少於一半', '大約一半', '大於一半', '幾乎總是'。每個問題都有一個唯一的標識符,如'Q1', 'Q2'等。
  • "症狀總分"是所有問題分數的總和,使用 scores.values.reduce((a, b) => a + b) 計算。
  • ScoreHistoryDB _scoreHistoryDB是用於處理分數歷史數據庫的操作的實例。

Q: 每次分數加總後,要如何存到手機資料庫

  • 當用戶按下「儲存」按鈕後,會調用 saveScoreAndDate(int totalScore) 方法,此方法會將當前的總分和日期保存到數據庫中。
  • saveScoreAndDate 此方法首先獲取當前的日期和時間,然後將其格式化為ISO 8601格式,然後它會打開數據庫並將總分和格式化的日期插入到數據庫中。

Q: 有什麼額外有趣的介面設計

  • 根據用戶的總分更改背景顏色: 總分小於或等於7時,背景色為黃色;總分小於或等於19時,背景色為綠色;否則,背景色為紅色。透過強烈且直觀的背景色改變,來有效提醒使用者評分狀況,警示症狀的嚴重程度。
    https://ithelp.ithome.com.tw/upload/images/20230912/20120073jgxJSeZzhk.png

Part2: 程式實作

程式碼在昨天的鐵人賽文章中 D8-Records介面,國際攝護腺症狀評分表輕鬆填_part2

Part3: Dart語言學習: 縮減操作(reduce/fold)

// 縮減操作: reduce
scores.values.reduce((a, b) => a + b)

// 等同於以下
int sum = 0;
for (var score in scores.values) {
    sum += score;
}

這段 Dart 語法 scores.values.reduce((a, b) => a + b) 是一種縮減(或稱累積)操作,它對 scores 這個字典的所有值進行運算並返回一個單一的結果。

  • 這裡的 scores 是一個字典,它的每個鍵對應一個問題,而每個值對應該問題的分數。

  • 逐步解釋這段語法:

    • scores.values**:這將返回 scores 字典中的所有值,即所有問題的分數。
    • .reduce((a, b) => a + b):這是一個縮減操作,它將會逐步處理 scores.values 中的每個值。
    • (a, b) => a + b:這是一個匿名函數,它接受兩個參數 ab。在每一步中,它將這兩個參數相加,然後返回結果。
    • 縮減操作將開始於列表的前兩個元素。結果(這兩個值的和)將被用作下一次調用的第一個參數,而下一個值將被用作第二個參數,如此繼續,直到列表的所有元素都被處理完畢。
  • 舉例:scores.values 為 [1, 2, 3, 4, 5],則縮減操作將進行如下:
    1 + 2 = 3
    3 + 3 = 6
    6 + 4 = 10
    10 + 5 = 15
    最後的結果是 15。

  • 在 Python 中,這種操作可以使用 functools.reduce 函數實現。例如:

from functools import reduce

values = [1, 2, 3, 4, 5]
result = reduce(lambda a, b: a + b, values)
print(result)  # Output: 15
  • 補充:
    縮減操作在不同的語境和語言中可能有不同的稱呼,但在大多數功能性編程語言和環境中,這種操作被稱為 "reduce"。因此,其正式英文名稱是 "reduce",有時也被稱為 "fold"。

    • Reduce:這是其最常見的名稱。在 JavaScript、Python(透過 functools.reduce)和許多其他語言中,都使用這個名稱。
    • Fold:這是另一個常見名稱,特別是在某些功能性語言如 Haskell 中。在這些語言中,你可能會看到名稱如 "foldl"(從左縮減)或 "foldr"(從右縮減)。

總結,"reduce" 或 "fold" 是一種將列表(或其他集合)的元素組合成單一值的操作。這通常是通過反覆使用一個給定的二元運算(匿名函數或 lambda 函數)來實現。

幸福並不是曾經, 而是妳要把接下來的日子,過成什麼樣子 - 角子
Happiness isn't about the past; it's about how you choose to live your days ahead.
今日要聽陳柏霖《我不會喜歡你》


上一篇
D8-Records介面,國際攝護腺症狀評分表輕鬆填_part2
下一篇
D10-輕巧強大SQLite: Flutter開發的秘密武器
系列文
攜手神隊友ChatGPT:攝護腺自我照護App開發歷程!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言