我有一个典型的商业Web应用程序,其中域包含帐户和用户等实体。我的后端是Java,因此它们由POJO代表。在早期迭代期间,这些POJO的每个属性都只是字符串。这是有道理的,因为html输入是一个字符串,数据在数据库中持久化的方式也类似于字符串。
最近,我们一直在努力验证这种输入,如果我切换到这种属性的对象表示法,我发现它会有所帮助。例如,TelephoneNumber
类包含:
这个课程有优点和缺点:
比较可能令人困惑的双字符串:
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应用程序中处理这些概念?是否有最佳做法或其他问题需要考虑?
答案 0 :(得分:4)
如果你使用字符串来解决所有问题,你实际上放弃了类型安全,你必须输入"键入check"在使用字符串的任何类或方法中进行验证。这个验证代码不可避免地会重复,并使其他类变得臃肿,混乱,并且可能不一致,因为验证在所有地方都不一样。你永远无法确定字符串是什么,所以调试变得更加困难,维护变得丑陋,最终浪费了大量的开发人员时间。鉴于现代处理器的强大功能,您不必担心使用大量对象的性能成本,因为它不值得牺牲程序员的工作效率(在大多数情况下)。
我发现的另一件事是,字符串变量往往更容易被未来的程序员滥用,他们需要快速修复"所以他们为了方便而设置新值他们需要的地方,而不是扩展类型,并明确发生了什么。
我的建议是尽可能使用有意义的类型。
最大限度地提高打字的好处会带来“微小类型”的想法,你可以在这里阅读:http://darrenhobbs.com/2007/04/11/tiny-types/
本质上,它意味着您创建类来表示所有内容。在使用User
类的示例中,这意味着您还将使用Name
类来表示名称。在该课程中,您可能还有两个课程FirstName
和LastName
。这增加了代码的清晰度,并最大化了编译器阻止您制作的逻辑错误的数量。在大多数情况下,你永远不会在你想要姓氏的地方使用名字,反之亦然。
答案 1 :(得分:1)
对象的一大优势是它们可以拥有方法。例如,您的所有数据对象(电话号码,地址,电子邮件等)都可以使用IValidatable
方法实现相同的接口validate
,这很明显。在这种情况下,将电子邮件包装在对象中也是有意义的,因为我们确实想验证电子邮件。关于ID - 假设它是由你的应用程序内部分配的,你可能不需要包装它。