# JS直播班#肉鬆BMI-kata經驗分享 https://hackmd.io/eqgyCOyfSsyYMhi12Uabmw?edit #### ※windows10系統下作業※ ## 1.用了哪些軟體錄製跟記錄倒數 ### 1-1錄製軟體:ActivePresenter ### 安裝 安裝網址:https://atomisystems.com/download/ 錄製前,請開啟VS Code Toggle Screencast Mode 模式 ### 錄影 打開軟體,點選錄製視頻 ![](https://i.imgur.com/4bDaHAu.png) 選擇全屏點擊 REC(),個人將聲音調成靜音模式 ![](https://i.imgur.com/A2vd60y.png) 系統介面右下角暫停、停止 ![](https://i.imgur.com/u5vRPJP.png) 錄製完成後介面 ![](https://i.imgur.com/hPPkp9e.png) ### 上傳 這裡跟老師的教學不同,軟體導出沒有上傳Youtube選項,所以手動導出影片、手動上傳Youtube ### 1-2記錄倒數軟體:focus booster ### 安裝 安裝網址:https://www.focusboosterapp.com/ 介面 ![](https://i.imgur.com/ojvwM45.png) 時間設定 ![](https://i.imgur.com/X63rLSB.png) ### 1-3撰寫用軟體VS Code #### 插件:Chinese (Traditional) Language Pack for Visual Studio Code 將VS Code變成中文化,這是一定要的啦,畢竟我英文不好XD.. #### 插件:Live Server 即時將結果顯示於網頁上,不需要一直重新整理,減少時間,畢竟時間就是金錢!!! #### 個人VS Code設定(按ctrl+S儲存後程式自動排版) 點選左下角齒輪→設定 ![](https://i.imgur.com/tcfQbFi.png) 輸入"Format On Save">將它打勾,存檔時就會自動排版,減少對眼睛的負擔,也會比較好維護~~ ![](https://i.imgur.com/lISqrQV.png) ## 2.如何做前置作業,以及安排視窗切割 ### 前置作業 1.首先了解BMI的規則及題目的要求 2.查看老師錄製的影片內容並反覆跟著練習 3.去嘗試了解老師撰寫程式碼的涵義及邏輯 4.不急著撰寫程式,依照流程圖去構思程式如何撰寫 5.把需要的資料整理出來,方便複製 6.準備撰寫程式 ### 視窗安排 主要分成四個區塊 1→把需要的資料整理出來,方便複製(主要是為了減少秒數XD) 2→主要撰寫程式的區域 3→顯示鬧鐘為了提醒自己剩餘時間 4→即時觀看console.log結果 ![](https://i.imgur.com/83l83Jx.png) ## 3.編輯器熱鍵分享 本身沒有設定熱鍵..小小新手,都是常用基本熱鍵: 存檔:ctrl + s 複製:ctrl + c 貼上:ctrl + v 還原:ctrl + z 選取多個相同名稱:ctrl + d 使游標移到檔案的第一行:home 使游標移到檔案的最後一行:end 快速打出console.log:輸入log+tab ## 4.BMI kata 的程式碼分享 ### 第一階段:請寫 printBmi 函式,並印出對應狀態 ```scss= printBmi(178, 20) >> 印出 console.log 文字為「您的體重過輕」 printBmi(178, 70) >> 印出 console.log 文字為「您的體重正常」 printBmi(178, 85)>> 印出 console.log 文字為「您的體重過重」 printBmi(178, 90)>> 印出 console.log 文字為「您的體重輕度肥胖」 printBmi(178, 110)>> 印出 console.log 文字為「您的體重中度肥胖」 printBmi(178, 130)>> 印出 console.log 文字為「您的體重重度肥胖」 printBmi("身高","體重")>> 印出 console.log 文字為「您的數值輸入錯誤,請重新輸入」 ``` 第一階段程式碼如下: ```scss= //計算BMI function printBmi(height, weight) { let bmi = (weight / (height / 100) ** 2).toFixed(2); let mode; console.log(bmi); //查看bmi計算的值是否正確 if (bmi < 18.5) { mode = '過輕'; } else if (bmi >= 18.5 && bmi < 24) { mode = '正常'; } else if (bmi >= 24 && bmi < 27) { mode = '過重'; } else if (bmi >= 27 && bmi < 30) { mode = '輕度肥胖'; } else if (bmi >= 30 && bmi < 35) { mode = '中度肥胖'; } else if (bmi >= 35) { mode = '重度肥胖'; } else { console.log('您的數值輸入錯誤,請重新輸入'); return; } console.log(`您的體重${mode}`); } //呼叫 printBmi(178, 20); printBmi(178, 70); printBmi(178, 85); printBmi(178, 90); printBmi(178, 110); printBmi(178, 130); printBmi("身高", "體重"); ``` 解題流程: 1. 首先了解題目需求 1. 以printBmi(178, 20) >> 印出 console.log 文字為「您的體重過輕」為例 1. 代表printBmi輸入身高178,體重20,會顯示您的體重過輕此狀態 1. 命名函式printBmi(height,weight),height及weight為自定義參數(代表身高及體重) 1. 宣告一個變數bmi等於BMI的計算規則→BMI = 體重(公斤) / 身高2(公尺2) 1. if else去判斷BMI算出的值位於else if哪一個階段並console.log顯示對應文字,若都不符合if 及else if條件則return回傳else中的狀態 ※程式碼與老師影片內容沒有太大差異,但部分我做了優化 1. 針對BMI結果去顯示console.log,後來想到的是我宣告一個變數為mode,並讓他被賦予題目需要的狀態,最後用console.log顯示mode被賦予變數的值,達到減少console.log重複的次數 ### 第二階段:請程式碼裡加入此變數,並嘗試運用此變數裡的資訊 ```scss= printBmi(178, 20) >> 印出 console.log 文字為「您的體重過輕,健康指數為藍色」 printBmi(178, 70) >> 印出 console.log 文字為「您的體重正常,健康指數為紅色」 printBmi(178, 85)>> 印出 console.log 文字為「您的體重過重,健康指數為澄色」 printBmi(178, 90)>> 印出 console.log 文字為「您的體重輕度肥胖,健康指數為黃色」 printBmi(178, 110)>> 印出 console.log 文字為「您的體重中度肥胖,健康指數為黑色」 printBmi(178, 130)>> 印出 console.log 文字為「您的體重重度肥胖,健康指數為綠色」 printBmi("身高","體重")>> 印出 console.log 文字為「您的數值輸入錯誤,請重新輸入」 ``` 第二階段程式碼如下: ``` scss= //變數資訊 const bmiStatesData = { "overThin": { "state": "過輕", "color": "藍色" }, "normal": { "state": "正常", "color": "紅色" }, "overWeight": { "state": "過重", "color": "澄色" }, "mildFat": { "state": "輕度肥胖", "color": "黃色" }, "moderateFat": { "state": "中度肥胖", "color": "黑色" }, "severeFat": { "state": "重度肥胖", "color": "綠色" }, } //計算BMI function printBmi(height, weight) { let bmi = (weight / (height / 100) ** 2).toFixed(2); let mode; console.log(bmi); //查看bmi計算的值是否正確 if (bmi < 18.5) { mode = 'overThin'; } else if (bmi >= 18.5 && bmi < 24) { mode = 'normal'; } else if (bmi >= 24 && bmi < 27) { mode = 'overWeight'; } else if (bmi >= 27 && bmi < 30) { mode = 'mildFat'; } else if (bmi >= 30 && bmi < 35) { mode = 'moderateFat'; } else if (bmi >= 35) { mode = 'severeFat'; } else { console.log('您的數值輸入錯誤,請重新輸入'); return; } bmiText(mode); } //加入變數資訊 function bmiText(mode) { console.log(`您的體重${bmiStatesData[mode].state},健康指數為${bmiStatesData[mode].color}`); } //呼叫 printBmi(178, 20); printBmi(178, 70); printBmi(178, 85); printBmi(178, 90); printBmi(178, 110); printBmi(178, 130); printBmi("身高", "體重"); ``` 解題流程: 1. 首先了解題目需求 1. 第二階段跟第一階段相比,多了健康指數狀態顯示對應顏色,但這些資訊被賦予在bmiStatesData的物件中,所以勢必要去讀取物件中的對應資訊 1. 命名函式bmiText(mode),此mode參數要讀取bmiStatesData中字串對應的資訊 1. 這裡將原本第一階段mode的字串改成bmiStatesData物件中的字串名稱 1. 最後把函式bmiText(mode)寫入函式printBmi(height, weight) ※程式碼與老師影片內容沒有太大差異,與第一階段的優化相同 1. 針對BMI結果去顯示console.log,後來想到的是我宣告一個變數為mode,並讓他被賦予題目需要的狀態,並帶入到函式bmiText(mode)中,最後用console.log顯示mode被賦予變數的值 ### 第三階段:儲存每筆計算資料,多一個變數為 bmiHistoryData,並賦予空陣列來儲存計算物件資料,若數值輸入錯誤,則不儲存 ```scss= printBmi(178, 20) >> 印出 console.log 文字為「您的體重過輕,健康指數為藍色」 printBmi(178, 70) >> 印出 console.log 文字為「您的體重正常,健康指數為紅色」 printBmi(178, 85)>> 印出 console.log 文字為「您的體重過重,健康指數為澄色」 showHistoryData() >> 印出 console.log 文字為「您總共計算 3 次 BMI 紀錄,最後一次 BMI 指數為 26.83,體重過重!健康指數為澄色!」 ``` 第三階段程式碼如下: ```scss= //變數資訊 const bmiStatesData = { "overThin": { "state": "過輕", "color": "藍色" }, "normal": { "state": "正常", "color": "紅色" }, "overWeight": { "state": "過重", "color": "澄色" }, "mildFat": { "state": "輕度肥胖", "color": "黃色" }, "moderateFat": { "state": "中度肥胖", "color": "黑色" }, "severeFat": { "state": "重度肥胖", "color": "綠色" }, } let bmiHistoryData = []; //計算BMI function printBmi(height, weight) { let bmi = (weight / (height / 100) ** 2).toFixed(2); let mode; console.log(bmi); //查看bmi計算的值是否正確 if (bmi < 18.5) { mode = 'overThin'; } else if (bmi >= 18.5 && bmi < 24) { mode = 'normal'; } else if (bmi >= 24 && bmi < 27) { mode = 'overWeight'; } else if (bmi >= 27 && bmi < 30) { mode = 'mildFat'; } else if (bmi >= 30 && bmi < 35) { mode = 'moderateFat'; } else if (bmi >= 35) { mode = 'severeFat'; } else { console.log('您的數值輸入錯誤,請重新輸入'); return; } bmiText(mode); addData(bmi, mode); } //加入變數資訊, function bmiText(mode) { console.log(`您的體重${bmiStatesData[mode].state},健康指數為${bmiStatesData[mode].color}`); } //加入陣列資料 function addData(bmi, mode) { let obj = {}; obj.bmi = bmi; obj.mode = bmiStatesData[mode].state; obj.color = bmiStatesData[mode].color; bmiHistoryData.push(obj); } //印出最後一次BMI紀錄 function showHistoryData() { let len = bmiHistoryData.length; //陣列長度 let record = bmiHistoryData[len - 1]; //陣列中的資料,因為陣列中的第一筆為0所以-1 console.log(`您總共計算 ${len} 次 BMI 紀錄,最後一次 BMI 指數為 ${record.bmi},體重${record.mode}!健康指數為${record.color}!`); } //呼叫 printBmi(178, 20); printBmi(178, 70); printBmi(178, 85); // printBmi(178, 90); // printBmi(178, 110); // printBmi(178, 130); // printBmi("身高", "體重"); showHistoryData(); ``` 解題流程: 1. 首先了解題目需求 1. 題目要求多一個變數為bmiHistoryData,並賦予空陣列來儲存資料,所以就必須宣告一個變數bmiHistoryData並賦予值為空陣列 1. 命名函式addData(bmi, mode),把要加入的資料寫入一個物件中 1. 題目提到showHistoryData()要顯示一段文字,而文字內容來自陣列中的物件資料 1. 命名函式showHistoryData()顯示儲存在陣列中的物件資料 ※程式碼與老師影片內容沒有太大差異,老師也有提出的建議(已修改) 1. 原先陣列中的資料我並沒有把他存入物件中,是直接把變數push進去陣列中導致相同字串過多程式也冗長,後來改用老師的建議,push嘗試用物件格式,將重要資訊存入屬性,消除了許多相同字串存放 1. 個人也針對showHistoryData()函式去設定變數,最後要讀取變數資料時不會讓程式碼過於複雜 ### codepen網址:https://codepen.io/klrkicog/pen/poNOwBp?editors=0011 ## 5.如何安排時間與頻率來進行訓練 其實沒有特別規劃什麼時間點去限制練習,因為很想拿到vue的書,哈哈哈!!! 所以禮拜五上完直播班的課程後就馬上去觀看老師錄製的影片內容,然後跟著練習 禮拜六早上開始思考老師撰寫的程式邏輯,一開始真的不管怎麼練習怎麼卡 有時候練習到一半甚至整個人突然呆滯,一直去思考自己的邏輯是否正確,懷疑人生... 後來反覆練習,反覆去思考如何優化自己的程式碼,多練習讓自己的邏輯清晰一些 最後才有現在寫出的code,並達到5分內,錄影時真的是蠻緊張的XD 接下來幾天我也會繼續去思考是否還有程式優化的空間 或是參考其他學員code、嘗試其他的寫法!!!加油!!!