将电子邮件,电话号码和身份识别为POJO而不是字符串

时间:2015-02-06 15:23:51

标签: java string oop

我有一个典型的商业Web应用程序,其中域包含帐户和用户等实体。我的后端是Java,因此它们由POJO代表。在早期迭代期间,这些POJO的每个属性都只是字符串。这是有道理的,因为html输入是一个字符串,数据在数据库中持久化的方式也类似于字符串。

最近,我们一直在努力验证这种输入,如果我切换到这种属性的对象表示法,我发现它会有所帮助。例如,TelephoneNumber类包含:

  • (int)国家/地区呼叫代码
  • (字符串)其余的数字
  • (静态字符)用于为国家/地区调用代码添加前缀的字符(在我们的示例中为+)
  • (静态模式)正则表达式匹配,如果phonenumber是敏感的
  • 比较和验证电话号码的方法。

这个课程有优点和缺点:

  • 不好:在字符串/对象
  • 之间创建和转换其他对象
  • 好:OOP和关于电话号码的所有逻辑捆绑在一个类别(高凝聚力),
  • good:只要需要一个电话号码作为方法或构造函数的参数,java的严格输入就会非常清楚我们不只是处理一个随机字符串。

比较可能令人困惑的双字符串:

public User(String name, String telephoneNumber)

与干净的OOP方式:

public User(String name, TelephoneNumber telephoneNumber)

我认为在这种情况下,优势超过了弱势群体。我现在关注的是以下两个属性:

-id's(如b3e99627-9754-4276-a527-0e9fb49d15bb) -e-mailadresses

这个“对象”实际上只是一个字符串。将它们变成对象似乎有点过分。特别是user.getMail.getMailString()种方法真的很烦我,因为我知道mailString是邮件的唯一属性。但是,如果我不将它们变成对象,我就会失去一些优势。

所以我的问题是:您如何在Web应用程序中处理这些概念?是否有最佳做法或其他问题需要考虑?

2 个答案:

答案 0 :(得分:4)

如果你使用字符串来解决所有问题,你实际上放弃了类型安全,你必须输入"键入check"在使用字符串的任何类或方法中进行验证。这个验证代码不可避免地会重复,并使其他类变得臃肿,混乱,并且可能不一致,因为验证在所有地方都不一样。你永远无法确定字符串是什么,所以调试变得更加困难,维护变得丑陋,最终浪费了大量的开发人员时间。鉴于现代处理器的强大功能,您不必担心使用大量对象的性能成本,因为它不值得牺牲程序员的工作效率(在大多数情况下)。

我发现的另一件事是,字符串变量往往更容易被未来的程序员滥用,他们需要快速修复"所以他们为了方便而设置新值他们需要的地方,而不是扩展类型,并明确发生了什么。

我的建议是尽可能使用有意义的类型。

最大限度地提高打字的好处会带来“微小类型”的想法,你可以在这里阅读:http://darrenhobbs.com/2007/04/11/tiny-types/

本质上,它意味着您创建类来表示所有内容。在使用User类的示例中,这意味着您还将使用Name类来表示名称。在该课程中,您可能还有两个课程FirstNameLastName。这增加了代码的清晰度,并最大化了编译器阻止您制作的逻辑错误的数量。在大多数情况下,你永远不会在你想要姓氏的地方使用名字,反之亦然。

答案 1 :(得分:1)

对象的一大优势是它们可以拥有方法。例如,您的所有数据对象(电话号码,地址,电子邮件等)都可以使用IValidatable方法实现相同的接口validate,这很明显。在这种情况下,将电子邮件包装在对象中也是有意义的,因为我们确实想验证电子邮件。关于ID - 假设它是由你的应用程序内部分配的,你可能不需要包装它。