任何人都可以编写代码。但是好的代码?
我们都听说过有关意大利面条代码,庞大的if-else链,整个程序(只需更改一个变量即可中断),看起来像被混淆的函数的恐怖故事,以及以此类推。这就是当您尝试只用一学期的编程经验来制作可交付产品时所发生的事情。
不要为编写有效的代码而感到满足。旨在编写可以维护的代码-不仅可以由您自己维护,还可以由将来可能在某些时候使用该软件的任何其他人维护。为此,这里有一些原则可以帮助您清理行为。
1。吻
“保持简单,愚蠢"的原则几乎适用于所有生活,但是在大中型编程项目中尤为必要。
在定义要创建的对象的范围时,它从头开始。仅仅因为您对游戏开发充满热情并不意味着您可以创建下一个魔兽世界或侠盗猎车手。当您认为已经足够简化时,请将其进一步简化一级-不可避免地会出现特征蠕变,因此请从小做起。
但是即使编码已经开始,也要保持简单。复杂的代码需要花费较长的时间设计和编写,更容易出现错误和错误,并且以后很难修改。用安托万·圣艾修伯里(Antoine de Saint-Exupery)的明智话来说,“实现完美,不是在没有其他可添加的东西时,而是在没有其他东西可取的时候。"
2。 DRY
“不要重复自己"的原则对于干净且易于修改的代码至关重要。这是常见的编码错误。在编写代码时,您要避免重复数据和逻辑。如果您发现一遍又一遍地重复编写同一代码块,那么您就违反了这一原理。
DRY代码的相反之处是WET代码:“将所有内容编写两次"(或“浪费每个人的时间") )。诊断WET代码的最佳方法之一是问自己:为了以某种方式改变程序的行为,您需要修改多少个代码区域?
假设您正在编写播客目录应用程序。在搜索页面上,您具有用于提取播客详细信息的代码。在播客页面上,您有代码来获取该播客的详细信息。在“收藏夹"页面上,相同的获取代码。考虑将所有内容抽象为一个函数,以便以后需要编辑时,可以一次完成所有操作。
3。打开/关闭
无论您是使用Java编写对象还是使用Python编写模块,都应着眼于使代码可以扩展但不能修改。这适用于所有类型的项目,但是在发布供他人使用的库或框架时尤其重要。
例如,假设您要维护GUI框架。您可以原样发布它,希望最终用户直接修改和集成您发布的代码。但是,四个月后发布主要更新时会发生什么?他们如何实现您所有的添加而又不丢弃所有已完成的工作?
相反,发布防止直接修改并鼓励的代码延期。这将核心行为与修改后的行为分开。好处?更高的稳定性(用户不会意外破坏核心行为)和更高的可维护性(用户只担心扩展代码)。
4。打开/关闭原则是制作良好API的关键。组成>继承
“继承之上的组成"原则指出,具有复杂行为的对象应该通过包含具有个别行为的对象实例来做到这一点,而不是继承类并添加新行为
过度依赖继承会导致两个主要问题。首先,继承层次结构可以在眨眼之间变得混乱。其次,您在定义特殊情况下的行为时灵活性较差,尤其是当您想要从另一个继承分支中的一个继承分支实现行为时:
该组成部分编写起来更加简洁,易于维护并且就您可以定义的行为类型而言,允许几乎无限的灵活性。每个单独的行为都是其自己的类,您可以通过组合单独的行为来创建复杂的行为。
5。单一职责
单一职责原则说,程序中的每个类或模块都应该只关心提供一点特定功能。正如罗伯特·C·马丁(Robert C. Martin)所说,“一个类应该只有一个改变的理由。"
类和模块通常是从这种方式开始的,但是当您添加功能和新行为时,它们很容易演变成需要数百甚至数千行代码的God类和God模块。此时,您应该将它们分解为较小的类和模块。
6。关注点分离
关注点分离原则类似于单一责任原则,但更为抽象。从本质上讲,应该设计一个程序,使其具有许多不同的不重叠封装,并且这些封装彼此之间不应了解。
一个著名的示例是model-view-控制器(MVC)范式,它将程序分为三个不同的区域:数据(“模型"),逻辑(“控制器")和最终用户看到的内容(“视图")。 MVC的变体在当今最流行的Web框架中很常见。
例如,用于将数据加载和保存到数据库的代码不需要知道如何在Web上呈现该数据。 。呈现代码可以从最终用户那里获取输入,但是随后将该输入传递给逻辑代码进行处理。每个部分都处理自己。
这产生了模块化代码,使维护变得更加容易。而且在将来,如果您需要重写所有渲染代码,则可以这样做,而不必担心如何保存数据或如何处理逻辑。
7。 YAGNI
“您不需要它"原则是这样的想法,即您永远不要为将来可能需要的功能编写代码。可能是,您不需要,并且会浪费时间,不仅浪费时间,而且会不必要地增加代码的复杂性。
您可以查看此内容作为KISS原则的具体应用,以及对那些过于重视DRY原则的人的回应。通常,没有经验的程序员会尝试编写尽可能抽象的通用代码来避免WET代码,但是太多的抽象最终导致膨胀且无法维护的代码。
诀窍是仅在以下情况下应用DRY原理:你需要。如果您发现一堆代码被一遍又一遍地写了,那么就对它们进行抽象化-但是当您认为时,绝不会一遍又一遍地写一段代码。
8。避免过早优化
不过早优化原则与YAGNI原则相似。区别在于,YAGNI在必要时便解决了实现行为的趋势,而该原则在必要时就解决了加速算法的趋势。
过早优化的问题在于,直到事实出现之后,您才真正知道程序的瓶颈在哪里。您当然可以猜测,有时您甚至可能是对的。但是通常,您会浪费宝贵的时间来尝试加速一个功能,该功能不会像您想的那样慢,或者不会像您期望的那样被频繁调用。
达到您的目标尽可能简单地实现里程碑,然后配置代码以确定真正的瓶颈。
9。重构,重构,重构
作为一个没有经验的程序员,最难接受的事实之一是代码很少是第一次出现的。当实现该闪亮的新功能时,它可能会感觉,但是随着程序复杂度的提高,早期的编写方式可能会阻碍将来的功能。
代码库是不断发展。重新访问,重写甚至重新设计整个代码块是完全正常的,不仅正常,而且很健康。与开始时相比,您现在对项目需求的了解更多,并且应该定期使用这些新获得的知识来重构旧代码。
请注意,这不一定总是一个大过程。翻阅美国童子军的一句话,他的话是这样的:“让营地比您发现的更干净。"如果您需要检查或修改旧代码,请始终对其进行清理并使其处于更好的状态。
10。干净代码>聪明代码
说到干净代码,把我的自我遗忘在门外,忘记编写聪明代码。您知道我在说什么:看起来更像是一个谜而不是解决方案的代码,其存在仅仅是为了展示您的才智。事实是,没有人真正在乎。
一个聪明的代码示例就是将尽可能多的逻辑打包到一行中。另一个例子是利用一种语言的复杂性来编写奇怪但实用的语句。仔细检查代码时,可能会引起任何人说“等待,什么?"的事情。
好的程序员和可读代码齐头并进。必要时发表评论。遵守样式指南,无论是由语言(例如Python)还是公司(例如Google)规定。遵守每种语言的习惯用法,并停止用Python编写Java代码,反之亦然。请参阅我们有关编写更简洁代码的技巧的文章。
是什么使一个好的程序员成功?
问五个人,您会得到10个不同的答案。对我来说,一个优秀的程序员就是这样一个人,他理解编码最终应该为最终用户服务,他们很容易与团队合作,并且按时按规格完成了项目。
卡住了,请参阅有关克服程序员障碍的文章。而且,如果您不满意编写代码,请阅读我们的文章,以了解您并不是程序员的本意。
如果您刚刚起步,请专注于学习如何轻松编写代码。不确定首先要使用哪种编程语言?出于实际原因,C#是一个很好的起点。
标签: 编程