编程语言-11-编程八荣八耻及python中的荣耻观

程序员版本的八荣八耻~
Python:编程的“八荣八耻”
在这里插入图片描述

1 通用版本

1.1 以接口兼容为荣,以接口裸奔为耻

一、以接口兼容为荣,怎么理解呢
很多bug都是因为修改了对外旧接口,但是却不做兼容导致的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。新手程序员很容易犯这个错误。所以我们修改老接口的时候,一般要做好兼容

如果你的需求是在原来接口上修改,尤其这个接口是对外提供服务的话,一定要考虑接口兼容。举个例子吧,比如dubbo接口(Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成),原本是只接收A,B参数,现在你加了一个参数C,就可以考虑这样处理:

//老接口
void oldService(A,B){
  //兼容新接口,传个null代替C
  newService(A,B,null);
}

//新接口,暂时不能删掉老接口,需要做兼容。
void newService(A,B,C){
  ...
}

二、我们还要以接口裸奔为耻
为了保证接口报文的安全性,拒绝接口报文裸奔。因此,我们可以使用https协议,还建议对接口加签验签处理,数据加密等。

接口签名很简单,就是把接口请求相关信息(请求报文,包括请求时间戳、版本号、appid等),客户端私钥加签,然后服务端用公钥验签,验证通过才认为是合法的、没有被中间人篡改过的请求。

1.2 以规范日志为荣,以乱打日志为耻

我们的业务逻辑代码需要日志保驾护航。比如:你实现转账业务,转个几百万,然后转失败了,接着客户投诉,然后你还没有打印到日志,想想那种水深火热的困境下,你却毫无办法。

因此大家要打好日志,比如日志级别使用恰当,日志格式,在哪些地方打日志,参数打印哪个等等。不能乱打日志,要以规范日志为荣,乱打日志为耻。

1.3 以代码自测为荣,以过度自信为耻

修改完代码,要自测一下,这个是每个程序员必备的素养,即使你只是修改了一个变量或者一个字段。

要杜绝过度自信,尤其不要抱有这种侥幸心理:我只是改了一个变量或者我只改了一行配置的代码,不用自测了,怎么可能有问题

1.4 以参数校验为荣,以运行异常为耻

参数校验是每个程序员必备的基本素养。你的方法处理,必须先校验参数。比如入参是否允许为空,入参长度是否符合你的预期长度。因此,我们要以参数校验为荣。

比如你的数据库表字段设置为varchar(16),对方传了一个32位的字符串过来,如果你不校验参数,插入数据库直接异常了。

我们要以运行时异常为耻。

比如你没有做好一些非空校验,数组边界校验等等,导致的空指针异常、数组边界异常,尤其这些运行时异常还发生在生产环境的话,在有经验的程序员看来,这些错误行为会显得特别低级。

1.5 以设计模式为荣,以代码重复为耻

日常工作中,我们要以设计模式为荣。

比如策略模式、工厂模式、模板方法模式、观察者模式、单例模式、责任链模式等等,都是很常用的。在恰当的业务场景,我们还是把设计模式用上吧。设计模式可以让我们的代码更优雅、更具有扩展性。但是不要过度设计哈,不要硬套设计模式。

我们还要以重复代码为耻。重复代码,我相信每个程序员都讨厌的,尤其有时候你的开发工具还会给你提示出来。我们可以抽取公共方法,抽取公用变量、扩展继承类等方式去消除重复代码

1.6 以优化代码为荣,以复制粘贴为耻

日常开发中,很多程序员在实现某个功能时,如果看到老代码有类似的功能,他们很喜欢复制粘贴过来。这样很容易产生重复代码,所以我们要以复制粘贴为耻。

一般建议加自己的思考,怎么优化这部分代码,怎么抽取公用方法,用什么设计模式等等。

个人觉得,优化代码的过程,可以让自己取得更大的进步。因此我们要以优化代码为荣,以复制粘贴为耻。

1.7 以定义常量为荣,以魔法数字为耻

大家平时工作中,是不是经常看到魔法数字。魔法数字(Magic Number)是指拥有特殊意义,却又不能明确表现出这种意义的数字。

程序里面存在魔法数字,易读性很差,且非常难以维护。

if(type==1){
   System.out.println("关注公众号:捡田螺的小男孩");
}else if(type==2){
   System.out.println("关注公众号:程序员田螺");
}else{
   System.out.println("关注其他公众号");
}

