你試過不用if擼程式碼嗎?
試著不用if擼程式碼,是件很有趣的事,而且,萬一你領會了什麼是“資料即程式碼,程式碼即資料”呢?
我在教新手程式設計時,喜歡給他們一些小小的挑戰,比如:不使用if語句(或者三元運算子、switch語句等)解決一些程式設計問題。
這樣做有什麼意義嗎?
事實上,它可以迫使你從不同的角度尋找解決方法,也許可以找到更好的方法。
當然,使用if語句沒有任何不對的地方。但是,不使用if的話,有時候可以增加程式碼的可讀性。這一點並不是絕對的,如果完全不使用if語句的話,程式碼可讀性也許會更差。這需要你根據不同情況去判斷。
而且,不用if的話不只是影響可讀性。在這背後隱含著更加深刻的道理。通過了解本文的程式碼示例,你可以發現,如果不使用if語句的話,你的程式碼會更加接近程式碼即資料的概念。
另外,當你嘗試不使用if語句去程式設計時,也是一件非常有意思的事情。
示例1: 統計陣列中的奇數
假設我們有一個整數陣列arrayOfIntegers,現在需要統計其中奇數的個數:
constarrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];
使用if
letcounter = 0;
arrayOfIntegers.forEach((integer) =>{
constremainder = Math.abs(integer % 2);
if(remainder === 1) {
counter++;
}
});
console.log(counter);
不用if
letcounter = 0;
arrayOfIntegers.forEach((integer) =>{
constremainder = Math.abs(integer % 2);
counter += remainder;
});
console.log(counter);
不用if時,我們巧妙地利用了奇數與偶數的特性,它們除以2的餘數分別是0和1。
示例2: 判斷工作日和週末
給定一個日期(比如new Date()),判斷它是工作日還是週末,分別返回”weekend”和”weekday”。
使用if
constweekendOrWeekday =(inputDate) =>{
constday = inputDate.getDay();
if(day === 0|| day === 6) {
return'weekend';
}
return'weekday';
// Or, for ternary fans:
// return (day === 0 || day === 6) ? 'weekend' : 'weekday';
};
console.log(weekendOrWeekday(newDate()));
不用if
constweekendOrWeekday =(inputDate) =>{
constday = inputDate.getDay();
returnweekendOrWeekday.labels[day] ||
weekendOrWeekday.labels['default'];
};
weekendOrWeekday.labels = {
0: 'weekend',
6: 'weekend',
default: 'weekday'
};
console.log(weekendOrWeekday(newDate()));
你是否發現if語句中其實隱含著一些資訊呢?它告訴我們哪一天是週末,哪一天是工作日。因此,要去掉if語句的話,我們只需要把這些資訊寫入weekendOrWeekday.labels物件,然後直接使用它就好了。
示例3: doubler函式
寫一個doubler函式,它會根據引數的型別,進行不同的操作:
如果引數是數字,則乘以2(i.e. 5 => 10, -10 => -20);
如果引數是字串,則每個字元重複2次 (i.e. 'hello' => 'hheelloo');
如果引數是函式,則呼叫2次;
如果引數是陣列,則將每一個元素作為引數,呼叫doubler函式
如果引數是物件,則將每個屬性值作為引數,呼叫doubler函式
使用switch
constdoubler =(input) =>{
switch(typeofinput) {
case'number':
returninput + input;
case'string':
returninput
.split('')
.map((letter) =>letter + letter)
.join('');
case'object':
Object.keys(input)
.map((key) =>(input[key] = doubler(input[key])));
returninput;
case'function':
input();
input();
}
};
console.log(doubler(-10));
console.log(doubler('hey'));
console.log(doubler([5, 'hello']));
console.log(doubler({ a: 5, b: 'hello'}));
console.log(
doubler(function(){
console.log('call-me');
}),
);
不用switch
constdoubler =(input) =>{
returndoubler.operationsByType[typeofinput](input);
};
doubler.operationsByType = {
number:(input) =>input + input,
string:(input) =>
input
.split('')
.map((letter) =>letter + letter)
.join(''),
function: (input) =>{
input();
input();
},
object:(input) =>{
Object.keys(input)
.map((key) =>(input[key] = doubler(input[key])));
returninput;
},
};
console.log(doubler(-10));
console.log(doubler('hey'));
console.log(doubler([5, 'hello']));
console.log(doubler({ a: 5, b: 'hello'}));
console.log(
doubler(function(){
console.log('call-me');
}),
);
可知,我將每一種引數型別對應的操作繫結到了doubler.operationsByType,這樣不需要switch語句,就可以實現doubler函式了。
相關文章
- SpringBoot程式碼生成器,從此不用手擼程式碼Spring Boot
- 你現在不用寫程式碼了吧?
- 你真的使用過低程式碼產品嗎?
- 面試官:你分析過SpringMVC的原始碼嗎?面試SpringMVC原始碼
- 當人手忙不過來時,你還會做程式碼測試嗎?
- 你見過背誦程式碼的程式設計師嗎?程式設計師
- 不用寫程式碼,也能做好介面測試
- 【前端面試】同學,你會手寫程式碼嗎?前端面試
- 你寫的前端程式碼有做過單元測試嗎?使用什麼工具?怎麼測試的?前端
- 擼了那麼多程式碼,你真的瞭解字型?
- 面試官:你分析過mybatis工作原理嗎?面試MyBatis
- LevelDB 程式碼擼起來!
- 測試工程師看過來!面試,你真的會嗎?工程師面試
- 小程式的這些坑你踩過嗎?
- 面試還問redux?那我從頭手擼原始碼吧(核心程式碼)面試Redux原始碼
- 你知道低程式碼BPM平臺嗎?
- 你是真的程式猿嗎—>測試認證
- 不用寫程式碼的爬蟲爬蟲
- 程式設計師想月薪過萬?這些面試準備你做好了嗎?程式設計師面試
- 你確定能通過現在的VUE面試嗎?Vue面試
- 面試官問:Mybatis中的TypeHandler你用過嗎?面試MyBatis
- 面試官: 你平時用過讀寫鎖嗎?面試
- 面試官問,你使用過命令模式嗎?我笑了!面試模式
- 元旦在家擼了兩天Seata原始碼,你們是咋度過的呢?原始碼
- 中國程式設計師真的過多了嗎?你還敢入行嗎?程式設計師
- 分散式面試題不用怕,帶你征服面試管分散式面試題
- 你還在手寫TS型別程式碼嗎型別
- 有沒得老闆給活幹,擼擼程式碼,義工!!!
- 不用程式碼趣講 ZooKeeper 叢集
- 前端面試?這份手擼Promise請你收下前端面試Promise
- 【手把手帶你擼一個腳手架】第四步, 通過擼碼獲取專案資訊
- 做軟體測試需要懂程式碼嗎?
- 今天你過節了嗎?
- 面試官:你使用webpack時手寫過loader,分離過模組嗎?面試Web
- 九宮格抽獎–手擼程式碼
- 開發測試用例:手動擼程式碼 VS 填鴨式編寫
- python程式程式碼這樣加密保護,你覺得可以嗎?Python加密
- 我們一直談論“寫程式碼”,但你會“讀程式碼”嗎?