用继承编写可测试和可维护的代码

总览

软件工程师应努力实现的众多目标之一是构建可测试且可维护的代码,并且似乎许多人无法编写此类代码。 我敢肯定有很多原因会导致这一因素,例如完成项目的紧迫期限,或者工程师可能没有学习编写代码的正确方法。

我在Kaodim工作,我很高兴能有机会向我的前辈学习,并能够理解为什么我们倾向于以某种方式做事。 我记得在Kaodim编码我的第一个功能时,我在很多方面都感到不足,因此开始编写意大利面条式代码。

当我重新审视我的第一个功能时,我开始注意到我以前犯过的错误,并且我觉得自己可以做得更好。 供您参考,我的第一个功能称为“客户注册”,它允许新用户注册,而现有用户可以使用OTP功能登录。 这是该功能的技巧,但是随着我们深入研究,围绕它展开的逻辑很多。 对于这项功能,八月,我的上司创建了一个一次性密码库,我可以不时地对其进行修改,以适应该功能的需求。

代码气候测量

我们使用Code Climate来衡量我们的代码质量和可维护性。 在重构代码之前,我的PhoneNumberViewControllerVerifyPhoneViewController的质量进行了如下测量:

继承方法

这里的计划是专门使用面向对象的编程继承,并且通过这种技术,我能够编写可伸缩且可测试的代码。 让我直观地向您介绍我们预期的代码结构。

为了让您更清楚地了解情况,我有两个父类,其子类数目灵活。 每个子类都将从父类继承,这样我就可以消除子类中的重复代码,并可以添加所需的任意多个子类。

让我以可视化的方式向您展示屏幕,然后给您一个场景。 作为新用户,我输入了我的电话号码,并被提示使用OTP代码进行注册。 然后,我通过短信收到我的OTP代码,并将其输入到我的验证屏幕上。

通过这种方法,我能够最大程度地减少代码中的冗余并拥有更简洁的代码结构。 但是,作为工程师,通过查看代码可以清楚得多。 我们将首先查看父类,在该类中,后端工程师创建了一个API,以检查电话号码以确定是否需要验证电话。 在满足不同条件的情况下,执行了不同的函数,但就我而言,我创建了几个空函数,这些空函数可以被子类覆盖。

比以前的分数高两个等级。 但是从可维护性来看,持续时间从24小时分别提高到25分钟和1小时有很大的提高。 我认为这是一个巨大的进步。 但是,我觉得我们仍然可以做得更好。 随之而来的是,所有子类创建的可维护性得分为A,0分钟。

快速而灵活地编写单元测试

我们将使用Quick&Nimble进行单元测试。 首先,我们将模拟自己的数据,而不依赖于API调用。 我们可以这样做,如下所示:

在这里,我们正在创建自己的模拟数据版本,以确定每个键的值,然后可以选择所需的返回值。

接下来,一旦有了模拟数据,就可以进行相应的测试。 首先,我们将测试电话是否被拿走,我们不允许用户注册。 我们可以通过选择checkNumberCase以返回我们需要的某些值来进行检查。

像往常一样,没有我的上校奥古斯特的帮助,我一个人不可能提出这种解决方案。 他在提出减少重复代码的解决方案方面做得非常出色,我得以在他的指导下实施该解决方案。

最后,我相信有很多不同的方法可以实现这一目标。 但是,我发现它可以以我的方式很好地工作,如果您以任何方式认为可以完成任何改进,请在下面随意评论。