2011-10-11 110 views
2

如果我要创建一切类型,而不是使用字符串和原始类型,最大的缺点是什么?创建所有类的最大缺点是什么?而不是String name = person.getName()它会是Name name = person.getName();

通常,它看起来像:

String name = person.getName(); 
int age = person.getAge(); 

但现在“一切”是客观,你很少处理字符串(除非你需要特定的字符串操作)。

Name name = person.getName(); 
Age age = person.getAge(); 

NameAge会(在这个例子中)简单的容器类:

public class Name { 

    private final String name; 

    public Name(final String name) { 
     this.name = name; 
    } 

    @Overide 
    public String toString() { 
     return name; 
    } 

} 

然而,在未来,他们可以有更多更多的方法和验证等

但底线是你基本上为每件事物创造类型。

我知道这使得代码更类型安全,但什么是这种代码约定的最大缺点?

+0

我认为字符串和原语概括了希望实现的功能。制作任何类别的东西都会增加复杂性,因为它取决于使用或实施它的人的视角。 – Amanpreet

回答

0
  • 这是不必要的冗长
  • 你可能会失去不变性(在这种情况下Name是不可改变的,但它更容易出错)如果你需要更多的字段后,你可以轻松地添加他们

。尽可能简化代码。

1

唯一真正的缺点,这是使更多的代码你写的,你必须保持和测试更多的代码。理论上这是一个好主意。这是导致问题的实际方面。

0

类爆炸将会使你的代码难以遵循和理解。

当有人看到String name,他们知道目标是什么,立即。所有java开发人员都知道String类。当有人看到Name name时,他们不知道Name类是什么。它有什么作用?它增加了什么功能?

如果这个类只是扩展了Name而且什么也没有做,那么开发人员在代码上工作就毫无意义,浪费时间。如果这个类没有做别的事情,那么你当然需要让这个类来获得这个功能。

底线:如果你要添加额外的功能,创建自己的类。如果您只需要String中的功能,那么只需使用String即可。如果您需要其他功能,您可以随时创建Name并稍后重构。

+0

我永远不会建议更改属性的类型。这往往潜入各种小虫子(反射,铸造......) - 在那里,修正了这个问题。它有一个未来重构的有效机会,这已经是一个很好的起点,已经有了一个专门的课程。关于你的第一个论点:你多长时间把一个新开发人员带到一个项目中,以及需要多少时间才能掌握这样一个简单课程的功能?我认为每个新开发人员只需简短一眼,就是这样。由于某些IDE将Javadoc显示为工具提示,因此甚至可能不需要打开该类。 – sfussenegger

+0

除非在整个项目中都这样做,在这种情况下,每个新开发人员都会进行无数短的浏览。你必须设计假设新的开发者将进入该项目。业务需求需要人们改变重点。事情发生。如果在未来的重构中有一个有效的机会,那么你现在就可以开始构建这个类的属性,它不仅仅是一个包装。另外,像Eclipse这样的工具使得这种类型的重构变得很容易,而不会偷偷摸摸地看到所有类型的小错误。有时你必须改变一个属性的类型。没关系。 –

+0

它比替代方案更好。有一堆代码用于未来代码的代码库很混乱。在未来到达这里之前需求发生变化时,占位符将成为障碍。现在简单编码并在功能清晰的将来进行修改会更好。 –

2

的代码获得更详细的,而不是所有的库处理同样使用此模式。我试图在Java代码中取得平衡,我使用了相当多的原语和字符串,但一些数据类型(例如货币金额和社会安全号码)获得了他们自己的专用类。 SSN有其内部验证规则。货币计算受益于明确控制四舍五入和防止以不同货币增加金额。

在比Java更冗长的语言中,我倾向于使用比Java中更多的这些专用类。

+0

+1进行货币计算。我看到一个应用程序将价格存储为长整型值,必须除以100.0并将其格式化到整个地方。 – sfussenegger

0

我不会推荐这个,因为简单的原因,如果你要与其他系统集成(例如在组织的不同部分或第三方供应商的Web服务,你最终不得不处理Strings和int的反正而且当你从其他系统获取它们时,必须将对象名称包含在Name对象中,并且当你想将它们发布到其他系统时将它们打包,这样你就不得不让你的代码变得更加复杂。

我会说保留它简单和验证可以很容易地使用bean验证引入JSR-303

另外,如果您需要不同的验证规则s在不同的物体上,例如组织名称与人名不同,在知道它之前,如果要更改名称,您将拥有整个类层次结构来处理这个问题,这将是一个重构的噩梦。

0

有些时候,我后悔没有创建用简单的字符串表示的对象的类(场地和巡回演唱会是例子)。我做到了这一点,以遵循KISS principle为什么预计是一个非常简单的应用程序

我不记得我曾经后悔在这种情况下创建一个类。当然还有更多的维护和锅炉板。但是,从直觉的角度来看,如果你觉得它可以在未来得到回报(重构,甚至可能是性能),我会说去做。这是一项小型投资,可以帮助您避免重大麻烦。但尽量不要过头。

相关问题