作为一个写业务逻辑的boy,我需要专注的就是把业务逻辑写好。写业务逻辑并不复杂,就是把编程最基础的东西使用好,有变量循环流程控制函数数据库等。

但是写出的逻辑要通俗易懂、易于理解,避免炫技、晦涩。在目前团队中待了一段时间了,根据 code review 和自己的理解整理出一些基本原则。

业务代码思想原则

第一:代码要足够容易阅读。

代码是给程序员阅读的,首先要做到的就是逻辑清晰,易于阅读。所以要避免毫无意义的变量名、嵌套过多的逻辑判断、过于复杂的流程控制。在易读性和性能两者之间,首先要保证易读性,当然两者并不冲突。

第二:代码性能要有保证

python代码的执行速度比不上编译性语言,所以要在代码层面上保证性能的可靠。通常解决一个主要降低性能的点,就能提升整体的性能。

业务代码编码原则

变量

核心思想:清晰表示变量的功能

原则

  1. 变量命名统一,python推荐使用下划线分隔命名法,即蛇形命名法,毕竟python就是蛇嘛。真实原因:Python 为什么要推荐蛇形命名法
  2. 变量命名中可以带数据类型,如 buy_user_listid_to_name_dict 。python的灵活性高,为了更加方便区分变量、函数、方法等,变量名加数据类型是个好方法
  3. 超过三个的常量都要用枚举值。善用枚举值,让枚举值的名字解释常量,这是遵守第一条原则,容易阅读
  4. 多使用局部变量少使用全局变量,命名空间中局部变量优先搜索

流程控制

核心思想:减少if else嵌套,逻辑越清晰越好

原则

减少if else

  1. 可以使用字典的key value特性,直接用key命中条件,避免if判断。
  2. 使用装饰器装饰函数,装饰器实现里用字典特性做if else判断。可参考:如何简化大量的 if…elif…else 代码?
  3. 用in操作替换if else判断。
  4. 使用any 或 all 将多个判断一起处理,减少if else的分支

无法减少if else时要让逻辑清晰

  1. 存在复杂的判断条件时,可以先将判断条件处理一遍。如一个判断(a and b) or (c and d)操作时,先单独判断出 a and b 和 c and d,然后再判断两者结果
  2. 减少if else之间的处理流程。if或else中处理的流程过长时要尽量简化流程处理,抽象出函数。让if else对齐,处理的逻辑看起来清晰。
  3. if条件的短路特性。if a or b 这种判断中,如果a是True就不会判断b,所以将True条件写在前面可以节省判断时间

简单小例子:使用 all 减少 if else


have_opencourse = True if plan_id in [1,2] else False user_info = bayuser.get_user_info(user_id)
register_time = pendulum.parse(user_info.created_at)
register_at_today = True if register_time.date() == get_local_today() else False checkin_days = uc.get_user_checkin_days(user_id)
checkin_zero_day = True if checkin_days == 0 else False ab_test_id = 414
ab_test_name = words_utils.get_user_plan(user_id, ab_test_id).user_plan
no_provide = True if ab_test_name == "no_provide" else False # 使用if else判断
if register_time.date() == get_local_today() and checkin_days == 0 and ab_test_name == "no_provide" and plan_id in [1,2]:
return encoder.json_response(code=200) # 使用all判断
if all([have_opencourse, register_at_today, checkin_zero_day, no_provide]):
return encoder.json_response(code=200)

循环

核心思想:减少for循环

原则

  1. 用for循环代替while循环,for循环比while循环快
  2. 使用隐式for循环代替显式for循环。如sum,map,filter,reduce等都是隐式for循环
  3. 尽量不要打断循环。打断循环的放在外面。有判断条件的语句和与循环不相关的操作语句尽量放在for外面
  4. 应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数
  5. for循环和集合都可以处理的选择集合解决,集合的效率远高于循环

简单小例子:集合替代for循环

# for循环
for user in pay_user_cet4_set:
if user not in all_presale_user_set:
cet4_push.append(user) # 集合操作
cet4_push = pay_user_cet4_set - all_presale_user_set

函数

核心思想:功能单一,短小精悍

原则

  1. 函数设计要尽量短小,嵌套层次不宜过深
  2. 一个函数只做一件事,尽量保证函数语句粒度的一致性。
  3. 函数申明应该做到合理,简单,易于使用。函数名合理,参数不宜过多。
  4. 函数参数设计应该考虑向下兼容。通过添加默认参数来实现。

小结

之前分享过一本如何优雅写python的书,可以看之前写的一篇文章:

改善python程序的91个建议

在每一个开发团队都有会团队的代码风格。优秀的代码风格让团队中庞大的代码井井有条,处处有规律可循,就像是一个人完成的。每一个人也要有自己的代码原则,缺少基本原则的指导会让代码看起来不和谐,前后矛盾,这样肯定是不利于个人成长的。

本文提到的原则并见得全部正确,只是我个人在实际工作中的真实总结,绝不是闭门造车,仅供参考,欢迎交流。后续总结的原则也会继续更新到这里。

