库是否应公开帮助程序类

本文关键字:帮助程序 是否 | 更新日期: 2023-09-27 18:33:56

我们正在设计一个仅限内部使用的库,它将作为几个即将推出的应用程序的核心业务对象模型。它主要涵盖各种类型的客户和各种类型的文档。

显然,我们希望确保如果你要使用这些对象,特别是如果你要序列化它们,它们具有有效的、合理的值。

例如,客户有联系信息,其中包括电话号码。所以有一个ITelephoneNumber接口,基类,一个美国实现,所有这些。库使用这些类来验证其数据。

但实际上,客户对我们来说更像是一个"核心"业务对象,而电话号码则不然;为电话号码写一堆结构,并将其暴露为我们的图书馆善良,感觉有点奇怪。它们似乎有点"超出范围"。

电话号码就是一个例子;还有其他事情。我们可以将这些类结构重构为静态方法,但是我们有冗长的构造函数,它们必须"只知道"才能使用这些方法等。我们决定上课很多。

我的问题是

使用者是否必须使用这些对于定义核心对象并不真正必需的帮助程序类?如:

MyCustomer.SetTelephoneNumber(new USTelephoneNumber("555", "555", "5555%$&"));
为您提供编译时反馈,他们自己的成员(区码,交换...(等等。

还是我们应该把获取有效电话号码的方法留给实施,并对此更加"黑匣子"?如:

MyCustomer.SetTelephoneNumber("555-555-5555%$&");
只会抛出错误或静默失败/成功或返回字符串。空的什么的。


我不知道这个问题能不能"回答",我也不想发动任何圣战。无论哪种方式,我都在寻找一些推理。我们只是一个 2 人团队,试图在一个不关心代码质量或可维护性的机构中做正确的事情。

库是否应公开帮助程序类

这个问题的关键是你说它是一个"仅限内部的库"。这意味着完全由内部开发团队决定如何实现库。为了做出这些决定,我将研究两种实现可能性的价值。

更复杂的实现是否会在以后的开发中节省您的时间和精力?

更复杂的实现是否会阻止您在使用库时一遍又一遍地编写验证代码?

这些问题可以帮助您确定复杂的实现是否有价值。如果预先编码从长远来看可以节省您的时间,那么这是值得的。如果在可预见的未来,预先编码不会节省时间和精力,那么就不值得付出努力。

电话号码似乎是您网域的一部分,因此请公开它们。理想情况下,整个应用中的所有代码都将共享此电话号码对象并对其进行标准化。也许它甚至应该存在于较低层(数据格式库等,独立于客户等更高级别的对象(。

正如你所注意到的,这个问题可能无法回答。所以这不是一个答案,但是(因为它太长了,无法发表评论(我会在这里写:我会选择这两种选择,为SetTelephoneNumber提供两种覆盖

您的客户类如何知道如何将电话号码验证为美国号码?如果您假设美国客户将拥有美国电话号码,则在某些情况下,该假设可能是错误的。因此,既有一个"简单"覆盖来处理最可能的情况,另一个覆盖一个允许您指定不常见情况,都是公平的。

如果可以为电话号码注入不同类型的验证逻辑,而不是将它们"隐藏"在类中,您的系统也将变得更容易测试。

也就是说,我不会想太多。"尝试做正确的事"是件好事,但也很容易陷入FizzBuzz企业版综合症。