首页 > 代码库 > 让你的代码只做一件事情

让你的代码只做一件事情

还记得周星驰主演的电影《国产凌凌漆》有一段让人捧腹的情节, 在凌凌漆和司令对战时刻, 达文西半路杀了出来, 扬言要让司令尝一下他新发明的集10种致命武器于一身的「要你命3000」的威力, 传说这是胜过任何武器10倍威力的杀人利器,然而,还没等武器开锋,司令一枪就把达文西给打残了。周星驰的电影就是这么无厘头,但通过这个情节来仔细观察我们的世界,会发现一种规律,我们人类生产的任何工具,都是针对解决特定问题的, 换句话说, 很多工具功能都是单一性的, 多功能的事物似乎没有那么容易流行开来,就像文西发明的要你命3000一样。 其中例子举不胜举

洗发水、沐浴露、洁面乳虽然都是清洁用品,但都是有各自的作用

小说、技术书籍、课本虽然都是书籍, 但是都是针对不同领域的

篮球鞋、足球鞋、跑鞋虽然都是鞋子,但都是为不同类型的运动设计的

汽车、货车、客车。。。

客厅、厨房、卫生间。。。

就连一部手机中的app也有不同种类分别起着不同的作用。

存不存在这样一种工具, 它集成了所有或者大量的功能, 只要使用它就能解决掉我们需要解决的所有的问题?手机和电脑或许算是这类工具的典型代表,能帮我们做很多事情 。 然而,事实上具体替我们做事情是装在它们内部的软件 , 而这些软件的功能是单一的, 微信用来聊天, 新闻客户端就来了解实事, 支付宝用来付钱、淘宝用来买东西,所以从另一种角度来说, 手机或电脑只是一个功能的集装箱, 用来解决我们问题的还是这个集装箱中的工具。

因此,从中我们可以发现规律 ,我们人类似乎比较偏好于归类和分解, 把某一个大问题分解归类成不同的小问题, 然后发明出针对解决小问题的工具。拿上面举的例子来说, 本来清洁用品只用肥皂就可以了, 现在却被分解成了洗头发的、洗脸的、洗身体的种各五花八门的清洁用品; 我们要学习知识,知识却又会被分解成不同的知识种类,语文、数学、物理、化学等等。我们人类的社会为什么会发展成这样的形态? 我们总是善于组合使用各种不同的功能单一的工具来解决特定的问题, 而不是使用一个功能庞大复杂的工具中的其中几项子功能来解决特定的问题。究其原因,是因为我们人类亲「简单」厌「复杂」,因为我们人类的智商还不够高,一个人无法掌握整个世界的所有规律, 因此只能将事物分解和单一化, 然后不同的人掌握和使用这个巨大集合中的其中一部份。

万事万物都逃脱不了这种规则的制约,包括虚拟的计算机世界。 在软件的用户眼里, 一个软件由不同的功能组合而成, 比如说微信,它可以聊天、看朋友圈、付钱、看公众号文章。然而在程序员眼里, 这里的任何功能还可以再一次细分, 比如说看朋友圈, 在实现层面大概有以下几个流程,客户端从网络请求数据、将数据转换成界面、显示文本、显示图片等等,而且这些功能还可以再次分解, 一层一层下去直到分解成一行一行的代码为止。 从某种角度去理解,一个程序有一万行代码, 那么就意味着它由一万个功能项组成, 然而,这显然太过于复杂的不利于我们大脑去理解了, 然后就出现了函数,用函数对这些细小的功能来进行整理划分,使得代码易于理解, 这就好比图书馆有这么多书都会被放在不同种类的书架了,因为这样易于读者寻找。 然而, 当代码量过大, 功能过于复杂时,以函数为单位的代码也会出现了理解上的困难,于是接下来又出现类、包(名称空间)等更高级别的代码归类工具。就像一个大型图书馆, 书籍会按照书架、区域、楼层等不同的方式来划分书籍的放置区域。 而且这些书籍并不是被随意放置的, 计算机的书籍不可能出现在医学类的书架上,儿童读物的书架也不可能被放在成人类书籍区域,因为这会大大的影响读者寻找书籍效率。

代码的组织和图书管书籍的放置在道理上是相同的, 只是具体实施起来要复杂灵活的多, 其中大致的规律就是

一行代码只有一种意思。 反例:定义一个变量, 即用来放置姓名,又用来放置性别。

一个函数只做一件事情。 首先,函数名称的含义一定要和代码实质做的事情保持一致; 其次,切记不要让一个函数实现过多的功能,比如有一个删除用户信息的函数, 而且信息又关联到许多的数据, 如登录记录、登出记录、订单数据、权限数据等等, 可能删除所有这些数据需要上百行代码, 那么千万不要把所有的代码放在一个函数里,宁可把删除各类数据的代码放在各自的子函数,然后通过删除用户的函数调用这些子函数来实现具体的操作。

一个类和一个包(名称空间)也只做一件事情 。 这其中的要点就是对功能的细化与抽象, 一个类中有若干个函数, 每一个函数分别实现单一的不同的功能,而类就是更高层面的单一的功能项, 就拿上面删除用户的例子来说, 其实我们完全把删除用户这一个操作组织成一个类, 这个类的功能就是删除用户, 而类中的函数分别是删除用户登录信息、删除用户登出信息、删除用户订单、删除用户权限等等,问题的关键在于代码的逻辑一定要顺畅 , 易于理解 。 同样,包(名称空间)就是类级别以上的归纳方法,从更高的层面上去理解, 它的功能项也必须是单一的。 如同图书馆内, 不同的书籍区域就可以看作是程序设计中的包,如计算机区域、医学区域、国外文学区域。 而区域下面的书架就可以看作是类,比如说计算机区域下Java书籍的书架、.net书籍的书架、操作系统书籍的书架 等等。

想要一个项目易于理解易于维护, 就需要有清晰的脉络, 小水流汇聚成溪、溪汇聚成河、河汇聚成江、江汇聚成海, 一切都要井井有条。所谓软件工程,就是要将代码合理的组织在一起,克服复杂多变的需求, 使之能清晰、高效、有条不紊的运行。 最后还是那句话:人的脑子太笨了, 复杂的东西理解不了, 我们要使用手段和技巧将问题变的简单再简单,分而治之, 才能高效的解决。

 

本文首发于微信公众号 「带你撸出一手好代码」,欢迎关注获取更多原创分享。

技术分享

让你的代码只做一件事情