Python写业务逻辑的几个编码原则的更多相关文章

  1. 专人写接口+模型,专人写业务逻辑---interface_model -- business logical

    专人写接口+模型,专人写业务逻辑---interface_model -- business logical 0-控制台脚本重构为“面向接口编程”:1-仓库类通过__constru方法,来实现一处实例 ...

  2. RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例

    之前写过一系列RxJava的文章,也承诺过会尽快有RxJava2的介绍.无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨.所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家 ...

  3. 如何加速golang写业务的开发速度

    如何加速golang写业务的开发速度 不要忌讳panic golang写业务代码经常会被吐槽,写业务太慢了,其中最大的吐槽点就是,处理各种error太麻烦了.一个项目中,会有30%或者更多的是在处理e ...

  4. python写爬虫时的编码问题解决方案

    在使用Python写爬虫的时候,常常会遇到各种令人抓狂的编码错误问题.下面给出一些简单的解决编码错误问题的思路,希望对大家有所帮助. 首先,打开你要爬取的网站,右击查看源码,查看它指定的编码是什么,如 ...

  5. Netty耗时的业务逻辑应该写在哪儿,有什么注意事项?

    更多技术分享可关注我 前言 Netty以高性能著称,但是在实际使用中,不可避免会遇到耗时的业务逻辑,那么这些耗时操作应该写在哪儿呢,有什么注意的坑吗?本篇文章将一一总结. Netty线程调度模型回顾 ...

  6. JeeSite 4.0 简化业务逻辑层开发

    2019独角兽企业重金招聘Python工程师标准>>> 引言 对于业务逻辑层的开发重复代码很多,尽管有代码生成器,但从代码量总的来说还是比较多,所以就有了以下抽象类及工具,对一些常用 ...

  7. 分享一个UI与业务逻辑分层的框架(三)

    序言 前两篇讲解了UIMediator框架的使用及具体原理代码.本篇讲述MediatorManager的实现代码及展望. MediatorManager MediatorManager的作用有两点: ...

  8. .Net高级进阶,在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码?

    本文将通过场景例子演示,来通俗易懂的讲解在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码. 通过一系列优化最终达到两个效果,1.通过代码块来控制事务(分布式事务),2.通过委托优化Tran ...

  9. Odoo 12 开发手册指南(八)—— 业务逻辑 – 业务流程的支持

    在前面的文章中,我们学习了模型层.如何创建应用数据结构以及如何使用 ORM API 来存储查看数据.本文中我们将利用前面所学的模型和记录集知识实现应用中常用的业务逻辑模式. 本文的主要内容有: 以文件 ...

随机推荐

  1. [loj3247]Non-Decreasing Subsequences

    分治,考虑分治到[l,r]的区间(设$mid=(l+r)/2$),将询问分为两类:1.在左/右区间,直接递归下去:2.跨越中间,那么处理出两个数组:L[i][j]表示左区间在开头第i个位置,以数字j为 ...

  2. python网络自动化运维paramiko实验

    运行环境: 物理机:win10 1903 网络设备:EVE-NG模拟器上运行思科三层路由器 网络设备OS版本:cisco ios(versions 15.6) python环境:pycharm 3.5 ...

  3. java 适配器模式实现代码

    目录 1.适配器模式 1.1.类适配器 1.2.对象适配器 2.适配器模式实例 1.适配器模式 适配器模式可以分为类适配器和对象适配器. 1.1.类适配器 //目标接口 interface Targe ...

  4. Codeforces 1326F2 - Wise Men (Hard Version)(FWT+整数划分)

    Codeforces 题目传送门 & 洛谷题目传送门 qwq 这题大约是二十来天前 AC 的罢,为何拖到此时才完成这篇题解,由此可见我是个名副其实的大鸽子( 这是我上 M 的那场我没切掉的 F ...

  5. [USACO17FEB]Why Did the Cow Cross the Road III P

    [USACO17FEB]Why Did the Cow Cross the Road III P 考虑我们对每种颜色记录这样一个信息 \((x,y,z)\),即左边出现的位置,右边出现的位置,该颜色. ...

  6. 【Pathview web】通路映射可视化

    前言 pathview是一个通路可视化友好的R包,最主要的是它支持多组学数据映射(基因/蛋白-代谢).自己用过它的R包,后来发现有网页版的,果断介绍给学员.因为不常用,记录要点,以后温习备用. 目前w ...

  7. Markdown—.md文件是什么?怎么打开?

    md全称markdown,markdown也是一种标记语言. md文件其实可以用常用的文本编辑器都可以打开.   用记事本打开,把markdown文件拖到记事本图标上就可以打开 .   用 subli ...

  8. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享二:问题1

    框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 添加时,如果失败,不能正确跳转 c ...

  9. python APScheduler模块

    简介 一般来说Celery是python可以执行定时任务, 但是不支持动态添加定时任务 (Django有插件可以动态添加), 而且对于不需要Celery的项目, 就会让项目变得过重. APSchedu ...

  10. 容器之分类与各种测试(三)——stack

    stack是栈,其实现也是使用了双端队列(只要不用双端队列的一端,仅用单端数据进出即完成单端队列的功能),由于queue和stack的实现均是使用deque,没有自己的数据结构和算法,所以这俩也被称为 ...