我一直在评论我的代码是不可读的......我已将我的风格更新到下面......有任何改进建议吗?
/*
Check - Checks the user input text against regular expressions
*/
// Regular expressions
var patterns =
{
name: /^[a-zA-Z-\s]{1,20}$/, // checks full name
email: /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{1,4}$/, // checks for valid email form
pass: /.{6,40}/, // checks for password length
url: /^[-\w&:\/\.=\?,#+]{1,}$/, // checks for valid url form
aml: /<(.+)_([a-z]){1}>$/ // checks for aml form
};
function check_item(reg1,text,id,res)
{
if(!reg1.exec(text.value))
{
o2(id,res);
return 0;
}
return 1;
}
function check_aml(text)
{
if(a=patterns.aml.exec(text))
{
if(a[2]=='p')
{
return 0;
}
else if (a[2]=='f')
{
return 1;
}
}
else
{
return 2;
}
}
// checks for empty text
function check_empty(text,id,res)
{
for(var d=0;d<text.length;d++)
{
if(text[d].value=='')
{
o2(id,res);
return 0;
}
}
return 1;
}
// checks if two text entries are the same
function check_same(text1,text2,id,res)
{
if((text1.value)!=(text2.value))
{
o2(id,res);return 0;
}
o2(id,'');
return 1;
}
答案 0 :(得分:3)
我不知道javascript约定是什么,但也许花括号内的语句应该相对于大括号本身缩进到右边。另外,我认为你打开和关闭一个块时不应该右键缩进花括号,它们应该与“for”或“function”的第一个字符对齐。这对我有用。
function check_empty(text,id,res)
{
for(var d=0;d<text.length;d++)
{
if(text[d].value=='')
{
o2(id,res);
return 0;
}
}
return 1;
}
取决于阅读代码的人看起来可读的内容我猜...
答案 1 :(得分:1)
这是一个建议(愚蠢地主观):
/*
Check - Checks the user input text against regular expressions
*/
// Regular expressions
var patterns = {
name: /^[a-zA-Z-\s]{1,20}$/, // checks full name
email: /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{1,4}$/, // checks for valid email form
pass: /.{6,40}/, // checks for password length
url: /^[-\w&:\/\.=\?,#+]{1,}$/, // checks for valid url form
aml: /<(.+)_([a-z]){1}>$/ // checks for aml form
};
function check_item(reg1, text, id, res) {
if(!reg1.exec(text.value)) {
o2(id,res);
return 0;
}
return 1;
}
function check_aml(text) {
if(a = patterns.aml.exec(text)) {
if(a[2] == 'p') {
return 0;
}
else if (a[2] == 'f') {
return 1;
}
} else {
return 2;
}
}
// checks for empty text
function check_empty(text, id, res) {
for(var d = 0; d < text.length; d++) {
if(text[d].value == '') {
o2(id, res);
return 0;
}
}
return 1;
}
// checks if two text entries are the same
function check_same(text1, text2, id, res) {
if((text1.value) != text2.value) {
o2(id, res);
return 0;
}
o2(id, '');
return 1;
}
虽然这反映了我个人对javascript代码缩进的偏好,但这并不意味着它会改善糟糕的代码。而且,是的,这是糟糕的代码。对于像a,o2,text,......这样的变量名称来说,它太难以理解了。
我的意思是你写了if(a = patterns.aml.exec(text))
。您是否知道javascript中=
,==
和===
之间的区别?
对我来说,如果没有编写此代码的人(像我一样)正在查看它并立即知道此代码的作用,那么代码是可读的。我必须承认,你的代码不是这种情况。我必须实际思考并浪费时间来理解它的含义。
答案 2 :(得分:1)
正如大家所说,这确实是主观的,但这里有一些建议:
在if
和for
之间留出一个空格及其各自的左括号:if (test)
- 这有助于在视觉上区分它们与函数调用。
我更喜欢在与开启括号的语句(function
,if
等)相同的行上使用大括号。但这只是味道。
大多数Javascript程序员不使用结构if (a = b.exec(text))
,我认为因为它很容易与if (a == b.exec(text))
混淆。我见过的一个例外是正则表达式:while (a = b.exec(text))
- 这是循环模式匹配的好方法。
我不喜欢数字返回值。根据偏好,我要么返回true
/ false
,要么如果你真的需要其他状态,则返回一个状态和原因的对象:return { success: false, message: "Enter a valid email"};
除非需要更具体,否则我发现评估假值比if (text[d].value)
更清晰,而不是if (text[d].value == '')
(这是相同的事情)。如果您需要类型感知比较,请使用===
。
作为一项规则,除了作为迭代计数器之外,我远离单字母变量。如果你在将代码发送给客户端之前缩小/压缩代码(通常你应该这样做),那么使用更长的人类可读名称就没有缺点了。
除非有非常好的格式化原因,否则在o2(id,res);return 0;
之类的一行上不要有两个语句。
这与样式一样多的代码优化,但您可以使用多个变量用于正则表达式模式(例如patternName
,patternEmail
等等,从而获得更好的代码压缩,可能更具可读性的代码),而不是将它们全部放在一个对象中。一般情况下,除非您需要通过字符串键查找内容或者有其他理由使用对象,否则简单的变量可能更好 - 请参阅jQuery source以获得一个很好的示例。
答案 3 :(得分:0)
这是我的观点,以及有关命名约定的一些内部评论。
function check_item(reg1, text, id, res) {
if (req1.exec(text.value)) {
return 1;
}
o2(id, res);
return 0;
}
function check_aml(text) {
var a = patterns.aml.exec(text);
if (!a) {
return 2;
}
if (a[2] == 'p') {
return 0;
}
if (a[2] == 'f') {
return 1;
}
// Else what?
}
// This function is named funky, because
// it does more than check to see if the
// text is empty, it also does something
// with the o2 function.
//
// Why does it not return true/false?
function check_empty(text, id, res) {
for (var d = 0; d < text.length; d++) {
if (text[d].value == '') {
o2(id, res);
return 0;
}
}
return 1;
}
// This function is named funky, because it does
// more than checks to see if they're the same,
// it also does something with the o2 function.
//
// Why does it not return true/false?
function check_same(text1, text2, id, res) {
if (text1.value != text2.value) {
o2(id, res);
return 0;
}
o2(id, '');
return 1;
}