210 如何讓業務邏輯寫起來更好看

最近總感覺自己寫的代碼很醜,設計模式很難有用武之地,今天看了
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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章