下面是一個if else 的範例
function checkBalance(customer: Customer, amount: number): boolean {
let account = customer.getAccount();
if( account != null ) {
if( account.balance >= amount ) {
return true;
} else {
return false;
}
}
return false;
}
上面程式碼可以透過 提前return 方法來避免 巢狀if 的問題
function checkBalance(customer: Customer, amount: number): boolean {
let account = customer.getAccount();
if( account == null ) {
return false;
}
if( account.balance >= amount ) {
return true;
} else {
return false;
}
return false;
}
接著再用 boolean 表達式消滅下面的 if else
function checkBalance(customer: Customer, amount: number): boolean {
let account = customer.getAccount();
if( account == null ) {
return false;
}
return (account.balance >= amount);
}
之前的書店折扣實作程式碼原本如下
class Bookstore {
getPrice(books: number): number {
if( books == 2 ) {
return 190;
}
if( books == 3 ) {
return 270;
}
if( books == 4 ) {
return 320;
}
if( books == 5 ) {
return 375;
}
if( books >= 6 ) {
return books * 100 * 0.75;
}
return 100;
}
}
需求是買 N 本書, 有相對應的折扣(%), 所以我們可以把 books 數量當作key, 把折扣(%)當作 value. 首先建立一個字典.
discountDict: {[books: number]: number} = {
1: 1,
2: 0.95,
3: 0.9,
4: 0.8,
5: 0.75,
};
如果要更清楚描述說明那個 "字典的value" 的意義, 我們可以在前面宣告 Percentage
type Percentage = number;
class Bookstore {
private _discountDict: {[books: number]: Percentage} = {
1: 1,
2: 0.95,
3: 0.9,
4: 0.8,
5: 0.75,
};
}
然後在 getPrice 實作方法內容中, 內容會變成如下
getPrice(books: number): number {
let discount = this._discountDict[books];
if( books > 5 ) {
return books * 100 * this._discountDict[5];
}
return books * 100 * discount;
}
甚麼!? 你看到重複的程式碼!?
books * 100
你會你來, 把它重構(Refactor)一下, 再跑測試吧!
物件多型(polymorphism), 就是不同資料類型的實體提供統一的介面. 以上面的書店例子, 1本書的折扣是0, 2本書的折扣是5%, 3本書的折扣是10% , 我們把1本書, 2本書, 3本書... 當作物件, 這些物件有統一相同的行為, 就是 "打折扣" 的行為, 這就是多型.
所以我們要改成物件多型的話, 要準備一個統一相同的行為的動作, 想要統一相同物件的話, 我們可以用下面幾個方法解決
用抽象類別(abstract class) 方法, 就得先寫一個基本抽象類別, 每一個新物件就繼承(inheritance) 這個基本抽象類別, 然後再覆寫(override) 基本抽象類別中的方法(function).
用介面方法(interface) 方法, 就得先寫一個介面(interface), 每一個新物件就實作(implements) 這個介面, 然後再實作(implements) 介面中的方法(function).