在实现复杂的给定算法时,保持干净的代码和良好的体系结构的挑战
背景
在我学士学位的上学期中。 在电气工程领域,我们被分配了实施WFQ-GPS路由算法的项目,作为计算机网络课程的一部分。 除了将其实现为在线调度方法(这会对输入数据包的处理产生影响)之外,我们没有任何其他限制。 效率是一个奖励。
我认为这个项目是一个很好的机会,可以提高我的软件工程技能,并以干净有效的方式编写此算法。 不幸的是,我的愿望没有实现,由于期限的限制,我和我的伴侣妥协了,最终交出了一个“完成”而不是一个完美的项目。
学期结束后,我决定实现自己的目标,并以正确的方式完成此项目。
决定
- 我需要学习C ++。 最初的项目是用C编写的,但是我知道C ++包含更多有用的数据结构(例如STL库),并且在内存分配和实现设计模式方面更加灵活。
- 我是C开发人员,我已经知道C ++的主要概念。 那么,成为C ++-er的最佳方法是什么? 有一些指南概述了这两种语言之间的区别。 但是,我发现最有用的是咨询我的一位资深C ++开发人员。 他为我提供了对该语言及其最佳实践的更广阔视野。 他还同意在整个项目中指导我,这是无价的。
入门
提高我的绘画技巧
我开始绘制代码的体系结构。 我从以前的几个项目中学到的最好的教训之一是,这一步骤至关重要且非常有帮助。 它有很多优点,值得重点介绍:
- 它可以帮助您更好地理解您愿意实现的功能,因为设计首先应该服务于算法的正确性。
- 它是代码的映射-您可以在其中决定对象,对象之间的关联,共享资源和数据结构。 写作 (不是在你的脑袋假想文件)了这一切提前,你想想上述所有的力量,实际写入之前。 我通常使用draw.io或简单的笔和纸(希望获得更多好的工具的建议)。
- 当事情变得肮脏(并且当您开始编写和/或有到期日期时事情确实变得肮脏)或在调试过程中时,可以返回到此安全区域。 它确切地提醒您您打算做什么。 当然,它将在此过程中进行修改,但这就像您的代码指南针一样。
- 这对于与同行的协作非常有价值。
测试。 一切。
根据我过去的经验,以及我对C ++的了解,我对整个过程进行了几乎所有的测试。 这是我第一次采用这种方式,并且证明了自己。
一个很好的例子是我学会了在函数内部创建对象时必须使用“ new” (这使它们分配在堆中,而不是在函数堆栈中),以防我希望在函数(以及函数外部)使用它们的情况。然后释放此内存)。 这是在我将对象的创建导出到与main不同的功能之后,即使它只是“取出”相同的行并从中创建功能-我进行了测试并找到了问题。 多亏了我的导师,我才得以学习这种练习。
(我将在下一篇文章中详细说明在此类项目中何时,如何以及以什么方式进行调试)
一步一步来
一旦有了对效率,体系结构和对C ++功能的充分使用方面满意的坚实的代码框架,我便从一个基本示例开始。 它类似于算法的工作方式。 然后,我进入了我的第一个“真实”输入。
基本示例在第一次尝试时几乎完美无缺。 我的想法是:
我做对了所有事情,我的代码很棒,现在一切都应该正常工作。
不。 我的意思是,这的确带给我一个很好的观点,但是最初的实际投入仅部分起作用。 我希望它表现不佳。 这几乎使我完全放弃了我所画的体系结构,并且对代码进行了微调试,以了解其故障,而没有任何有关新功能和特性的文档。 不好。
多亏了Git,我让我想起了这个项目的目标,不久之后,我又回到了我的体系结构,即“罗盘”,试图找出缺少的内容。
目前,在3个输入中有2个工作正常,这非常令人满意。 这些天来,我正在努力理解为什么第三个不是。
要回到我的图纸。 第二部分见。
顺便说一句,您可以在这里找到我的代码,请随时提出您的建议,并帮助我成为更好的软件工程师。
From: https://hackernoon.com/is-done-better-than-perfect-part-1-2500e616ce16