代码中的1、2就表示魔法数字,我们可以用常量取代魔法数,或者定义枚举去代替魔法数字

1.8 以总结思考为荣,以混水摸鱼为耻

比如你看完田螺哥的文章,可以总结思考一下,或者做做笔记,或者放到收藏夹,茶余饭后再看看。

再比如你日常工作中,看到一段不错的代码,也可以思考一下亮点在哪里,如果是你自己来写的话,怎么写出更好的代码。反正就是要多总结,多思考,多复习,温故而知新嘛

我们要以混水摸鱼为耻。比如工作中,一些小伙伴喜欢混水摸鱼,当一天和尚敲一天钟,代码多是复制粘贴,做完需求就摸鱼。实际上这个不可取的。

我们要在工作中成长,通过认真工作,使自己会得更多,将来换工作也可以拿到更高的薪水,对吧,加油吧,小伙子,以总结思考为荣,以混水摸鱼为耻。

2 python版本

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

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

【时间是检验真理的唯一标准】对于编程这活来说,这绝对是真理中的真理,任何编程语言学习均是如此。亲自动手动手敲一下,编译、调试一把,发现错误,更正,输出打印结果,才能对语言的细节有更深入的了解。

好多东东看似简单,做起来可能更本不是那么一回事。所以,动手,必须的。并且,动手做一遍,也能加深印象和理解,只看不练一会就忘记。

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

这句话仁者见仁智者见智,对于一个成熟的软件,记录日志是最基本的。但是在开发的过程中,仅仅通过日志来分析并不是一个非常好的办法,通常单步跟踪和阶段性打印日志,能更快地找出错误的原因和需要更正的方式,尤其记得参考错误的提示,能帮助我们更快的更改。

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

PEP 8 – Style Guide for Python Code
在PEP 8中Tabs or Spaces?一栏中,介绍到:
Spaces are the preferred indentation method.
空格是首选的缩进方法。

Tabs should be used solely to remain consistent with code that is already indented with tabs.
制表符应该仅用于与已经使用制表符缩进的代码保持一致。

Python 3 disallows mixing the use of tabs and spaces for indentation.
Python 3禁止在缩进中混合使用制表符和空格。

建议:平时编码,将TAB链设置为4个空格,好多的IDE或编辑器均有此选项设置,所以这个工具可以帮助我们解决。这个问题我也经常犯错,毕竟TAB键确实比打四个空格要方便。

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

【没做过太多的代码测试,这句话引用网上大神答案】这句我觉得没有写好,这里的手工测试定义不明确,单元测试个人通常使用单步跟踪,这脱离不了手工,与之相对的就是自动化测试,我理解这里说的是不是TDD(敏捷中的测试驱动开发)。不太明白。

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

这句真理,复制粘贴很容易造成好多冗余代码,使用代码越来越不好维护。例如:

from label_detect import classify_face

上述这句就是说从label_detect.py中复用classify_face这个函数,这是支持的。

将def classify_face给copy到该.py下,就是代码复制。这样在之后需要更改classify_face的定义时候,就需要对多个地方进行修改,这种方式不可取。

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

多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。

也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class Cat(Animal): #动物的形态之一:猫
    def talk(self):
        print('say miaomiao')

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('say aoao')

在一个函数中,如果我们接收一个变量 obj,则无论该obj是Cat、Dog还是Pig,都可以执行talk的动作:

def func(obj):
    obj.talk()

c = Cat()
d = Dog()
p = Pig()

func(c)
func(d)
func(p)

运行结果:
>>> say miaomiao
>>> say wangwang
>>> say aoao

多态性的好处:
(1)增加了程序的灵活性,以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(obj)
(2)增加了程序可扩展性,通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(obj)去调用

反观分支判断语句,分一下几种:

单一if结构
if-else结构
if-elif-else结构
if嵌套结构

对应到上面的多态,就是需要根据判断animal的不同类型,print不同的talk。

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

什么是Pythonic呢,中心思想如下:简单、清晰,不要过分强调技巧,尽量使用 Python 已经提供的功能以及符合Python的思维方式。

例如:C语言中,交换两个数字a,b,需要如下操作:

t=a;
a=b;
b=t;

判断数字a是否再在(c,d)区间内,需要:

if(a>c && a<d):

而在Python中,仅仅需要这样就行:

a,b = b,a
if(c<a<d):

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

真理中的真理,不仅编程,凡事均应如此啊。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮冰燃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值