我认为您必须从另一个角度来看这个概念。从数据库设计人员的角度看一下:在第一个示例中传递的类型并没有以唯一的方式定义参数,更不用说一种有用的方式了。
public void bookTicket(
String name,
String firstName,
String film,
int count,
String cinema);
需要两个参数来指定预订门票的实际顾客,您可能有两部具有相同名称的电影(例如翻拍),您可能有同一部具有不同名称的电影(例如翻译)。电影院的某一个链可能有不同的分公司,所以你怎么在一个字符串,并以一致的方式来处理那些(例如,您正在使用$chain ($city)
或者$chain in $city
甚至是别的东西你怎么确保这是最糟糕的实际上是通过两个参数来指定您的顾客,提供名字和姓氏的事实并不能保证有效的顾客(并且您不能区分两个John Doe
s)。
答案是声明类型,但是如我上面显示的那样,它们很少是薄包装器。它们很可能会用作您的数据存储或与某种数据库耦合。因此,一个Cinema
对象可能会具有名称,位置等,这样您就可以摆脱此类歧义。如果它们是薄包装纸,那么它们是巧合。
因此,恕我直言,博客文章只是说“确保您传递正确的类型”,其作者只是做出了过于严格的选择,特别是选择了基本数据类型(这是错误的信息)。
建议的替代方法更好:
public void bookTicket(
Name name,
FirstName firstName,
Film film,
Count count,
Cinema cinema);
另一方面,我认为该博客文章对所有内容都进行了包装。Count
太普通了,我可以用它来数苹果或橙子,再加上它们,但仍然有种种情况,类型系统允许我进行无意义的操作。您当然可以应用与博客中相同的逻辑并定义类型CountOfOranges
等,但这也很愚蠢。
为了它的价值,我实际上会写一些像
public Ticket bookTicket(
Person patron,
Film film,
int numberOfTickets,
Cinema cinema);
长话短说:您不应该传递无意义的变量;只有当您运行查询(例如public Collection<Film> findFilmsWithTitle(String title)
)或将概念证明放在一起时,您才实际指定一个值并不能确定实际对象的对象。保持类型系统整洁,因此不要使用过于笼统的类型(例如,以表示的电影String
)或过于严格/特定/人为(例如,Count
而不是int
)的类型。只要有可能,就使用一种类型来唯一且明确地定义对象。
编辑:更简短的摘要。对于小型应用程序(例如概念验证):为什么要打扰复杂的设计?只需使用String
或int
并继续使用它。
对于大型应用程序:您是否真的有很多类包含一个具有基本数据类型的单个字段?如果此类类很少,那么您只有“普通”对象,没有什么特别的事情。
我觉得封装字符串的想法……只是一个不完整的设计:对于小型应用程序来说过于复杂,对于大型应用程序来说不够完整。