2016-04-14 92 views
1

一个新的代码审查过程已经到位,现在我的团队不能将一个字符串声明为局部变量,否则提交将不会通过代码审查。我们现在要改用常量。这种方法有什么问题?

因此,这是绝对不允许的,即使我们死了肯定的字符串将永远不会在其他任何地方使用

String operationId = "create"; 

这是应该使用:

private static final String OPERATION_ID = "create"; 

虽然我完全同意在代码中出现+2次的字符串使用常量,但我发现它完全不具备在仅使用一次的情况下声明字符串的能力。

只是为了确保它的清晰,这一切都是任何情况下都允许以下:

  • String div = "div1";
  • Catch(Exception ex){ LOGGER.log("csv file is corrupt") }
  • 字符串连接String str = "something ...." + someVar + "something" ...我们是来取代someVar%s,将整个事物声明为全局字符串,然后使用String.format(....)

  • if(name.equals("Audi"){....}

  • String value = map.get("key")

任何想法的家伙?我想要一些有力的论据。我准备好接受任何有良好论点支持的立场。

谢谢。

+0

也许更多的代码审查问题? – 3kings

+0

你还允许与'List '交互吗?即'String elm0 = lst.get(0)'? – Mshnik

+1

@Mshnik \t我不明白这是怎么回事。那里没有直接的字符串。 –

回答

0

首先,让我们抛出你的假设:没有什么本质上错误与所述的方法。

这不是关于在多个地方使用字符串,而是关于常量易于查找和记录,并且您的代码是一致的

private static final String OPERATION_ID = "create"; 

真的,这是不使用任何地方其他?如果我将其更改为字符串“beetlejuice”,什么都不会中断?如果有什么东西会被破坏,那么其他东西就会使用这个常量......如果“其他东西”碰巧是不同语言的代码库,那就是为什么它们不共享字符串常量 - 这是例外,而不是规则。一致性!


这就是说,有几件事我会在一个稍微不同的方式标准化,但我还是总归它们标准化:

我会建议让字符串字面量在枚举的构造函数:

public enum Operation { 
    CREATE("create"), 
    ... 
} 

因为在这里,枚举是在代码中引用的常量,而不是字符串文字。将常量声明为枚举或作为private static final String等同于我,并且没有必要同时执行这两个操作。

此外,我不会在任何地方使用这种模式,它会破坏IDE的能力来警告您缺少字符串 - 例如,从.properties文件查找字符串。当你在一个不存在的.properties文件中查找关键字时,许多IDE会给你适当的警告,但是额外的间接级别可能会破坏这个关系,这取决于你的IDE有多聪明。

Catch(Exception ex){ LOGGER.log("csv file is corrupt") } 

这对我来说是一个灰色区域 - 这是一个内部唯一的消息吗?这些日志是否仅由您,开发人员见过,还是为了用户的利益?

如果它只适用于应用程序的开发人员这些可能不需要本地化。

如果您希望用户查看日志,那么它们应该外部化为.properties文件。

0

当值/文字多次使用时,为值/文字定义常量是一种很好的编码风格。

强加的编码风格强制您使用的每个字符串常量的常量。

不错该编码风格的影响是:所有真正应该声明为常量的字符串现在被声明为常量。

蕴涵的是编码风格是:你 - 开发商 - 不能决定是否一个字符串文字应被定义为恒定。这是一个沉重的打击。

因此,您应该提出您的担忧,即编码风格的好意并不能弥补开发人员资格标准中的不信任。

相关问题