在唯一性很重要的情况下,描述性语句可以与JavaScript常量一起使用吗?
我的Chrome扩展使用了许多常量,特别是用于。例如,消息发送者可能有:在唯一性很重要的情况下,描述性语句可以与JavaScript常量一起使用吗?,javascript,google-chrome-extension,constants,Javascript,Google Chrome Extension,Constants,我的Chrome扩展使用了许多常量,特别是用于。例如,消息发送者可能有: var message = { from: 'content', subject: 'dataReady', data: data }; var port = chrome.runtime.connect({ name: 'main' }); port.postMessage(message); 消息发送者使用的常量为:content、dataReady和main。消息接收器对常量的使用类似: p
var message = {
from: 'content',
subject: 'dataReady',
data: data
};
var port = chrome.runtime.connect({
name: 'main'
});
port.postMessage(message);
消息发送者使用的常量为:content、dataReady和main。消息接收器对常量的使用类似:
port.onMessage.addListener(function(msg) {
if ((msg.from === 'content') &&
(msg.subject === 'dataReady')) {
// Do something with data
// ... in msg.data
}
}
消息接收器使用的常量为:内容和数据就绪。如果消息接收器发送回复,它也将使用常量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,
}
出于以下几个原因,我倾向于不喜欢后一种实现:
- 这是不明确的,因为无法区分具有重要值的常量和具有任意描述的常量
- 这也许无关紧要,但它加剧了我的第二个反对意见;它太容易发生复制/粘贴错误。任何浏览代码的人都会认为密钥很重要,并且必须是唯一的。自由文本描述必须是唯一的,这一点还不太清楚。如果确实有两个常量具有相同的值,那么错误将很微妙,远离问题的根源,并且很难调试
- 我不确定你的常数是如何/在哪里使用的,但它可能涉及到传输/存储的数据比需要的多。可能存在数据库列宽问题
- 描述比常量更容易更新。在读取旧数据时,这可能会导致升级问题吗
这并不是说,如果需要,您不应该使用带有“description”属性的复杂自文档结构,但我会保持用于比较的值简短且可预测。我倾向于不喜欢后一种实现,原因有两个:
- 这是不明确的,因为无法区分具有重要值的常量和具有任意描述的常量
- 这也许无关紧要,但它加剧了我的第二个反对意见;它太容易发生复制/粘贴错误。任何浏览代码的人都会认为密钥很重要,并且必须是唯一的。自由文本描述必须是唯一的,这一点还不太清楚。如果确实有两个常量具有相同的值,那么错误将很微妙,远离问题的根源,并且很难调试
- 我不确定你的常数是如何/在哪里使用的,但它可能涉及到传输/存储的数据比需要的多。可能存在数据库列宽问题
- 描述比常量更容易更新。在读取旧数据时,这可能会导致升级问题吗
这并不是说,如果需要,不应该使用带有“description”属性的复杂自文档结构,但我会保持用于比较的值简短且可预测。比较字符串常量所需的解析时间比整数稍长,因为每个字符串中的每个字符都将被检查。然而,如果不经常这样做,它就不会真正引人注目。如果在一个速度至关重要的循环中执行,您可能会看到一些速度减慢。比较字符串常量将比整数花费稍多的时间来解析,因为每个字符串中的每个字符都将被检查。然而,如果不经常这样做,它就不会真正引人注目。如果在速度至关重要的循环中进行,您可能会看到一些减速。我喜欢这种方法。通过故意对常量使用无意义的整数值,它记录了一个重要的特性:即值不重要。我喜欢这种方法。通过故意为常量使用无意义的整数值,它记录了一个重要特性:即值不重要。