My Chrome Extension使用了许多常量,专门用于消息传递。例如,消息发送者可能具有:
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
}
}
消息接收器使用的常量为:content和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,
}
我不喜欢后一种实现,原因有两个:
-
它是模糊的,因为没有办法区分具有重要值的常数和具有任意描述的常数。
-
这可能无关紧要,但它加剧了我的第二个反对意见;它太容易受到复制/粘贴错误的影响。任何浏览代码的人都会认为密钥很重要,并且必须是唯一的。自由文本描述必须是唯一的,这一点远没有那么清楚。如果有两个常量的值相同,那么错误就会很微妙,远离问题的根源,很难调试。
-
我不知道你的常数是如何使用的/在哪里使用的,但它可能涉及传输/存储比必要的更多的数据。可能存在数据库列宽问题。
-
描述比常量更有可能更新。这可能会在读取旧数据时造成升级问题吗?
这并不是说,如果你想要的话,你不应该使用带有"描述"属性的复杂的自我记录结构,但我会保持用于比较的值简短且可预测。