您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    如何处置前任顺序员留下的代码
    时间:2017-10-30 12:21 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    沙龙活动 | 去哪儿、陌陌、ThoughtWorks在自动化运维中的实际!10.28不见不散!

    作为软件工程师不可避免会遇到的一个场景是:我们在改动或添加一个功用到不是我们创立的、我们不熟习的、与我们担任的系统部分有关的代码中时,会遇到费事。虽然这能够会是一个繁琐而艰难的义务,但是由于运用其他开发人员编写的代码有很大的灵敏性,所以我们可以从中失掉大大的益处,包括添加我们的影响范围,修复软件腐朽以及学习我们以前不了解的系统部分(更何况,还可以学习其他顺序员的技术和技巧)。

    思索到运用其他开发人员编写的代码既有其厌烦之处,又有其优势所在,所以我们必须小心不要犯一些严重的错误:

    我们的自我看法:我们能够会觉得本人知道得最多,但通常理想并非如此。我们要更改的是我们知之甚少的代码——我们不知道原作者的意图、招致此代码的决策以及原作者在写代码时可用的工具和框架,等等。谦逊的质量价值千金,你值得拥有。

    原作者的自我看法:我们行将接触的代码是由另一个开发人员所编写的,另一种作风、约束、期限和团体生活(消耗他或她任务之外的时间)。只要当我们末尾质疑他或她做出的决议或质疑代码为什么这么不洁净的时分,那人才会自我反省,不至于夜郎自大。我们应该尽一切努力让原作者协助我们任务,而不是阻碍我们。

    对未知的恐惧:很多时分,我们将要接触的代码是我们知之甚少或完全一无所知的。令人惧怕的是:我们将对我们所做的任何改动担任,但是我们基本上就像是在没有光线的黑暗屋子里走动一样。其实我们不需求担忧,而是应该构建一种使我们可以在大小不一的改动中感到温馨的结构,并允许我们确保没有破坏现有的功用。

    由于开发人员,包括我们本人,是人,所以在处置其他开发人员编写的代码时,处置好很多人的天分红绩是很有用的。在这篇文章中,我们将经过我们可以运用的五种技术来确保将对兽性的了解成为我们的优势,从现有代码和原作者吸取尽能够多的协助,并使得其他开发人员编写的代码最后变得比原来更优秀。虽然这里列出的5个办法并不片面,但是运用下面的技术将确保在完毕改动其他开发人员编写的代码时,我们有决计保持现有功用的任务形状,同时确保我们的新功用与现有的代码库协调分歧。

    如何处置前任顺序员留下的代码

    1.确保测试的存在

    要想确保在其他开发人员编写的代码中所存在的现有功用实践可以按照预期的方式任务,并且我们对其停止的任何更改都不会影响到功用的完成,独一真正令人决计十足的方式是用测试来支持代码。当我们遇到另一位开发人员编写的代码时,代码有两种所处的形状:(1)没有足够的测试水平,或(2)有足够的测试水平。遇到前一种状况,我们得担任创立测试,而在后一种状况下,我们可以运用现有的测试来确保我们做出的任何更改都不会破坏代码,并尽能够多地从测试去了解代码的意图。

    创立新测试

    这是一个悲伤的例子:我们在改动其他开发人员的代码时,要对更改结果担任,但是我们没有办法保证我们在停止更改时不破坏任何东西。抱怨是没有用的。无论我们发现代码处在什么样的条件下,我们总归是要接触代码,因此假设代码坏掉了,就是我们的责任。所以我们在改动代码时,一定要掌控本人的行为。确定不会破坏代码的独一办法是本人写测试。

    虽然这是有趣的,但它允许我们经过编写测试来学习,这是它的主要优点。假定代码如今可以正常任务,而我们需求编写测试,以便预期的输入会招致预期的输入。在我们完成这个测试的进程中,我们逐渐了解到代码的意图和功用。例如,给出以下代码

    public class SuccessfulFilterTest { 

        private static final double THRESHOLD_NET_SALARY = 68330.0; 

        @Test 

        public void under30AndNettingThresholdEnsureSuccessful() { 

            Person person = new Person(29, THRESHOLD_NET_SALARY); 

            Assert.assertTrue(new SuccessfulFilter().test(person)); 

        } 

        @Test 

        public void exactly30AndNettingThresholdEnsureUnsuccessful() { 

            Person person = new Person(30, THRESHOLD_NET_SALARY); 

            Assert.assertFalse(new SuccessfulFilter().test(person)); 

        } 

        @Test 

        public void under30AndNettingLessThanThresholdEnsureSuccessful() { 

            Person person = new Person(29, THRESHOLD_NET_SALARY - 1); 

            Assert.assertFalse(new SuccessfulFilter().test(person)); 

        } 

    我们对代码的意图以及为什么在代码中运用Magic number知道得并不多,但是我们可以创立一组测试,已知输入产生已知输入。例如,经过做一些复杂的数学和处置构成成功的阈值薪水成绩,我们发现假设一团体的年龄在30岁以下,且每年大约赚68,330美元,那么他被以为是成功的(按照本标准的标准)。虽然我们不知道那些magic number是什么,但是我们知道它们确实增加了初始的薪水值。因此,68,330美元的阈值是扣除前的基本工资。经过运用这些信息,我们可以创立一些复杂的测试,例如:

    public class SuccessfulFilterTest { 

        private static final double THRESHOLD_NET_SALARY = 68330.0; 

        @Test 

        public void under30AndNettingThresholdEnsureSuccessful() { 

            Person person = new Person(29, THRESHOLD_NET_SALARY); 

            Assert.assertTrue(new SuccessfulFilter().test(person)); 

        } 

        @Test 

        public void exactly30AndNettingThresholdEnsureUnsuccessful() { 

            Person person = new Person(30, THRESHOLD_NET_SALARY); 

            Assert.assertFalse(new SuccessfulFilter().test(person)); 

        } 

        @Test 

        public void under30AndNettingLessThanThresholdEnsureSuccessful() { 

            Person person = new Person(29, THRESHOLD_NET_SALARY - 1); 

            Assert.assertFalse(new SuccessfulFilter().test(person)); 

        } 

    (责任编辑:admin)