Python:编程“八荣八耻”

以动手实践为荣,以只看不练为耻。

以打印日志为荣,以单步跟踪为耻。

以空白分隔为荣,以制表分隔为耻。

以单元测试为荣,以手工测试为耻。

以代码重用为荣,以复制粘贴为耻。

以多态应用为荣,以分支判断为耻。

以Pythonic为荣,以冗余拖沓为耻。

以总结思考为荣,以不求甚解为耻。

刚刚看到,不可尽信,也不可全部不信。理性看待。

1. "以动手实践为荣,
以只看不练为耻" 

俺写一个程序时间通常是这么分配的。 
70%
的时间用来寻找和阅读现有代码, 如果找到了, 就不用自己写了。如果不够用或者不满意, 就把已有的实现看完, 稍加改进。或者在重构中抄进去,
天下程序一大抄嘛。 
20% 的时间构思, 剩下 10%
的时间用来写代码。 

这样我轻松违反了第一条, 我显然是, "以学习模仿为荣,
以埋头蛮干为耻"。 
寻找源码, 追随源码, 模仿源码, 洞察源码, 成为别人的范例源码 ──── 这是我们的信条
(见《Plone Cookbook》)。 

2. "以打印日志为荣,
以单步跟踪为耻" 

如果不是数据恢复需要,
俺从来不打印日志。俺从来都是程序能跑起来就已经谢天谢地了。 
我尽量把程序写成只要可能有问题就跑不起来或者马上挂掉的样子。比如我不处理异常
──── 如果那真的是异常的话; 而且很少初始化变量 (比如写 __init__ 函数) ──── 如果不是马上就要用到的话。在应该是
AttributeError 的地方顺利通过的只可能是逻辑错误, 而不是对象完整性。没有就是没有, 除 XXX 以外既没有接口也没有
NotImplementedError。如果一个程序已经跑起来了才发现有问题,
那么日志对调试通常也不会有用处。 
用户如果真需要日志, 请自己在顶层 traceback 所有异常写到日志,
或者重定向标准出错好了。 

这违反了第二条, 我是 "以立即挂掉为荣, 以需要调试为耻"
(下面还有一条关于测试的, 请参见本条)。

3. "以空格缩进为荣,
以制表缩进为耻" 

没什么好说的, 制表缩进写了太多年, 已经习惯了。很遗憾空格缩进确实成为了标准,
这得归功于大把大把的 Windows IDE 初学者根本不知道自己其实是在用空格还是制表进行缩进, 并且写出成堆的只在该 IDE 下才能对齐的代码,
为此我们才不得不统一到空格缩进。要是统一成制表缩进, 那些家伙就根本无法对齐代码了。 
────
要做到对齐其实很容易, 你只要在需要代码缩进时用制表, 在需要对齐时用空格, 简单地说就是行头用制表,
后面用空格。 

这条我也常常违反, 不过还是强烈推荐使用空格缩进, 毕竟这是标准 ────
为了向下兼容和维护世界和平。 
我是 "以 K&R 对齐为荣, 以 IDE
对歪为耻"。 

4. "以模块复用为荣 ,
以复制粘贴为耻" 

"自从读了《重构》以后, 大家对重复代码都异常敏感起来; 重复代码的坏处太明显了,
为避免重复代码, 大家可谓绞尽脑汁; 最终基本形成这么一个事实: 只要没有重复代码 (当然还包括内存泄露), 这段代码就算高质量的代码,
就是可以被大家接受和敬仰的代码, 而代码的结构, 代码的可读性基本都被抛在脑后。 
"《UNIX 编程艺术》教会我
‘简单是美‘, 在写程序的过程中, 我都竭力让代码看起来尽可能简单一些, 程序的逻辑尽可能符合习惯并且清晰易懂。这一点和重构所宣称的思想并不冲突,
但重构实在太面向对象了, 过于教条, 甚至太死板了; 如果一切都按其所宣称的方法来消除重复,
那将是程序员的恶梦。 
"其实我最关心的是, 和代码的整体结构相比, 消除重复代码的重要程度到底有多高?
如果为了消除重复代码而修改代码的结构, 使代码的结构变的比较复杂, 比较诡异, 比较难以理解, 难以维护,
这样做值得吗? 
"个人觉得是, 重复代码可能是要消除的, 但不应该以代码结构复杂化、诡异化为代价;
如果重复一段代码可以使我程序的逻辑结构更清晰, 更易读, 更容易维护, 我宁愿重复。" ────
魏中华(《为了消除重复代码》) 

库是可复用的, 进程间通信和代码复制是零耦合的,
一切都很美好。而模块是从真空中产生的厚胶合层, 模块诞生的第一天, 是光鲜的, 是看起来可以重用一百年的。但不幸的是从第二天开始, 为了重用,
模块就一直被推翻、重写、取消和重建。程序结构越来越复杂和读不懂,
而且压根不会有第二个程序来重用该模块。这太讽刺了。 

所以我是代码复制的粉丝, 大段大段的复制粘贴随处可见,
甚至专门编写程序来进行复制粘贴。我是 "以复制粘贴为荣, 以模块复用为耻"。 

5. "以多态应用为荣 ,
以分支判断为耻" 

面向对象挺过时的, 在 Python 中时新
"ducktyping"。 

