almost 4 years ago

一般的 loop 處理

如底下的範例
想要將 list 內的 email 轉成小寫

var mixedEmails = ['JOHN@ACME.COM', 'Mary@FooBar.com', 'monty@spam.eggs'];

function getEmailsInLowercase(emails) {
  var lowercaseEmails = [];

  for (var i = 0; i < emails.length; i++) {
    lowercaseEmails.push(emails[i].toLowerCase());
  }

  return lowercaseEmails;
}

var validData = getEmailsInLowercase(mixedEmails);

而這種寫法會造成程式口述行為的暴增

1.我們告訴電腦需要建立一個暫存的 lowercaseEmails list 然後存放另一個 emails list 內的轉換小寫的 email
2.我們告訴電腦需取 emails 的總數(emails.length)來正確的執行整個 loop 的次數
3.我們告訴電腦需建立一個位址變數(var i = 0)來計算目前執行到 list 的哪個位置
4.我們告訴電腦要如何記錄位址變數要怎計算 (i < emails.length and i++)

以上就是用口述的方式, 來描述整個函數的行為

使用 map 簡化口述的行為

var mixedEmails = ['JOHN@ACME.COM', 'Mary@FooBar.com', 'monty@spam.eggs'];

function getEmailsInLowercase(emails) {
  var lowercaseEmails = [];

  emails.map(function(email) {
    lowercaseEmails.push(email.toLowerCase());
  });

  return lowercaseEmails;
}

var validData = getEmailsInLowercase(mixedEmails);

此範例我們精簡掉電腦如何處理 位址變數 跟利用位址變數取出正確 list 的口述

但這樣的口述流程還是太多
我們告訴電腦需要建立一個暫存的 lowercaseEmails list 然後存放 mixedEmails list element 轉成小寫的內容

利用 Map 特性消除更多的細節

var mixedEmails = ['JOHN@ACME.COM', 'Mary@FooBar.com', 'monty@spam.eggs'];

function downcase(str) {
  return str.toLowerCase();
}

var validData = mixedEmails.map(downcase);

此時口述簡化到

我們告訴電腦將 mixedEmails 的內容轉成小寫

這樣精簡的好處是
1.我們建立了一個精簡的 interface 一個 value in 一個 value out
2.有較少的處理動作, 讓維護者更容易了解
3.實現函數內只處理一件事, 讓此函數能更有彈性的與其他功能結合使用

結論

減少主要程式的口述行為有助於後續維護者對程式的了解
因為維護者不見得會想要清楚知道各個函數內的處理細節
但他們一定很想馬上知道 各個函數行為函數處理後的結果

所以在開發階段時要不斷的思考程式中的口述行為是否 清楚簡短

← 物件函數的命名 URL的長度限制 →
 
comments powered by Disqus