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 /咖啡脚本使它们成为语言的基础,鼓励人们尽可能频繁地使用它们;迄今为止最优雅、最实用的答案;})