1

我正在开发一个大量使用 AJAX 的 Web 应用程序。服务器通常通过一个数组来回答,以便连接响应的不同部分。

我想知道在以下两个中处理这些数组中的键的最佳解决方案是什么(未显示 JSON 编码和解码):

字符串

该解决方案易于阅读,尤其是在 JavaScript 中,但非常脆弱且难以维护。

PHP

<?php
return array(
    'key_name_1' => 'foo',
    'key_name_2' => 'bar'
);
?>

JavaScript

var result = ajax(...);
alert(result.key_name_1);

常数

这是一个可靠的解决方案,它允许使用短键和数字键,但它很重且难以阅读(在我的情况下,使用反射来自动生成 JavaScript 常量不是可接受的解决方案,并且无论如何也不能解决所有缺点) .

PHP

<?php
class Answer
{
    const CONSTANT_1 = 1;
    const CONSTANT_2 = 2;
}

return array(
    Answer::CONSTANT_1 => 'foo',
    Answer::CONSTANT_2 => 'bar'
);
?>

JavaScript

Answer.CONSTANT_1 = <?php echo Answer::CONSTANT_1; ?>
Answer.CONSTANT_2 = <?php echo Answer::CONSTANT_2; ?>

var result = ajax(...);
alert(result[Answer.CONSTANT_1]);

在你看来,最好的选择是什么?

4

2 回答 2

1

我认为字符串解决方案很脆弱,因为键名的任何更改也必须在使用它们的代码中执行。

这个结论是不正确的,会导致代码不可维护。

考虑以下 PHP 数据结构:

array(
 MyClass::FIELD1 => "my field1 value",
 MyClass::FIELD2 => "my field2",
 MyClass::FIELD3 => "field 3 is awesome",
);

class MyClass {
  const FIELD1 = "field1";
  const FIELD2 = "field2";
  const FIELD3 = "field3";
}

假设我们想使用一个新字段来代替field1(如建议的用例)——我们将其命名为newfield

class MyClass {
  const FIELD1 = "newfield";
  ....
}

现在代码处于不一致的状态。变量的名称不再与其值有任何关联。FIELD1常数本质上是关于它所代表的领域的谎言

想象一个新程序员一年后检查这段代码。她知道newfield存在并想要访问它。result.newfield但是,她必须输入,而不是简单地输入result[Answer.FIELD1]。每次她想访问时,newfield她都有记住和应用这个映射的精神开销。但这是一个包含数百个字段的大型应用程序,并且大多数都以这种方式被误导。这是脆弱且不可维护的代码。

常量只能用于本质上是常量的值。典型的例子是存储像 pi 这样的数学常数:

class MyMathClass {
  const PI = 3.141592;
}

常量是可用于维护易失数据结构(字段名称定期更改)的最糟糕的编程工具之一。

于 2013-03-16T19:12:22.117 回答
0

一旦你将它回显出 JavaScript,它无论如何都不会是一个常量。我个人会使用字符串,如果它会让你的代码更具可读性。为什么这会使它变得脆弱且难以维护?如果您需要它既是常量又是可读的,您总是可以定义一个常量字符串。如果没有更多信息,很难判断以数字或单词作为键是否会更好地为您服务。

于 2013-03-16T18:06:35.280 回答