2013-02-07 178 views
0

這工作,但確實有任何建議爲寫這更簡單的/優雅的方式?:有沒有更優雅的方式來編寫這個CoffeeScript?

if @mediaAddQueue[''+mid]['mediaType'] is 'photo' and 
    @mediaAddQueue[''+mid]['econ_status'] is 'loaded' and 
    @mediaAddQueue[''+mid]['medium_status'] is 'loaded' and 
    @mediaAddQueue[''+mid]['thumb_status'] is 'loaded' and 
    not @mediaAddQueue[''+mid]['targetEventRecord']? 
    @addMedia @mediaAddQueue[''+mid]['targetEventRecord'], mid, @mediaAddQueue[''+mid]['mediaType'] 
else if @mediaAddQueue[''+mid]['mediaType'] is 'video' and 
    @mediaAddQueue[''+mid]['video_status'] is 'loaded' and 
    not @mediaAddQueue[''+mid]['targetEventRecord']? 
    @addMedia @mediaAddQueue[''+mid]['targetEventRecord'], mid, @mediaAddQueue[''+mid]['mediaType'] 
+0

「是否有更優雅的方式來編寫此CoffeeScript?」 - 當然,用C重寫:P – 2013-02-07 22:43:57

回答

3

當然!首先,請注意@mediaAddQueue[''+mid]遍佈整個地方,您可以用一個變量替換它。此外,如果該屬性具有有效的標識符作爲名稱,則不需要訪問something['prop']等屬性;你可以做something.prop。更改這兩件事情已經清理代碼頗有幾分:

media = @mediaAddQueue[mid] 

if media.mediaType is 'photo' and 
    media.econ_status is 'loaded' and 
    media.medium_status is 'loaded' and 
    media.thumb_status is 'loaded' and 
    not media.targetEventRecord? 
    @addMedia media.targetEventRecord, mid, media.mediaType 
else if media.mediaType is 'video' and 
    media.video_status is 'loaded' and 
    not media.targetEventRecord? 
    @addMedia media.targetEventRecord, mid, media.mediaType 

然後,通知,無論是ifelse if裏面的代碼是一樣的。我認爲如果你能夠給條件賦予一些有意義的名字,這樣代碼就會變得更加自我記錄和DRY,那將是非常好的。我不太瞭解這段代碼的上下文,所以我會猜測變量名稱;嘗試儘可能清楚使用的東西,解釋它的意義可能:

media = @mediaAddQueue[mid] 

isValidPhoto = media.mediaType is 'photo' and 
    media.econ_status is 'loaded' and 
    media.medium_status is 'loaded' and 
    media.thumb_status is 'loaded' and 
    not media.targetEventRecord? 

isValidVideo = media.mediaType is 'video' and 
    media.video_status is 'loaded' and 
    not media.targetEventRecord? 

if isValidPhoto or isValidVideo 
    @addMedia media.targetEventRecord, mid, media.mediaType 
+0

promanow在我寫我的時候加了他的答案。他建議使用函數來幹代碼非常有用,IMO。如果功能對某些功能來說是非常本地的,我傾向於使用變量......但是如果它需要在不同的地方使用,請不要三思而後行:尋求功能! = D – epidemian

+0

這是正確的 - 功能很少是一個**糟糕的主意。 JavaScript/CoffeeScript使它們成爲語言的基礎,鼓勵儘可能多地使用它們;) – pawroman

+0

非常感謝,非常感謝。 – celwell

4

當然是。總有東西可以重構。

臨時變量

@mediaAddQueue[''+mid] 

無處不在。考慮通過引入一個臨時的輔助變數重構:

elem = @mediaAddQueue[''+mid] 

的代碼會突然變得更具可讀性。

功能,功能,功能!

我看你執行特定類型的檢查(我認爲我們有elem變量):

elem['econ_status'] is 'loaded' and 
elem['medium_status'] is 'loaded' and 
elem['thumb_status'] is 'loaded' 

你可以寫一個函數,這樣elem(或者不管這個對象是)並執行此檢查,其參數是對象,要比較的值和對象的鍵。感謝splats,這在Coffee中非常簡單。

## 
# Check whether all obj's keys are set to value. 
checkAllKeys = (obj, value, keys...) -> 
    for k in keys 
     if obj[k] != value 
      return false 

    return true 

現在前面的代碼塊將成爲:

checkAllKeys(elem, 'loaded', 'econ_status', 'medium_status', 'thumb_status') 

如果你知道你將檢查 '裝' 值的時候,讓自己的另一個功能:

checkLoaded = (elem, keys...) -> 
    checkAllKeys(elem, 'loaded', keys...) 

如果'econ_status', 'medium_status', 'thumb_status'鍵通常會一起檢查,那麼即使是一個更多的功能可能是一個好主意:

checkPhotoLoaded = (photo) -> 
    checkLoaded(photo, 'econ_status', 'medium_status', 'thumb_status') 

我的重構規則是應該爲所有重複兩次以上的東西寫一個函數。 CoffeeScript使寫作功能變得有趣而且快速。

我希望這有幫助。

+0

迄今爲止最優雅的功能答案;}) –

0

從epidemian答案去,我仍然會重構它有點這樣的:

media = @mediaAddQueue[mid] 

typeValidationMap = 
    'photo' : (m) -> 
    m.econ_status is 'loaded' and 
    m.medium_status is 'loaded' and 
    m.thumb_status is 'loaded' 
    'video' : (m) -> 
    m.video_status is 'loaded' 
    'default':() -> no 

isValidMedia = (m) -> 
    return no if m.targetEventRecord? 
    validate = typeValidationMap[m.mediaType] or typeValidationMap.default 
    validate m 

if isValidMedia media 
    @addMedia media.targetEventRecord, mid, media.mediaType 

側面說明:我注意到你傳遞在這種情況下總是爲null的targetEventRecord

+0

謝謝。有趣和靈活的想法。 – celwell

相關問題