所以我们, "以 ducktyping 为荣,
以面向对象为耻"。 

基本上, 8荣铁律俺大部分都违反了。好了, 今天就说到这里吧,
我要回火星去了。

Python:编程“八荣八耻”,布布扣,bubuko.com

时间: 2025-01-06 20:41:51

Python:编程“八荣八耻”的相关文章

Python "八荣八耻"

#以动手实践为荣,以只看不练为耻. #以打印日志为荣,以单步跟踪为耻. #以空白分隔为荣,以制表分隔为耻. #以单元测试为荣,以手工测试为耻. #以代码重用为荣,以复制粘贴为耻. #以多态应用为荣,以分支判断为耻. # 以Pythonic为荣,以冗余拖沓为耻. #以总结思考为荣,以不求甚解为耻.

码农八荣八耻

以动手实践为荣,以只看不练为耻: 以打印日志为荣,以单步跟踪为耻: 以空格缩进为荣,以制表缩进为耻: 以单元测试为荣,以人工测试为耻: 以模块复用为荣,以复制粘贴为耻: 以多态应用为荣,以分支判断为耻: 以干净利索为荣,以冗余拖沓为耻: 以总结分项为荣,以跪求其解为耻.

程序员八荣八耻

以动手实践为荣 , 以只看不练为耻: 以打印日志为荣 , 以单步跟踪为耻; 以空格缩进为荣 , 以制表缩进为耻; 以单元测试为荣 , 以人工测试为耻; 以模块复用为荣 , 以复制粘贴为耻; 以多态应用为荣 , 以分支判断为耻; 以Pythonic为荣 , 以冗余拖沓为耻; 以总结分享为荣 , 以跪求其解为耻;

DevOps"八荣八耻"

以可配置为荣,以硬编码为耻 以互备为荣,以单点为耻 以随时重启为荣,以不能迁移为耻 以整体交付为荣,以部分交付为耻 以无状态为荣,以有状态为耻 以标准化为荣,以特殊化为耻 以自动化工具为荣,以手动和人肉为耻 以无人值守为荣,以人工介入为耻

Python学习系列(八)( 面向对象基础)

 Python学习系列(八)( 面向对象基础) Python学习系列(七)( 数据库编程) 一,面向对象 1,域:属于一个对象或类的变量.有两种类型,即实例变量—属于每个实例/类的对象:类变量—属于类本身. 2,类的方法:对象也可以使用属于类的函数来具有功能,这样的函数称之为类的方法.域和方法合称为类的属性.类使用class关键字创建,类的属性被列在一个缩进块中. 3,self:类的方法与普通的函数只有一个特别的区别----他们必须有一个额外的第一个参数名称,但是在调用的时候不能为其赋值,Pyt

C#编程总结(八)数字签名

C#编程总结(八)数字签名 在日常工作中,有很多文件需要领导审阅.签名和盖章,由于公司业务开展,跨地域.跨国业务也日益普遍,领导签名盖章变得很麻烦,开始的时候人们通过邮寄.传真等方式来解决,但是耗费时间.人力.物力.在网络化日益深入的今天,需要领导审批.签字盖章的东西越来越多,时间也越来越紧迫,数字签名的出现,很好了解决了这一问题.推动了互联网及跨国集团的发展. 数字签名 1.概念 数字签名基于哈希算法和公钥加密算法,对明文报文先用哈希算法计算摘要,然后用私钥对摘要进行加密,得到的值就是原文的数

ActionScript3游戏中的图像编程(连载八)

1.2.2 初始效果及颜色属性的测试 按F11/Ctrl+F11测试,效果如图 1.2所示.如果上下两组小圆色彩上看起来有所差别,那就请您校对下,看是否在输入代码的过程中出现了笔误,同时注意检查您的显示器是否因为老化,视角等问题而导致同种颜色在不同的位置有不同的效果.因为现在的代码仅仅做了一次赋值,中途并没有对ColorTransform进行其它处理. 图 1.2 变换前的效果 下面就先从效果最明显的color开始测试. 设置一下_myColorTransform.color = 0xFFFF0

IOS编程教程(八):在你的应用程序添加启动画面

IOS编程教程(八):在你的应用程序添加启动画面 虽然你可能认为你需要编写闪屏的代码,苹果已经可以非常轻松地把它做在Xcode中.不需要任何编码.你只需要做的是设置一些配置. 什么是闪屏 对于那些新学代码的人,可能没有听说过“闪屏”把,让我先作一个简单的解释.闪屏是常见于iOS应用程序,以及其他桌面应用程序.这是你启动一个应用程序时,你看到的第一个画面.通常情况下,初始屏幕是一个覆盖整个屏幕的图像,消失后加载主屏幕.下图显示了几种闪屏: 简单闪屏(开始页面) 闪屏的主要目的是为了让用户知道你的程

编译opengl编程指南第八版示例代码通过

最近在编译opengl编程指南第八版的示例代码,如下 1 #include <iostream> 2 #include "vgl.h" 3 #include "LoadShaders.h" 4 5 using namespace std; 6 7 8 enum VAO_IDs { Triangles, NumVAOs }; 9 enum Buffer_IDs { ArrayBuffer, NumBuffers }; 10 enum Attrib_IDs