---
# System prepended metadata

title: JS直播班#肉鬆BMI-kata經驗分享

---

# 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、嘗試其他的寫法!!!加油!!!






