我正在研究可以帮助我编写更小但更复杂的代码的算法.我可以设计一个20行的算法,而不是编写150行if-else语句.问题是很多这些算法都很复杂,需要大量的数学才能理解它们.我也是这里唯一了解他们的人.
为了代码的可维护性,像其他人一样编写代码会更好,还是使用算法更好?
正如爱因斯坦所说:
让一切尽可能简单,但并不简单.
它适用于代码和物理.
用你的判断 - 它会更容易维护吗?通常通过将较大的if/else混淆减少为较小的东西,可以移除不需要存在的角落情况,从而防止将来可能出现的错误.当然,通过将一组清晰的条件简化为一种只是恰好起作用的布尔逻辑的模糊扭曲,你可能会在事情发生变化时使事情变得更加困难.
编辑:
根据你引用的案例,如果公式将起作用,那么它可能是更好的选择 - 你甚至可以引用来源的评论.但完全可能的是,公式之前存在,但是被删除以允许解决特定情况.这是您的版本控制存储库中的注释应该有用的东西.
由于还没有人发布链接,这里是他所指的PID算法的描述.
代码写入一次,读取10次.因此,您应尽量使其易于理解.
此外,调试比编写代码要困难得多.那么,当你已经把所有的脑力都写进复杂的代码时,你怎么能调试你的代码呢?
试着遵循软件开发的三个定律:
开发人员必须编写能够创造价值的代码.
开发人员必须使代码易于维护,除非此类支出与第一部法律相冲突.
开发人员必须将代码减少到尽可能小的范围,只要这种减少与前两个法律不冲突即可.
罗伯特C.马丁使用这部漫画作为他的书清洁代码的介绍:
(来源:osnews.com)
请记住,代码应该主要由人类理解......编译器负责使计算机理解.
"复杂"的水平在这里可能有点冒险,但只要算法不需要数学博士来解决,
我会说继续使用算法.确保提供关于算法名称的相当级别的文档,可能是对其工作原理的简短描述或对文档的引用.
它将保持代码量的下降,希望为应用程序提供一些额外的性能,并且它有望鼓励你周围的一些程序员学习一些新的东西来添加到他们的保留节目中.此外,确实知道这些事情的程序员总是有可能在以后进入.
好老报价....
任何傻瓜都可以编写计算机可以理解的代码.优秀的程序员编写人类可以理解的代码
马丁福勒
我无法相信任何人认为150行的任何东西比20行的东西更简单.
使用20行,并保护您的同事如下:
记录每个数据结构不变和每个非平凡循环不变量.记录这些不是在注释中,而是在检查不变量的实际代码中.生产期间可以关闭支票.
如果在代码中使用数学公式或派生代码,请在注释(或静态字符串)中包含引用.理想情况下包括两个参考:一个可能在几秒钟内可用的Web引用和一个可能长时间保留并可在大学图书馆中找到的备受好评的教科书.
如果理解你的代码需要特殊的专业知识(理解偏微分方程,物理学学位,伽罗瓦理论,你的名字),那么为了保护自己,你可能希望去管理层说"我有这种特殊的专业知识使它成为现实我可以编写更小的代码(因此更快,更可靠,更易于维护),但是当你必须替换我时,你将不得不雇用具有类似专业知识的人.你想让我做什么? " 如果您能告诉您的管理层如何轻松获得这些专业知识,将会很有帮助.例如,许多具有工程学位的人可以学习偏微分方程,但伽罗瓦理论家在地面上相当薄.
PS这是一个爱好项目的示例注释,所以我可以稍后调试自己的代码:
/* * Compute the position of a point partially along the geodesic from * pt1.lat,pt1.lon to pt2.lat,pt2.lon * * Ref: http://mathworld.wolfram.com/RotationFormula.html */
虽然复杂,但已不复存在.
这实际上取决于复杂的手段.如果你的"简单"算法是150行几乎相同的代码,我的眼睛将会釉面,我将无法理解它.如果你把这些条件放在一个矩阵或者什么东西中,然后你的代码就是一个循环来读取矩阵并做出决定,我会更好地理解它,即使循环可能不像"if/else"语句那么"简单".
如果基本上你在谈论一个Perl程序,你在一行中做了大量的事情,大量使用默认变量$ _我会说坚持使用更长的更冗长的版本.
如果有一个公认的公式可以做某事,那么你可以使用公认的公式.如果有一个简单的代数公式需要3或4行并且有一个复杂的微分方程需要一条线,那么你应该使用简单的代数公式.在评论中提到的情况下,我认为PID算法比150行if/else代码"更简单".我不认为你使用算法来模糊任何东西,而是你在问题领域使用标准技术.只需确保对其进行评论,甚至可以包含指向描述公式的网页的链接.
寻找通过100行if/else语句的方式通常(在我看来)维护人员的耐力比在同一时间理解更好的算法(应该在评论中解释或链接)并且最后只是验证实现的20行确实执行了那一行.它还具有在工作中受教育的好处,这使得它更有趣(在积极意义上),并且通常还有更好的执行概况(更少使用资源).
你应该避免的聪明之处是"聪明的黑客"形式,滥用语言而没有实际的好处.你应该拥抱的聪明才智总是使用最好的算法.
编辑:关于PID示例:我发现很难想象PID的功能可以被一堆if-else语句巧妙地替代.if-else解决方案总是会工作得更糟(转换不太平滑),很难维护,而且很难调整(调整PID部分对于获得所需的行为非常重要).我想补充一点,理解PID并不太难,即使你不知道数学,也可以轻松查找.