避免在Coffeescript中命名冲突的最佳做法

时间:2015-09-01 21:08:30

标签: coffeescript naming-conventions

问题

避免在Coffeescript中命名冲突的最佳做法是什么,特别是考虑到嵌套作用域和Ajax回调的上下文?

我的问题

我遇到名称冲突问题,我的命名约定规定Ajax回调中的数据名称与我的范围中的另一个对象相同。

在下面的代码中,我将所有函数放在对象notifications上,但是来自我的Ajax GET请求的数据被命名为notifications。结果显然会导致错误:

# Handles initial get request.
notifications.init = ->
$.ajax 'notifications',
  type: 'GET'
  dataType: 'json'
  error: (jqXHR, textStatus, errorThrown) ->
    alert textStatus
  success: (notifications, textStatus, jqXHR) ->
    if notifications?
      filteredNotifications = notifications.filteredNotifications notifications
      notifications.behavior notifications

# Triggers the notifications
notifications.behavior = (filteredNotifications) ->
  if filteredNotifications?
    $('#counter').html filteredNotifications.length
  if parseInt($('#counter').html()) > 0
    $('#counter').css
      'background': 'black'

# Removes notifications sent by the current user, copies for the other user,
# and notifications marked as observed.
notifications.filteredNotifications = (notifications) ->
  filteredNotifications = filteredNotifications.filter((notification) ->
    notification.recipients.username is $username() and
    notification.copy_for_user_id is $id() and
    notification.observed is false
  )
  return filteredNotifications

考虑

我已经考虑了Ajax回调中数据对象的notifications的各种缩写,但它降低了可读性。以不同方式命名父对象也不合适。

1 个答案:

答案 0 :(得分:0)

这是我的推销。正如你所说,这个主题是非常主观的,但我试图保持这个相当标准。

两个要点:

  • 从命名空间中提取逻辑是一种很好的做法,并且可以减少与之冲突的符号。 Coffeescript允许您实例化匿名类,这对此有很大帮助。
  • 我专门使用标识符data作为JSON回调中的数据对象的名称。这减少了任何阅读回调的人的困惑,并有助于消除你遇到过的冲突。

    notifications = new class
        init: -> $.ajax 'notifications',
            type: 'GET'
            dataType: 'json'
            error: (jqXHR, textStatus, errorThrown) ->
                alert textStatus
            success: (data, textStatus, jqXHR) =>
                if data?
                    @behavior @filter data
    
        # Triggers the notifications
        behavior: (notifications) ->
            if notifications?
                $('#counter').html notifications.length
                if notifications.length?
                    $('#counter').css
                        'background': 'black'
                return
    
        # Removes notifications sent by the current user, copies for the other user,
        # and notifications marked as observed.
        filter: (notifications) ->
            return notifications.filter (notification) ->
                notification.recipients.username is $username() and
                notification.copy_for_user_id is $id() and
                notification.observed is false
    
    notifications.init()
    

我做了一些其他的小改动,我冒昧地在behavior进行逻辑更改,这可能不适合你的情况,但你无论如何都应该修改那里的逻辑。使用DOM在应用程序逻辑中存储所需的值是不明智的。

需要注意的重要事项是在=>回调中使用“胖箭头”(success)。这是必需的,因此您可以将函数绑定到正确的上下文,并正确解析@behavior@filter