免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2577 | 回复: 6
打印 上一主题 下一主题

[C++] 神级 Coder 为炫耀编出超短码 [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:28
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-23 08:58 |只看该作者 |倒序浏览
  


原文作者为 Allan Reyes 一名退伍军人兼工程师。本文以第一人称编译。
我常逛像是
Exercism
等网站,我在那里编写或重温一些习题来精进我的编码技巧。现在有个危险的流行正在蔓延,我注意到大家很推崇仅用短短几行的代码,认为这样很优雅、有创意,认为这超棒。
但这完全是鬼扯。Brian Kernighan 说得很对:「想帮短码除错比你重写程式还要难两倍。如果你真的觉得自己超会写短码,那麽就等到你帮短码除错的时候再来看看是不是真的那麽厉害吧。」
当你把编码的行数减少到令人费解时,这还会是个容易维护或可长久使用的代码吗?替编码抓错会变得更简单还是更有难度?更重要的是,如果原来的编码跟短码功能一样,那你是不是有点浪费时间呢?
较短的编码不见得代表是更好、更清楚的编码。当你不小心做的超过了,让编码变的难解,或用了模糊且不必要的模组,你可能会得对你的同事一边装可爱,一边说:「我浪费超多时间在完美化与複杂化这个简单模组,所以你现在才可以花超多时间来了解它。你不觉得这超棒的吗?❤揪咪,编码忍者敬上。」
这不但毫无意义而且很自私,而且完全只是种自负的表现。不必要而多馀的代码的确不好,但短码也不总是就是比较好。缩短编码与简化编码有很大的不同,因为缩短编码仅仅只是让编码变短。
我们用两种简单 Python 计算程式来找两个字串间的「汉明距离,又称信号距离(hamming distance)」。汉明距离在独立字元的计算中为不可或缺的角色。
● abcde 与 abcde 之间的汉明距离为 0
● abcde与edcba之间的汉明距离为 4
● abc 与 abcde之间的汉明距离为 2
以下是 Exercism 上被高度推崇的编码:

这是个超棒的编码 … … 如果你的目的是写出混淆代码(code obfucation)的话。
以下是网站上很不起眼的编码:

它用了超过 15 行以上的编码,以及 517 个汉明距离,但让我来解释为什麽这个比第一个范例来的好的原因:
● 伪代码与文档字符串的注解都很清楚。你可以很容易去辨读每个部分与字串的用意,所以任何语言的初级程式员都能理解。有几个「高级程式员(Pythonist)」能第一眼就理解那个比较短的编码?
● 每行都只执行 1 到 2 个方法(method)或操作(operation)。现在你在回头看看第一则裡有多少个 sum method、a != comparison、 forloop 与神奇的 map method 在同一行裡。你可以比较一下,两则之间,哪个比较容易读呢?
● 有逻辑的帮变数命名,有「i」的代表单一字元的变数。你可以试著把第一个范例丢到一个更大型的程式码中,然后试著找找看「x、y、a 或 b」。
综合以上,我们可以清楚了解到每个作者的意图:
● 写短码的人是为他 /她自己而写的。
● 第二则范例的作者是为大家而写的。
我想说的是:拜託你,别当个笨蛋。
无论是前端的 HTML/CSS 或后端的 Python 与 Ruby on Rail,都请你写一个大家都可以读得懂的程式码。
(资料与图片来源:
Medium

                       
                               
                    
                               
                       
                       
                       
                                时间:2015-01-22 17:07来源:Medium 作者:Allan Reyes责任编辑:admin

本文来自ChinaUnix新闻频道,如果查看原文请点:http://news.chinaunix.net/opensource/2015/0123/3232458.shtml

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2015-01-27 10:30 |只看该作者
本帖最后由 yulihua49 于 2015-01-27 10:33 编辑
Patagonia 发表于 2015-01-23 08:58
  


我也show一个,看谁还能弄得更短:
  1. //bt为二叉树根结点的指针,返回值为bt的节点数
  2. // context为应用提供的上下文数据,由counter使用,用于判断是否符合计数条件。
  3. //counter由应用提供,判断是否符合计数条件(1),不符合返回0.
  4. int BB_Tree_Count(T_Tree *  bt,void *context, int (*counter)(T_Tree *bt,void *context))
  5. {
  6.         return !bt?0:(BB_Tree_Count(bt->Left,context,counter) +
  7.                 ((counter)?counter(bt,context):1) +
  8.                 BB_Tree_Count(bt->Right,context,counter));
  9. }
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2015-01-27 12:43 |只看该作者
回复 1# Patagonia


    真心不觉得第二个版本更好,太长了;而第一个版本也没有故意缩减到晦涩的程度。

感觉第一个版本是个研究过函数式编程的人写的,不熟悉这种风格的人觉得这种风格的代码很难理解,其实熟悉了之后反而会发现这种写法更简洁、清晰。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
4 [报告]
发表于 2015-01-27 13:39 |只看该作者
震霆不暇掩聪

论坛徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之辽宁
日期:2016-12-15 10:24:1715-16赛季CBA联赛之佛山
日期:2016-11-30 09:04:2015-16赛季CBA联赛之江苏
日期:2016-04-29 15:56:1215-16赛季CBA联赛之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之山东
日期:2016-02-16 11:37:52每日论坛发贴之星
日期:2016-02-07 06:20:00程序设计版块每日发帖之星
日期:2016-02-07 06:20:0015-16赛季CBA联赛之新疆
日期:2018-01-09 16:25:37
5 [报告]
发表于 2015-01-28 14:57 |只看该作者
MMMIX 发表于 2015-01-27 12:43
回复 1# Patagonia


支持,楼主的论点是对的,但是引用的论据不合理,哈哈

论坛徽章:
0
6 [报告]
发表于 2015-01-28 17:29 |只看该作者
第一个,Python3 会报错....

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
7 [报告]
发表于 2015-01-28 17:53 |只看该作者
写给自己和写给别人的代码竟然可以差这么多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP