重构

敏捷开发学习笔记

半世苍凉 提交于 2021-02-17 19:39:47
需求的变化时普遍存在的,人往往不知道自己需求什么。因此,要拥抱变化。提高自己代码的可扩展性。 你只能复制平庸,永远无法复制优秀。因此,在欣赏别人代码的或者使用demo的时候,要带着欣赏和批判的眼光来进行判定。 优秀的程序员,应该让优秀成为一种习惯。思考无处不在。 持续集成的过程中:之所以你不知道你为什么会出错,调不出bug,是因为你在写的时候,也不知道这些东西为什么是对的,为什么这样写。你所做的只是为了完成任务的模仿。 设计模式只是一种设计结果,你应该从中学习到的是一种解决问题的思想,同时,在自己的项目中加以利用。 软件设计:角色,职责,协作。 用代码去描述事件,而不是用文档。因此,当你的代码足够优秀,别人读你的代码,就会知道你在做什么,怎么做了? 用简单直观的方式来处理某件事情。 要尽力去掌握别人所不能掌握的稀缺资源。例如,一种卓越优秀的编程习惯。 SOLID:原则 程序中绝对不能出现else if。 if很多时候的重构: 首先:进行关注点分离,找到不变和可变的部分。(分离) 然后:将不同的关注点进行分离,创建新的方法。(抽离共同) 抽象,封装,多态:设计模式其实是一种封装的手段,封装是进行重构的基本。抽象:定义一种规约,一种共同遵守的预定。多态:对抽象进行实现。(重构中的面向对象三要素) 好的代码是不会恐惧单元测试,单元测试只会让你代码更加自信。

重构

霸气de小男生 提交于 2021-01-04 08:43:27
最近在看<重构>这本书,看着看着就迷上了重构.所以打算专门搞一个分类记录一些关于重构的那些事 "重构"是一小步一小步慢慢前进的过程,下面列出书上所写的重构列表,在以后的日子里,我会对应列表,描述每一种重构手法,重构是需要好鼻子的,闻出坏味道,还需要一套规范有效的方式来安全的修改代码. Add Parameter (添加参数) Change Bidirectional Association to Unidirectional (将双向关联改为单向) Change Reference to Value (将引用对象改为值对象) Change Unidirectional Association to Bidirectional (将单向关联改为双向) Change Value to Reference (将值对象改为引用对象) Collapse Hierarchy (合并继承层次) Collapse Conditional Expression (合并条件语句) Consolidate Duplicate Conditional Fragments (合并重复的条件片段) Convert Procedural Design to Objects (将过程式设计转换为面向对象) Decompose Conditional (分解条件语句) Duplicate Observed Date

【NOI 2018】归程(Kruskal重构树)

不想你离开。 提交于 2020-04-02 08:52:20
题面在这里就不放了。 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信息。 离线的思路对满分做法有一定的启发性,很容易想到将并查集持久化一下就能支持在线了。 但是这个是两个$log$的,有卡常的风险也不是很方便写。 当时思考了一下就快速写完离线做法就去做其他题了。 对于这道题,有一个更好的做法:Kruskal重构树。 事实上如果你了解这个东西,那你就能很快的给出解,那仅此以这道题作为学习Kruskal重构树的例子。 先给出一个经典的模型: 给定一张无向图,每次询问两点之间所有简单路径中最大边权的最小值。 一个常规的做法就是建出最小生成树,答案就是树上路径的最大边权,正确性显然。 当然也可以用我们要讲的Kruskal重构树来解决,算法虽不同,思想类似。 Kruskal中我们连接两个联通块(子树)时直接用一条边将对应的两个点相连,但在Kruskal重构树中,我们先建一个虚点作为两个子树的树上父亲,让两个联通块分别与该点相连,注意的是要维护并查集合并时的有序性。 我们称新建的虚点为方点,代表了原图中的一条边,原图中的点为圆点,则该树有一些优雅的性质: 这是一颗二叉树,并且相当于一个堆,因为边是有顺序合并的。 最小生成树上路径的边权信息转化成了点权信息。

重构博客园Android App

