Coffeescript 有没有更优雅的方式来写这个咖啡剧本?
这是可行的,但是有没有人建议用更简单/优雅的方式来写这篇文章呢Coffeescript 有没有更优雅的方式来写这个咖啡剧本?,coffeescript,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 'loade
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']
当然是。总有一些东西是可以重构的
临时变量
@mediaAddQueue[''+mid]
到处都是。通过引入临时帮助变量来考虑重构:
elem = @mediaAddQueue[''+mid]
elem['econ_status'] is 'loaded' and
elem['medium_status'] is 'loaded' and
elem['thumb_status'] is 'loaded'
代码将突然变得更具可读性
功能,功能,功能强>
我看到您执行了特定类型的检查(我假设我们有elem
变量):
您可以编写一个函数,该函数接受这样的元素(或该对象的任何内容)并执行此检查,其参数为对象、要比较的值和对象的键。这是非常容易在咖啡感谢splats
##
# 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...)
如果经常同时检查“经济状态”、“中等状态”、“拇指状态”
键,则最好再多检查一个功能:
checkPhotoLoaded = (photo) ->
checkLoaded(photo, 'econ_status', 'medium_status', 'thumb_status')
我的重构规则是,应该为所有重复两次以上的东西编写一个函数。CoffeeScript使编写函数变得有趣、快速
我希望这有帮助。当然!首先,请注意,@mediaAddQueue[''+mid]
到处重复,您可以用变量替换它。此外,如果属性有一个有效的标识符作为名称,则不需要访问像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
然后,请注意if
和else if
中的代码是相同的。我认为如果你能给这些条件起一个有意义的名字,这样代码就会变得更加自我记录和枯燥,那就太好了。我不太了解这段代码的上下文,所以我将猜测变量名;试着用一些尽可能清楚地解释其含义的东西:
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
从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
旁注:我注意到你传递了一个始终为空的targetVentRecord,在这种情况下“有没有更优雅的方式来编写这个咖啡脚本?”-当然,用C重写它:在我写我的咖啡脚本时,Ppromanow添加了他的答案。在我看来,他关于使用函数干涸代码的建议非常有用。如果函数对于某些函数来说非常局部,我倾向于使用变量。。。但如果它需要在不同的地方使用,不要三思:去功能=D这是对的——函数很少是个坏主意。JavaScript /咖啡脚本使它们成为语言的基础,鼓励人们尽可能频繁地使用它们;迄今为止最优雅、最实用的答案;})