猪懂傻改之《powershell 代码规范》
猪懂傻改之《powershell 代码规范》
猪懂傻改之《powershell 代码规范》
脚本程序员或许都经历过这样的场景:
接手别人的代码时,因为没有注释,变量名五花八门,模块之间逻辑关系如麻,
弄得满头雾水,一脸茫然,痛定思痛之后不得不推倒重来,这些都是不注重编程规范造成的,事倍功半。
此前有这么一个段子,程序员A和B,
A每天只写100行代码,字里行间规范清晰,其余大部分时间都在整理文档,备注的非常详细,
B每天写50000行代码,却很少写注释,天马行空,为此还嘲笑A不够高效。
随着业务越来越复杂,客户需求随时可变,两个人都开始组建团队,这个时候,功夫不负苦心人,A之前的努力都派上了用场,B只能佩服加惭愧。
powershell 传教士 原创文章。始于 2015-11-08 允许转载,但必须保留名字和出处,否则追究法律责任
—【原则】—
powershell属于脚本范畴。脚本是由运维人员,用户,技术员编写的小程序。
这些个人,不是专业开发人员,没有系统学习过开发,只能说是散兵游勇小程序员。
一个运维/用户级别的写代码者,他的逻辑思维,他对语言、架构都熟悉度,都不如专业码农的。
而脚本小程序员的代码规范,是比c,c++,java宽松多的。
爱powershell,就写让别人能读懂的代码,爱powershell,就写【猪懂傻改】代码!
最求直观,容易理解,而不追求短小。
大数据追求节省空间(即不浪费内存),
cpu密集型追求快(即节省cpu),
行列整齐数据尽量用excel表,sqlite,access,mysql,sql server这些数据库存。
—【经验】—
尽量只做搬运工。
2.1写脚本或函数前,先搜。或者估计是否有前人写好了。
2.2写数据结构前,先搜对象。基本上我们需要的所有的数据结构,已经有人写好了,并封装成类和对象了,而且其代码已历经多年的测试和再测试。
菜鸟问:如何写脚本?
老鸟答:
1 必须搞清楚问题细节。这是最重要的。
2 解题思路也基本完成。
前两条不透彻,不应该开始写脚本。
3 先粗写,写个大概。
4 调试通过。
5 详细写。考虑出错情况,加上错误代码,错误信息。去掉容易出错,不容易兼容的代码。改写性能不佳的代码。
6 精雕细琢。重构,把重复使用的代码段,写成函数。重写变量名,使人能一眼看懂。格式化好代码,搞好缩进。
—【第一章 为了容易读懂,容易分享】—
1.1 脚本文件名用中文写上功能。或脚本前几行,用中文写上注释,写上功能,和程序大致逻辑。
有些人以为写很多注释就可以让代码更加可读,然而却发现事与愿违。注释不但没能让代码变得可读,反而由于大量的注释充斥在代码中间,让程序变得障眼难读。
而且代码的逻辑一旦修改,就会有很多的注释变得过时,需要更新。修改注释是相当大的负担,所以大量的注释,反而成为了妨碍改进代码的绊脚石。
—【茴香豆】又称【幺蛾子】—可以运行,但不容易理解的,n种语法变体。
本人新发明格言:【语法糖】让语言更好,【幺蛾子】【语法屎】【茴香豆】让语言更糟!
孔乙己道:“茴香豆的‘茴’字,共有4万种写法,来来来,让我给你一一道来。。。”—实际上孔乙己是为了骗指甲盖中的酒。
powershell传教士道:“滚!我没有必要浪费脑筋学4万种雷同语法,我只需要一种最简单最直接,大家都能看懂的写法。”
http://www.cnblogs.com/qcloud1001/p/6606060.html
茴香豆除了绕脑袋,费时间,害人之外没有任何好处。不利于砸场子!
茴香豆就是,你进步路上的坑!坑里还有水,水中还有雷!
要知道perl很强,但perl人最爱玩“天书代码”,perl被评为开发者最讨厌的语言之一。用perl的人越来越少。
而python代码简单,用的人越来越多。简单的py代码,你敢说不强?
崇尚解决一个小+简单问题,有一万种“茴香豆”代码写法的,perl为啥被淘汰了?
崇尚解决一个小+简单问题,只有一种最简单代码写法,的python为啥如日中天了?
从我做起,不写“茴香豆”语句,不给菜鸟埋雷!
谁要写“茴香豆”语句,你也不用研究,直接把他写的代码扔进垃圾桶!
1.5 尽量不用elseif,而要用else {if(){} }。或者单用if。
1.6 代码尽量对齐,如:
$robert_age = 32
$annalouise_age = 25
$bob_age = 250
$dorothy_age = 56
—【3英文变量名的坑】—
null,print,computername,count 这些个,是非常容易和我们自定义的变量名,重复的。
自己手机没电了,拿同事无波的安卓机调试,很简单的获取用户微信昵称,结果死活获取不到,一直显示为null。应该是跨平台问题,因为之前在自己iPhone上是没有bug的,拼命看api文档,但是都没提到这方面。急死我了。
刚刚无波告诉我他的昵称就是null。
A:“听说无波昨天被同事打死了。”
B:“哎。前天还发朋友圈呢。”
A:“是啊,年纪轻轻的,挺可惜的。”
前面夸张修辞,无波最后当然没死,腿打断了而已。
众所周知,支付宝是与银行直连,并没有用银联的通道,因此支付宝再支付中遇到问题,与银联无关。
其实,支付宝跳出的英文意思是“合并支付失败,创建合并支付订单失败……”
11月11日早晨,有中国银联人士在朋友圈贴出昨晚支付发生问题的截图,对此事表示愤怒。
有银联人士表示,“合并支付”可以用英文“jointpayment”,unionpay是“合并订单”的意思,而且支付宝弹出的英文中大小写都和银联商标一致,“哪有那么凑巧的。”
今天中午,蚂蚁金服在微博“蚂自达”(微博认证:蚂蚁金服品牌与公众沟通部总经理)上郑重道歉。
“蚂自达”在微博中解释,“合并支付”的英文是“combined payment”,出现这个问题是因为淘宝工程师不认识combined这个单词,“但不管怎么说,这个无心的错误还是给银联造成了不好的影响,我们全体同事深表歉意。
这口乌漆嘛黑的锅我们不会甩给任何人,请牢牢地扣在我们头上,提醒我们以后不要再有这么令人难堪的错误。”
—【4中文变量名,中文输出信息的好处】—
4.1 让菜鸟看懂代码,让猪能看懂代码!!!
我们知道有常量、变量。编程时用常量就叫做硬编码,即写死,固定。比如写日志,我们永远打算写在一个固定的文件中。
再比如(获取)带路径的文件名,永远要用$_.fullname,但是我们如果要是有个文件名叫fullname,很容易弄混。
再比如,我们的属性叫做name,我们的值也叫name。而用中文变量名,属性名,甚至方法名,则极大地避免了这些。
你还质疑中文进程名么?—请打开win10的任务管理器,你就会看到“系统空闲进程”这个中文进程名。
你还质疑中文计算机名么?—请把你的机子名改名为“张三”,重启后,ping 张三。
你还质疑中文用户名么?—请新建“李四”这个用户,然后登录。
请翻译:$国资委,$活雷锋,$第十八届三中全会第二次常务会议,$朱庄,$牛村,$苏家屯,$马家合子,$双泉堡
求猪能写出稍微让我能懂点的,母语变量名。
—【5为了更好地调试】—
5.1 不要重用变量名。函数内外使用同一个变量名,脚本工作起来是毫无问题的。但为了好理解和调试,绝不在整个powershell.exe进程内使用相同的变量名。即$global:变量作用域内,不重用相同变量名。
不建议这样【$var=3 function aaaa {$var=4}】,但不排斥这样【$global:var=3 function aaaa {$global:var + 2}】
脚本名叫ping,函数名也叫ping的这种坏习惯是很常有的,还有个外部命令ping,所以我们要注意避免。
通俗来讲这玩意是有层次的:
神仙>皇帝>大臣>你>你下属。即神仙叫《大禹》皇帝就不能叫;皇帝叫《秦始皇》你就不能叫;你名叫《狗剩》你儿子就不能叫;都叫狗剩不乱了?
脚本的层次是:
外部命令>ps内置模块名,命令名,函数名,变量名,属性名>你编写的脚本的,脚本名,函数名,变量名,属性名>2层函数名,变量名等。
一行代码中,尽量不要用2个或更多管道。
—【5为了防止出错】—
1 在关键变量后,放置【防止出错防御代码】,如:
if ($某关键变量 -eq $null) #或大于某个值
{
write-error ‘出错信息’
exit 一个数字
}
这段代码或许永远不能运行到,但可以防止程序出现逻辑错误,而导致的混乱。
编写字符串输入输出函数时,读写文本函数时,
一次必须传2个参数,不可分割。【raw字符串值】和【此字符串,文档的编码类型】
—【第六章 为了更好地性能】—
管道符“|”是好东西。powershell的管道,是世界上唯一的支持面向对象的管道,但用了性能很差。所以:
6.1 能不用一定不要用管道,尽量用【命令 -inputobject xxx】
6.1.1 命令帮助上说sort-object -inputobject $xxx是不行的,你只能用$xxx | sort-object,但为了性能,你就是不应该用。
要用就用[system.array]::sort($xxx)
6.3.1 用数组或哈希表时,尽量用用foreach ($a in $b) { },而不用xxx|foreach-object { }。非要用管道,最好500以内。
6.3.2 循环内时间很短,不要在循环内获取随机数。用[System.Random]::netx()除外。
6.3.3 听说过大长今,大长庄,大长脸,大长循环么?不要搞大长循环,大长的循环就做成函数。
6.4减少返回对象个数,只需要99个对象,绝不返回100个。
同理,如果在意性能,就用select-object筛选需要的属性,除掉不需要的属性。
6.5 多线程,多进程。
必须考虑脚本中进程切换,线程切换的耗时。尽量给线程(进程)一次性传入多任务,而不是每次一个任务,来减少切换时间。
这跟送快递一样,线程(进程)就是快递员。
一次只送一件货,然后告诉经理结果。结果虽然能及时返回,但必然空跑。
必然比,一次送一百件货,然后返回一百个结果,要消耗更多【空跑时间】。这个【空跑时间】就是线程(进程)切换耗时。
假设你有一万个任务,有一个8核心服务器,但你只想用7核心。
如果你想尽量减少线程(进程)切换耗费的时间。那么你应该建立7个线程,每个线程分配给(1万/7)个任务。
但是呢,假如你想【立马得到单个任务的结果】,就要【每个线程只给一个任务,任务结束后立马返回结果】。
那么问题来了,你到底是想要鱼呢?还是熊掌?你到底是想让任务尽快跑完?还是实时返回单个任务的结果?
假设每个任务消耗cpu时间很短,但任务数量很多,每次一个任务这种方式,【 空跑时间 / 总任务耗时 】占比将很大。
—【第七章 为了标准化,兼容性】—
7.1 只用return打断函数,只用exit打断脚本。虽然可以用break和return打断函数,但尽量不要用break打断函数,而只用return。其他也如此。
避免写太长的函数。如果发现函数太大了,就应该把它拆分成几个更小的。
尽量少用wmi,.net方法。除非标准ps命令,没有提供你要的功能,没有提供你要的性能。
—【参考资料】—
部分参考了 王垠 代码规范中的观点,在此表示感谢。
其他欢迎各位给与补充。
—【后记】—
【编程语言中】,比较小的不好的特性叫什么?
答:苍蝇,幺蛾子,坑。
答:癌症!
茴香豆是什么?
答:
孔乙己道:“茴香豆的‘茴’字,共有4万种写法,来来来,让我给你一一道来。。。”
孔乙己道:“去你家楼下小卖部的路,有8万种方法,每一种方法都绕10万8千里。”
答:n多癌症,n多苍蝇。语法屎。
多加语法糖,多库,多框架。少加幺蛾子,不要茴香豆!不要坑!不要语法屎!绝不要癌症!不要不可控的未知数”
坑多了,代码运行中,蹦~叭~,乱跳错误,总给用户造成损失,那谁还敢用你的代码呀?
编程的人应该严谨,你选择的编程语言也必须是严谨,少幺蛾子的,否则请看:
http://news.cnblogs.com/n/541717/
日本鬼子证劵公司因bug损失27亿人民币!官司打了10年!
posted on 2018-12-19 15:13 PowerShell免费软件 阅读(…) 评论(…) 编辑 收藏