over 2 years ago

看個例子

public int square(int x) {
    return x * x;
}

上述 square 函數提供了一組 input 接收參數 int x
也清楚描述 output return int

再看下個例子

public void processNext() {
    Message message = InboxQueue.popMessage();

    if (message != null) {
        process(message);
    }
}

這邊隱藏了 input InboxQueue 的 popMessage()
也隱藏了 output process 的處理結果

在不清楚 InboxQueue 的行為下
只看 processNext 函數名稱
其實也猜不出內部所執行的行為
且隱藏了 output 也難猜出內部所執行的結果

而這樣的 hidden inputs 和 outputs 稱之為 side-effects

再看底下例子

public Program getCurrentProgram(TVGuide guide, int channel) {
  Schedule schedule = guide.getSchedule(channel);

  Program current = schedule.programAt(new Date());

  return current;
}

這隱藏了 input new Date()

將 new Date() 提出作為參數

public Program getProgramAt(TVGuide guide, int channel, Date when) {
  Schedule schedule = guide.getSchedule(channel);

  Program program = schedule.programAt(when);

  return program;
}

雖然將兩個參數改為三個參數
看似複雜但也清楚表達了這函數所要執行的所有職責
看 input 三個參數 跟 函數名稱 就大概清楚知道 output Program 的內容

雖然不可能完全避免掉 side-effects 但至少在 coding 過程中
需避免減少這類函數功能描述不清 (做了哪些事 影響到那些外部資源) 的情況發生

來源網址
http://blog.jenkster.com/2015/12/what-is-functional-programming.html

← React 非同步 的 setState 使用 create-react-app 和 React Router 做 code splitting →
 
comments powered by Disqus