2

OO 纯粹主义者通常不赞成静态实用程序方法。

然而,我想知道人们对用于避免在整个应用程序中进行空检查等简单操作的实用方法有何看法。

String.trim()在空字符串上调用时抛出 NPE。所以我必须这样做:

if(str!=null) 
     setValue(str.trim());
else
     setValue("");

如果我创建一个检查 null 的实用程序方法会怎样?

setValue(myTrim(str));

public static String myTrim(String str) {

  if(str==null) return "" 

  else return str.trim();
}

我在使用此类方法时遇到的一个问题是团队中的一些开发人员可能不喜欢/不知道此实用程序,并且可能在进行空值比较后进行直接调用。

这也是你做你的框架的东西吗?如果是,人们创建并在他们的应用程序中使用的其他常见实用程序通用方法是什么?

你觉得这两种方法的优缺点是什么?

4

6 回答 6

7

当现有库(如 Apache Commons Blah Blah Blah)已经编写了它时,我倾向于替换本土使用。您可以卸载给其他人的代码让您专注于软件的重要部分,这些部分真正将您的工作与其他人的工作区分开来。但是,是的,带有静态方法的实用程序类非常棒,如果它们需要你自己编写的话。

仅供参考,看看StringUtils.trimToEmpty()。祝你好运。

于 2009-04-15T18:34:53.060 回答
3

团队中的一些开发人员可能不喜欢/不知道这个实用程序

这就是沟通的好处。我不是指电子邮件。

谈到这类功能,可能其他团队成员也在做同样的事情,如果不交流,你就是在重复代码和工作。

您可能会找到使用这些实用方法的方法,甚至一些更有经验的开发人员可能已经开发了更成熟的库或使用了第 3 方。

但无论如何,与你的团队沟通

于 2009-04-15T18:28:26.617 回答
3

我不是一个OO纯粹主义者。所以我喜欢这样的东西。任何可以让编写反映我意图的代码变得更容易的东西,而不会陷入不相关的细节中。

写下来。自己使用。不要害羞——展示它让你的代码变得多么干净。最坏的情况,至少你的代码会少一点重复......

于 2009-04-15T18:28:27.397 回答
2

就设计原则而言,有些东西只是逻辑上更静态的方法。如果您正在编写的实用程序类实际上没有任何“状态”,并且使用一堆静态方法使其无法实例化感觉更合乎逻辑,那么就这样做。但是要确保你的类是真正不可实例化的(给它一个私有构造函数;我见过人们将这个类声明为抽象的,但这并不好,因为人们可以覆盖它)。

然后您遇到的问题是,如果您的类是项目范围的,则需要将其视为库类。编写库与编写通用代码不同:

  • 在一般代码中,您应该分析而不是过早地优化;但是在库方法中,您无法预测人们将来将如何使用您的调用;
  • 您需要非常小心地记录或清楚地说明您的方法的作用;
  • 你需要给它通用的行为,而不是被你当时需要的某些特定功能所蒙蔽(例如,如果你有一个“标记字符串”的方法,你如何处理空标记?如果需要忽略它们,其他调用者会调用你的方法吗?)
于 2009-04-15T20:02:32.023 回答
1

我有一些只包含最喜欢的静态方法的类——它们确实有意义。您可以将广泛的单元测试放在一起检查任何和所有边界条件。

在您描述的情况下 - 让 setValue 方法接受发送给它的任何字符串不是更好吗?然后,该方法可以应用默认的空字符串,修剪它,如果值不正确,甚至抛出异常。

然后,该例程上的 JavaDoc 可以清楚地说明哪些输入是有效/无效的,以及无效输入会发生什么。

不是说这是对的——只是另一种观点

于 2009-04-15T18:43:43.867 回答
1

我使用了很多实用功能。有些东西只是不需要“对象”,但我不喜欢你的 trim() 的特定示例。

对空字符串的引用与空字符串非常不同。除非应用程序非常简单,并且您知道您总是想将空引用读取为“”,否则我不会这样做。对于这种情况,我更喜欢:

setValue((str != null) ? str.trim() : "")

对我来说,未捕获的 NPE 很好地表明应用程序中发生了重大错误!

于 2009-04-15T21:50:37.100 回答