有些话、适合烂在心里 提交于 2020-03-30 08:07:34
前言 第一个全功能的非官方android客户端已经过去一年了...貌似已经不再更新的样子,最近发现,在android 4.1上运行的时候,列表不能滚动了..而且,原界面设计,也并不适合放在android 平板上使用,看了一下源码,跟我的编写风格出入挺大的,于是,就写一个我的博客园android 客户端. ps: 本人在广州正在nodejs 工作 不知道有木有推荐一下 (写过一个pomelo(基于nodejs 的实时应用服务端) 的教程: http://blog.gfdsa.net/tags/pomelo/ )? 联系邮箱: youxiachai@gmail.com 客户端规划 看了一下,博客园开放的API,没发现有闪存的API,所以没有目前暂时不打算实现关于用户信息这块的内容,登录账户,其实也就收藏一个文章,个人感觉意义不大.... 目标: 自适应android 手机和平板 简约的设计风格 文章自动离线保存 支持代码样式的博客内文 然后花了昨天和今天,两天时间,终于把一个原型app 完成,看了一下,完成度还挺高的,首先要感谢 @walkingp 的贡献. 当前版本的进度: android 和平板的响应式设计 完成新闻列表,和博客列表的api 编码花了两天,前天,写设计感,昨天敲代码,今天发布文档... TODOLIST: 完善界面 实现新闻内容和博文内容的显示

最近关于css样式重构的一点心得体会

帅比萌擦擦* 提交于 2020-03-28 11:45:27
之前的项目一直都是基于bootstrap,elementUI这些已经很成熟的框架进行二次开发,要么就是一些很小的宣传页面,h5页面,或者结构相对简单的移动端。一直都没有机会对css的整体进行一个思考,这次正好有个整站的重构项目,让我对css模块化以及重用这些进行了一个很好的梳理。 很早以前就读过bootstrap的sass源码,当时就十分的震惊,仿佛打开了新世界的大门,原来css还可以这么玩?css原来也有模块化,原来也可以这么优雅?对比之下,自己写的,简直杂乱无章,一堆狗屎,重用性不行,后期不易于维护,扩展性也不行,这些都是一个很致命的缺陷,或许区分一个前端开发工程师的好坏从这方面就能够有一个很好的体现吧,同样一个页面,或许一个初级前端工程师和一个高级前端工程师都可以100%的还原出来,但是你是用1K的css代码写出来的还是用10K的css代码写出来的就有天壤之别,或许从数据上面来看只有9K的差距,但是如果考虑到用户流量的问题,这个就是很大的问题了。如果是个访问量100的小网站那么就是 900K,如果是像淘宝网这样的产品,那么差距就十分明显了。一个简洁可复用的css代码不仅可以节约大量的带宽,提高性能,同时也是工程化的需要。 开始的时候写的都是css,这个时候什么模块化啥的根本就不可能有很深刻的感觉,直到看了bootsrap源码后,开始使用sass

重构的一点体会

孤者浪人 提交于 2020-03-28 11:41:10
这几天在重构系统,用四个字形容我的心情就是“吐血而亡”,其实只是因为权限控制的细化,导致大量地方需要修改(原先比较混乱),索性重构这部分功能,如果整个系统重构,估计会让我疯狂的。还不如推倒重写舒服。可见重构动作不宜过大,应该小步小步、日积月累的不断重构。现在回过头来体会 《重构—改善既有代码设计》 这本书的知识点,觉得作者的一系列观点真是切入要害。 系统开发、维护本来就要时时重构,但是如果一个系统要重构的地方相当多、重构动作大的时候,说明这个系统已经问题重重了,也反映了系统架构不到位,前期没有合理的重构。就像一位病重的病人了。这时要做的就是“下猛药”或是完全抛弃它。 如果把系统类比成人的话,随着时间推移,系统需要不断扩充它的功能,体现它的价值,但是呢,它有可能生病,有可能是外因或内因导致,如果这时候定期做体检(代码Review,代码审查),把小病治愈的话(系统重构),那么它的寿命也就能延长(系统的生命周期延长),但是如果患上各种小病,而且病情持续恶化的话,这个时候如果来医治(重构)的话,药物治疗的功效就要打折扣了,因为可能这个药会影响其它病情,自然医治困难了。 来源: https://www.cnblogs.com/kerrycode/archive/2010/10/27/1863021.html

Luogu4899 IOI2018狼人(kruskal重构树+主席树)

余生颓废 提交于 2020-03-25 07:39:15
  可以发现询问的即是“由起点开始‘只经过编号大于等于l的点’所形成的连通块”与“由终点开始‘只经过编号小于等于r的点’所形成的连通块”是否有交集。于是建出重构树,就可以知道每个询问的连通情况了。现在要知道的是两个连通块的交集,考虑每个点是否有可能在里面。于是按照两棵重构树的dfs序给每个点一个二维坐标,问题就变为二维数点了,主席树即可。   注意编号从0开始。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 200010 #define M 400010 int n,m,q,root[N<<1],cnt; struct data{int x,y; }e[M]; struct data2{int l,r,x; }tree[N

记一次小程序样式优化重构

守給你的承諾、 提交于 2020-03-24 00:34:12
3 月,跳不动了?>>> 上周花了 3 天的时间和老大一起重构了一下小程序的样式开发,虽然说在开发的过程中遇到了一些问题,但是最终减少了不少样式代码,同时功能上也更加强大。进一步来说,如果在后面我们的小程序用户想要自己定制化主题,也可以很快的实现。 全局样式开发 之前的小程序开发中,我们全方面使用了 Component 构造小程序组件以及页面(页面也可以使用 Component 构造器来编写)。当然一方面是因为小程序 Component 的开发体验非常好,拥有类似于 Vue mixin, watch 的 behaviors 和 observers ,比 Page 构造器强大了很多。另一方面,对于业务较重的小程序来说, Component 也有性能优势。可以参照 滴滴开源小程序框架Mpx 中的 Page与Component setData性能对照 。 在开发过程中,有很多样式是可以复用的。如果在之前开发中经常使用 Bootstrap 之类的 ui 库,那么你就会习惯使用这种库的 utilities 类。但是默认情况下,自定义组件的样式只受到自定义组件 wxss 的影响。不会受到全局样式 app.wxss 的影响。所以我们只能通过增加 @import 语法来辅助各个组件进行开发。 @import "xxx.css"; 如果你使用 CSS 预处理器来辅助小程序开发的话,可能就需要通过

2020 重学C++ 重构你的C++知识体系

不羁岁月 提交于 2020-03-23 19:01:53
2020 重学C++重构你的C++知识体系 百度10年C++开发工程师的经验心得,带你深入底层、深入细节、深入思想,重学C++ 从学习角度看,C++是一门“见效慢”的语言;学习曲线陡峭,语言本身复杂。但,如果你想了解很多编程语言的思想源泉,想要一窥大型企业级开发工程的思路,想开发别人做不了的高性能程序,那C++就是你的不二之选。如果你想成为一名资深开发人员,想一窥底层细节,那么,这门课就是为你设计的。课程将从C++的发展史讲起,从知识与思想层面 从0带你构建C++知识框架,并会分享讲师亲历的大型项目实践思路,为你打下坚实的基础 第1章 C++概括 了解C++的历史概况,C++语言的特点及C++语言作用,认识哪些场合下C++是无可替代的; 第2章 C++基础语法 本章讲解编程语言的层次,编译语言的特点;深入学习C++常见的标识符,关键字,数据类型,变量,常量及;IDE Visual Studio的安装,使用和调试方法; 第3章 C++的运算符与表达式 理论结合实际,深入讲解C++表达式,表达式;分别讲解了算术运算符,关系运算符,逻辑运算符,位运算符,赋值运算符及杂项运算符及表达式,同时讲解了注释的用处和规范; 第4章 C++基础容器 本章我们将深入剖析C++数组:传统的数组优缺点及STL中vector的使用和思想;剖析C++的字符串: 对比C的字符串,C++的字符串

设计模式的六大原则

喜欢而已 提交于 2020-03-07 13:06:35
一、单一职责原则(Single Responsibility Principle) 二.开闭原则(Open-Closed Principle, OCP) 三、里氏代换原则(Liskov Substitution Principle, LSP) 四、依赖倒置原则(Dependence Inversion Principle,DIP) 五、接口隔离原则(Interface Segregation Principle, ISP) 六、迪米特法则(Law of Demeter, LoD) 总结 一、单一职责原则(Single Responsibility Principle) 定义:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。 问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有 可能会导致原本运行正常的职责P2功能发生故障。 单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中