我的第一个python web开发框架(24)——系统重构与ORM
小白弄完代码版本管理和接口文档后,兴奋的找到老菜。
小白:老大,我已经按你讲的要求,将代码版本管理和接口文档都搞好了。从项目开始到现在,除了代码编写,感觉学会好多东西啊。
老菜:嗯嗯,实战确实需要掌握很多代码以外的东西。如果你只是想安静的做一位码农,别人安排什么你就做什么,其他事情别人搞定,那你只会写代码并没有什么问题。但是,如果你不安于现状,想要做的更好,熟悉开发整流程,从需求、产品、原型、文档、架构、数据库、编码、测试、服务器部署、调优......都有所了解,遇到问题都能信手拈来,那你就得多学学各种工具的应用与配置,去练手使用了。
小白:是啊,这个项目开发过程中就遇到了太多的坑了,很多很简单的事情,由于没有经验花了大量的时间就是搞不定,好在有你帮忙指导,不然也不知能否交付了。为什么你能一眼就看出问题在哪里呢?
老菜:嘿嘿...因为这些坑多数我们这些工作多年的几乎都遇到过,碰多了自然就懂了。在遇到问题时,最好不要马上去问人,先自行研究解决,养成自行解决问题的能力,以后再遇到其他问题时就能轻松解决了。如果不是,下次遇到同样问题或类似问题,有可能还是解决不了,还得去请教别人,这样一方面你自己不会有多大的长进,另一方面别人的时间也是时间,别人也不欠你什么一定要为你解答是吧。所以说经历很重要,你对很多技术都不熟悉,需要去踩坑,去研究,找出你自己的答案与解决办法。
小白:好的,我会继续努力的。现在系统要重写,还需要注意些什么?要怎么做呢?能否详情的讲解一下。
老菜:系统重构,对于新系统、旧系统,或者开发过程中,都是家常便饭,经常要做的事情。
代码重构主要是为了提高代码的重用性,改善软件的质量,提升软件的性能,使软件架构或框架的设计更加合理,进而提高软件的可读性、可扩展性和可维护性。相关书籍都有很多介绍了,比如《重构:改善既有的代码的设计》、《大话重构》等,这里就不深入说明,只针对本系统简单讲解一下。
正常来说,你在开发过程中发现存在重复代码时,就需要考虑将这部分代码重构了,而不是等升级版本或重大改造时才进行的,因为重复代码越多,维护起来就会越复杂,越有可能出错。比如说你有个功能是进行字段串转整形变量的,代码一开始并没有进行封装,然后很多地方都使用int()进行转换,有一天测试时发现,用户输入带小数的数字字符串,这时程序抛出异常,需要进行改造。你花了半天时间将所有转换的地方进行了修改,做了判断处理。过了一段时间又发现,有些客户不遵守规则,直接输出无意义的字符串,又出现了异常,你又得花时间进行改造,万一有些地方没有改到遗漏了,说不定那天又会蹦出一个异常来。如果你在开发过程中,有及时进行重构,将这个重复代码封装成一个转换函数,那么你只需要修改这个转换函数就可以了。
除了重复代码需要进行封装外,对于一些类似的功能也需要重新进行改造,比如说小白你这个项目,对数据库操作这一块就可以看到好多差不多的代码,很多数据查询差别只是数据表不同或查询条件不同而已,这就需要进行重构,抽象出来写成ORM。
当然除了这些之外,针对功能需求的变更,对高并发、高可用、安全性、大数据、海量存储等不同的非功能需求时,有可能还需要对整个框架、架构进行重新设计,以适应新需求的需要。
在重构时必须遵循面向对象的七大原则,学好设计模式。具体可以多看看书,多研究别人写的源码,多学习多思考就明白了。
小白:这个知识量有点大,听着有点晕...重复代码重构这个我明白了,工具包里的那些工具函数大多都是重构出来的吧。刚刚讲到数据库操作要重构,能讲讲什么是ORM吗?要怎么处理?
老菜:ORM(英文全称:Object Relational Mapping)简称对象关系映射,直白点说就是将对象(可以是dict、list、元组等各种对象)通过转换,生成对应的sql语句,从而实现对数据库的增、删、改、查等操作。也就是说,原来我们对数据库操作时,需要写sql语句的,我们会发现经常会出现重复的代码维护起来不方便,现在只需要将要操作的字段或内容,存储(赋值)到相关对象中(dict、list、元组),然后这些值扔给ORM类中,ORM类会对赋的值进行对应分析进处理,最终生成可执行的sql语句。
ORM的优缺网上已经有各种描述了,你可以去查查。这里我想说的是,它对于我们开发人员来说最大的优点是可以极大的提升我们的开发效率,减少bug的发生,让代码更容易维护。相对于所谓的性能损耗,在当今的高性能硬件下,可以直接忽略不计。对于一个项目或公司的生命期与成本来说,人力成本、时间成本与机会成本才是最重要的。
python的ORM有很多成熟的包可以直接安装调用,不过我建议自己开发会好一点,一方面写一个简单的ORM非常简单,另一方面,自己开发的ORM要升级、开发、维护也会更加的得心应手,想怎么改就怎么改。你可以当它是sql的翻译模块就可以了,我们只需要处理好重复的、简单的语句翻译,对于复杂的就不需要使用ORM,直接写sql执行,这样既灵活,又方便可控。
接下几个章节会详细介绍一个ORM是如何从0到1的。
版权声明:本文原创发表于 博客园,作者为 AllEmpty 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
python开发QQ群:669058475(本群已满)、733466321(可以加2群) 作者博客:http://www.cnblogs.com/EmptyFS/
我的第一个python web开发框架(24)——系统重构与ORM的更多相关文章
- 我的第一个python web开发框架(26)——定制ORM(二)
弄完底层数据库操作模块后,接下来要做的是ORM的正式设计.在开始之前,我们需要思考一下怎么来设计一个ORM呢?这个类它能帮助我们处理什么样的问题?需要有哪些功能模块?怎么做到针对不同的数据库与表单进行 ...
- 我的第一个python web开发框架(27)——定制ORM(三)
在上一章中,我们已经创建好ORM的基类了,接下来要做的就是将基类的常用方法一一实现. 首先我们来看看之前项目中,最常见的获取指定主键的记录实体 @get('/api/product/<id:in ...
- 我的第一个python web开发框架(28)——定制ORM(四)
在数据库操作时,新增记录也是必不可少的,接下来我们应用字典的特性来组合sql语句 先上产品新增接口代码 @post('/api/product/') def callback(): "&qu ...
- 我的第一个python web开发框架(25)——定制ORM(一)
在开始编写ORM模块之前,我们需要先对db_helper进行重构,因为ORM最终生成的sql是需要转给db_helper来执行的,所以拥有一个功能完善.健壮的数据库操作类是非常必要的. 这是项目原db ...
- 我的第一个python web开发框架(29)——定制ORM(五)
接下来我们要封装的是修改记录模块. 先上产品信息编辑接口代码 @put('/api/product/<id:int>/') def callback(id): ""&q ...
- 我的第一个python web开发框架(31)——定制ORM(七)
几个复杂的ORM方式都已介绍完了,剩下一些常用的删除.获取记录数量.统计合计数.获取最大值.获取最小值等方法我就不一一详细介绍了,直接给出代码大家自行查看. #!/usr/bin/env python ...
- 我的第一个python web开发框架(32)——定制ORM(八)
写到这里,基本的ORM功能就完成了,不知大家有没有发现,这个ORM每个方法都是在with中执行的,也就是说每个方法都是一个完整的事务,当它执行完成以后也会将事务提交,那么如果我们想要进行一个复杂的事务 ...
- 我的第一个python web开发框架(30)——定制ORM(六)
在开发中,查询操作是使用最多的,而查询列表是其中之一,查询列表可分为分页查询和不分页查询(它们之间多了一次总记录数查询),还可以分为单表查询和多表关联查询,返回的结构体根据前端使用的表单框架不同而有所 ...
- 我的第一个python web开发框架(41)——总结
我的第一个python web开发框架系列博文从17年6.7月份开始写(存了近十章稿留到9月份才开始发布),到今天结束,一年多时间,想想真不容易啊. 整个过程断断续续,中间有段时间由于工作繁忙停了好长 ...
- 我的第一个python web开发框架(14)——后台管理系统登录功能
接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...
随机推荐
- Javascript基本类型回顾
本文是学习和总结ECMAScript5.1规范形成的.是对规范中所提及的Javascript类型进行剖析后的个人观点的表达(如有Bug望各位道友指正).主要是各类型的实例方法,不包含任务构造函数的方法 ...
- Solr 11 - Solr集群模式的部署(基于Solr 4.10.4搭建SolrCloud)
目录 1 SolrCloud结构说明 2 环境的安装 2.1 环境说明 2.2 部署并启动ZooKeeper集群 2.3 部署Solr单机服务 2.4 添加Solr的索引库 3 部署Solr集群服务( ...
- 剖析HBase负载均衡和性能指标
1.概述 在分布式系统中,负载均衡是一个非常重要的功能,在HBase中通过Region的数量来实现负载均衡,HBase中可以通过hbase.master.loadbalancer.class来实现自定 ...
- Nacos 发布 v0.8.0 Pre-GA版本,安全稳定上生产?
服务注册和服务配置开源项目 Nacos 本周发布了 v0.8.0 Pre-GA 版本,作为开源项目生命周期中的里程碑版本之一,v0.8.0 Pre-GA版本支持登录.命名空间.Metrics监控(对接 ...
- RSA签名的PSS模式
本文由云+社区发表 作者:mariolu 一.什么是PSS模式? 1.1.两种签名方式之一RSA-PSS PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充 ...
- 如何解决svn清理失败 不能更新 cleanup失败 cleanup乱码 更新乱码 svn更新提示清理 清理乱码不能清理 svn故障修复SVN cleanup 陷入死循环 svn cleanup时遇到错误怎么办
平时使用svn的过程中,有的时候由于自己操作故障或者系统原因,导致svn不能更新,提示cleanup也不能成功,陷入了死循环 原因是;svn的数据库队列原因 1,下载sqlite3.exe,googl ...
- JavaScript 脚本运行方式
引用外部脚本文件 <script src="/path/to/example.js"></script> 页面内联式 <script> aler ...
- 如何使用Dubbo 2.7.0和Spring boot实现FAT测试(Feature Acceptance Test)
在一个调用链非常长的功能中,如果想修改其中的一个特性,并进行测试,而又不影响该环境的其他用户使用现有功能.特性,例如: 1. A.B.C.D之间通过Dubbo实现远程调用 2. 这些模块可能有一个或者 ...
- ueditor笔记
一.ueditor是什么 UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 二.ue ...
- 20190325-HTML框架、audio标签、vedio标签、source标签、HTML表单
目录 1.HTML框架 frameset:框架标记 frame:框架内文件 iframe:内嵌框架 2.audio标签 src:URL(可以用source标签替代) autoplay:自动播放 pre ...