描述性句子可以与JavaScript常量一起使用,只有唯一性才有意义吗?

时间:2015-12-14 02:33:32

标签: javascript google-chrome-extension constants

我的Chrome扩展程序使用了许多常量,特别是message passing。例如,邮件发件人可能具有:

var message = {
  from: 'content', 
  subject: 'dataReady', 
  data: data
};

var port = chrome.runtime.connect({
  name: 'main'
});

port.postMessage(message);

邮件发件人使用的常量为:内容 dataReady 主要。消息接收器类似地使用常量:

port.onMessage.addListener(function(msg) {
    if ((msg.from === 'content') && 
      (msg.subject === 'dataReady')) {  
        // Do something with data 
        // ... in msg.data
    }
}

消息接收者使用的常量是:内容 dataReady 。如果发送回复,消息接收者也将使用常量 main

这些常量的值不重要,只要它们必须唯一且对程序员有一些广泛有意义的值。我的Chrome扩展程序还使用了更多“传统”常量,其中值很有意义,例如: var MAX_AGE = 30;

为了防止使用常量混乱全局命名空间,我有一个包含所有常量的JavaScript对象,按逻辑分组并保存在单独的constants.js文件中:

var constants { 
  'actors' : {
    // Content script embedded on site foo.com.
    'content' : 'content',
    // Extension UI loaded when icon clicked.
    'popup' : 'doActionB'
  },
  'subjects' : {
    // The content script has finished loading data.
    'dataReady' : 'dataReady',
    // The content script has refreshed data from user.
    'updateReady' : 'updateReady'
  },
  'channels' : {
    // Main channel used for messaging.
    'main' : 'main'
   },
  'MAX_AGE' : 30,
}

...然后在我的Chrome扩展程序中使用:

port.onMessage.addListener(function(msg) {
    if ((msg.from === constants.actors.content) && 
      (msg.subject === constants.subjects.dataReady)) {  
        // Do something with data 
        // ... in msg.data
    }
}

很好,所以我的所有常量都在一个单独的文件中,带有注释。

然后我想也许我可以通过使它们更具描述性来更好地利用我的常量值:

var constants { 
  'actors' : {
    'content' : 'Content script embedded on site foo.com.',
    'popup' : 'Extension UI loaded when icon clicked.'
  },
  'subjects' : {
    'dataReady' : 'The content script has finished loading data.',
    'updateReady' : 'The content script has refreshed data from user.'
  },
  'channels' : {
    'main' : 'Main channel used for messaging.'
   },
  'MAX_AGE' : 30,
}

这可以防止需要注释,因为这些常量的值无关紧要,我应该没问题。

问题:这是一个坏主意,一个不好的做法还是有更好的方法?

更新以包含@Basic提供的已接受答案。我特别喜欢这个解决方案,因为它允许通过明显递增的整数值来强调值的不重要性。唯一的缺点是频道名称必须是字符串。

var constants = {    
    'actors' : {
    // Content script embedded on site foo.com.
    'content' : 1,
    // Extension UI loaded when icon clicked.
    'popup' : 2
    },
    'subjects' : {
    // The content script has finished loading data.
    'dataReady' : 1,
    // The content script has refreshed data from user.
    'updateReady' : 2
    },
    'channels' : {
    'main' : 'main'
    },
    'MAX_AGE' : 30,
}

1 个答案:

答案 0 :(得分:0)

由于以下几个原因,我倾向于不喜欢后者的实施:

  • 它的含糊不清是因为没有办法区分具有重要值的常量和具有任意描述的常量。

  • 这可能并不重要,但它加剧了我的第二个反对意见;它太容易被复制/粘贴错误。任何看过代码的人都会认为密钥很重要并且必须是唯一的。自由文本描述必须是唯一的,这一点不太清楚。如果您有2个具有相同值的常量,则错误将是微妙的,远离问题的根源并且难以调试。

  • 我不确定您的常量的使用方式/位置,但可能涉及传输/存储的数据超出必要的数量。可能存在数据库列宽问题。

  • 描述比常量更有可能更新。这可能会在阅读旧数据时造成升级问题吗?

并不是说你不应该使用一个复杂的自我记录结构,并且不会使用"描述"属性,如果你想要一个,但我保持用于比较的值简短且可预测。