【发布时间】:2021-08-30 13:43:11
【问题描述】:
我最近注意到我们代码库中较早编写的一个函数,我确信它在逻辑上是不正确的。函数是用 TypeScript 编写的,它的主体是这样的:
const getUserInitials = (user: IUser | null) => {
if (!user) { return ""; }
return (user.FirstName.charAt(0) + user.LastName.charAt(0)).toUpperCase();
}
我很确定这是不正确的,因为这种函数签名允许传递不正确的参数,然后在内部尝试通过返回空字符串来修复不正确的 arg 通道。我认为这应该改写为只保留IUser 类型(而不是IUser | null)的用户参数,并且应该在函数调用之外和之前进行这种参数检查,以便函数始终接收正确的参数。
在开发时是否应将其视为经验法则?我不是在谈论当你收到一个整数并且你的函数只有在你的整数必须不超过 100 时才需要运行的情况。显然,你需要检查函数内部的那种东西,因为有人可以通过不正确的值,这是您无法控制的。这似乎是对函数的合理关注,我们显然需要在内部检查它以提供正确的函数输出。
但在本例中,情况完全不同 - 函数合同说它会给你一个用户的首字母,但在某些情况下,它只会返回一个空字符串“”(这不是用户首字母,所以它是一个如我所见,违反了功能合同)。
我什至会说函数命名不正确,应该调用它
getInitials(user: IUser) => {...}
因为我们清楚地将用户作为参数,所以函数名中的“用户”一词是多余的。
-
首先 - 在这种情况下,我对违反合同以及在调用函数之前检查参数正确性的必要性的理解是否正确?
-
如果我是正确的 - 是否存在在静态类型语言中检查内部参数正确性的好方法(在我的示例中跳过案例,整数需要不超过 100 和类似的案例,哪个当然与语言类型系统无关)?
-
我在函数名冗余中关于“用户”的说法正确吗?
提前谢谢你。
【问题讨论】:
-
就我个人而言,我发现这更像是一组主观问题,但我不会投第一次近距离投票。但是,我会支持主观投票。
-
我觉得你应该和你的队友讨论一下
-
@GuyCoder 如果问题讨论了正确/不正确的设计,这怎么会是主观的?还是说正确设计的整个主题都是主观的?
-
我并没有回避您的评论,每次我写回复都会变成一篇文章。您问题中的矛盾之处在于使用了我认为的两个相互竞争的标签,
language-agnostic和typescript。 -
@GuyCoder 好吧,完全没有矛盾。 1. 与语言无关的标签——因为这个问题本质上是不可知的,几乎可以应用于所有主要的主流语言。 2. typescript 标签 - 仅仅因为所讨论的具体示例是用 typescript 组成的,仅此而已。但问题不在于打字稿细节,这是真的
标签: typescript language-agnostic coding-style refactoring code-cleanup