最近總感覺自己寫的代碼很醜,設計模式很難有用武之地,今天看了
https://www.zhihu.com/question/25339235/answer/90183763?group_id=692432194668343296
想到,也許可以給自己定製一個業務邏輯最佳實踐
簡化 if else
業務邏輯可能看起來長這樣 (轉自上面的鏈接):
switch (gender):
case 'male':
if (level === 'gold') {
} else if (level === 'silver') {
} else {
}
break;
case 'female':
if (level === 'gold') {
} else if (level === 'silver') {
} else {
}
break;
case 'unknown':
if (level === 'gold') {
} else if (level === 'silver') {
} else {
}
break;
善用data driven的思想可以這樣:
GENDER = {
MALE: 'male',
FEMALE: 'female’,
UNKNOWN: 'unknown'
}
LEVEL = {
GOLD: 'gold',
SILVER: 'silver',
BRONZE: 'bronze'
}
avatars = {
GENDER.MALE => {
LEVEL.GOLD =>;
LEVEL.SILVER =>;
LEVEL.BRONZE=>;
},
GENDER.FEMALE => {
LEVEL.GOLD =>
LEVEL.SILVER =>
LEVEL.BRONZE =>
},
GENDER.UNKNOWN => {
LEVEL.GOLD =>
LEVEL.SILVER =>
LEVEL.BRONZE =>
}
}
user.gender = (user.gender in GENDER) ? user.gender : GENDER.UNKNOWN
user.level = (user.level in LEVEL) ? user.level : LEVEL.BRONZE
user.avatar = avatars[user.gender][user.level];
改進foreach
items.filter(item => verify(item))
items.map(item => update(item))
items.each(item => process(item))
系列操作可以用 decorator
class {
showLogo () {
showAd()
...
}
showBanner () {
showAd()
...
}
showSidebar () {
showAd()
...
}
}
class {
@decorated by AdDecorator
showLogo,
showBanner,
showSidebar
...
}
善用回調
function attach() {
app.A =
db.update(app.states)
log(..)
}
function move() {
app.B =
db.update(app.stats)
log(..)
}
app.on('change', 'stats', stats => {
db.update(stats)
log(..)
})
function attack() {
app.update(A ..)
}
function move() {
app.update(B ..)
}
有統一的函數命名規則
我總覺得寫代碼的時候有五分之一的時間在思考函數和變量命名規則,尤其是rest接口,約定命名的時候簡直要了我的命。
google style guide 裏面沒有提具體規則,只規定了函數必須是動詞,變量命名要用駝峯法(lower camel)。