这是可读的,如果不是我应该改变什么?

时间:2011-11-07 22:38:52

标签: javascript formatting indentation

我一直在评论我的代码是不可读的......我已将我的风格更新到下面......有任何改进建议吗?

/*
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;
  }

4 个答案:

答案 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)

正如大家所说,这确实是主观的,但这里有一些建议:

  • iffor之间留出一个空格及其各自的左括号:if (test) - 这有助于在视觉上区分它们与函数调用。

  • 我更喜欢在与开启括号的语句(functionif等)相同的行上使用大括号。但这只是味道。

  • 大多数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;之类的一行上不要有两个语句。

  • 这与样式一样多的代码优化,但您可以使用多个变量用于正则表达式模式(例如patternNamepatternEmail等等,从而获得更好的代码压缩,可能更具可读性的代码),而不是将它们全部放在一个对象中。一般情况下,除非您需要通过字符串键查找内容或者有其他理由使用对象,否则简单的变量可能更好 - 请参阅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;
}