重构

《领域驱动设计》学习笔记

走远了吗. 提交于 2020-02-10 00:55:12
【第一部分】运用领域模型 第1章:消化知识 有效的建模要素 (1)模型和实现的绑定 (2)建立了一种基于模型的语言 (3)开发一个蕴含丰富知识的模型 (4)提炼模型 (5)头脑风暴和实验 【学习心得】:千万不要用自己有限的思维规划完整的图形,持续学习、消化、输出(讨论)、沉淀,所有道理都是一致的。 第2章:交流语言与使用 模式:UBIQUITOUS LANGUAGE(通用语言) 术语的交集产生了UBIQUITOUS LANGUAGE 想要创建种灵活的、蕴含丰富知识的设计,需要一种通用的、共享的团队语言,以及对语言不断的试验——然而,软件项目上很少出现这样的试验。 如果语言支离破碎,项目必将遭遇严重问题。领域专家使用他们自己的术语,而技术团队所使用的语言则经过调整,以便从设计角度讨论领域。日常讨论所使用的术语与代码(软件项目的最重要产品)中使用的术语不一致,甚至同一个人在讲话和写东西时使用的言语也不一致,这导致的后果是,对领域的深刻表达常常稍纵即逝,根本无法记录到代码或文档中。翻译使得沟通不畅,并削弱了知识消化。然而任何一方的语言都不能成为公共语言,因为它们无法满足所有的需求。 【学习心得】:在自己有限的项目经验里,说沟通成本占据项目总成本的八成都不为过,就像本书一开始的重点,就是无处不在的语言。这语言可以是人话、可以是图形、可以是表格,重点在于可以帮助项目高质量高效率的落地

力扣 OJ 767. 重构字符串

一曲冷凌霜 提交于 2020-02-09 18:08:44
题目: 给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。 若可行,输出任意可行的结果。若不可行,返回空字符串。 示例 1: 输入: S = "aab" 输出: "aba" 示例 2: 输入: S = "aaab" 输出: "" 注意: S 只包含小写字母并且长度在[1, 500]区间内。 思路: 分2步, 先判断最多的字符是否超过其他所有字符的数量+1,如果超过就无法重构,不超过就可以重构。 其次,按照贪心原则,每次取数量最多的字符即可。 代码: class Solution { public: string reorganizeString(string S) { int num[26] = { 0 }; int len = S.length(); for (int i = 0; i < len; i++)num[S[i] - 'a']++; for (int i = 0; i < 26; i++)if (num[i]>(len + 1) / 2)return ""; string ans = S; char tmp = '0'; for (int i = 0; i < len; i++) { int maxNum = 0, maxId = 0; for (int j = 0; j < 26; j++) { if (tmp - 'a' == j

js数组

一曲冷凌霜 提交于 2020-02-07 05:07:17
数组 数组是一个引用列表(顺序,只有值,紧密,速度慢) 数组的创建 var array=[]; //创建空数组 var array=new Array(); //构造函数创建法 var arr=Array(); //不是创建方法,只是把字符串转化为数组类型,速度慢点儿 var arr=new Object([]); //对象数组,不建议使用,反正也还没用过 构造函数创建 构造函数实例化对象 var arr=new Array(1,2,3,4,5); console.log(arr); 数组通过构造函数创建时,如果只有一个参数,并且参数是正整数,这个数就是数组的长度,而不作为数组的新元素; 如果是数字,但不是正整数,都会报错; 如果不是数字,则作为数组的第一个元素添加。 var arr=new Array(“3”); console.log(arr); //[“3”] var arr=new Array(9); console.log(arr); //(9) [empty × 9] 字符串转数组类型 var arr=Array(1,2,3,4,5,6); console.log(arr); var arr=Array(5); console.log(arr); //(5) [empty × 5] 数组的结构 字面量创建数组 var arr0 = [1,2,3,4,5];两个",

笛卡尔树及克鲁斯卡尔重构树

纵饮孤独 提交于 2020-02-07 00:45:29
笛卡尔树 好东西, 可以用于最大(小)值分治, 在 \(O(n)\) 的时间复杂度内建出一个节点为区间最大值的树, 每次分治时走小区间可以保证 \(O(nlog_n)\) 的复杂度 建树时维护极右链, 他的中序遍历即原序列 代码 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,v[N],fa[N],ls[N],rs[N]; int s[N],top; void Tree() { for(int i = 1; i <= n; i ++) { scanf("%d",&v[i]); while(top && v[s[top]] > v[i]) ls[i] = s[top], top --; fa[i] = s[top]; fa[ls[i]] = i; if(fa[i]) rs[fa[i]] = i; s[++ top] = i; } } 克鲁斯卡尔重构树 就像跑最小生成树一般, 只是每次合并时新建一个节点t, 让它与两个连通块的代表点连边, t成为整个连通块的代表节点, 这样保证底下的边权小于上面的边权 最小瓶颈生成树: #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include

这一顿神操作!我把 3000 行代码重构成 15 行!

。_饼干妹妹 提交于 2020-02-06 13:05:04
作者:马非码 博客园:https://www.cnblogs.com/marvin/p/4133973.html 如果你认为这是一个标题党,那么我真诚的恳请你耐心的把文章的第一部分读完,然后再下结论。如果你认为能够戳中您的 G 点,那么请随手点个赞。 把三千行代码重构为 15 行 那年我刚毕业,进了现在这个公司。公司是搞数据中心环境监控的,里面充斥着嵌入式、精密空调、总线、RFID的概念,我一个都不懂。还好,公司之前用Delphi写的老客户端因为太慢,然后就搞了个Webform的替代,恰好我对Asp.Net还算了解,我对业务的不了解并不妨碍我称成为这个公司的一个程序员。小公司也有小公司的好,人少,进去很快负责代码开发。我当然也就搞这个数据中心智能管理系统啦。 这个系统非常的庞大,尤其牛逼的是支持客户端组态,然后动态生成网页,数据还能通过Socket实时监控(那时我还真就不懂网络编程)。这个对于当时的我来说,真真是高、大、上呐!!当时跟着了解整个系统大半个月才算能够调试,写一些简单的页面。 在维护系统的过程中,时不时要扩展一些功能,也就接触了下面这个类: 看到没有,就是当年最最流行的三层架构的产物,对于刚出茅庐的毛头小子来说,这是多么专业的文件头注释,还有反射也就算了,这构造函数还能静态的,还能私有的?那时刚接触这么高大上的代码的我,瞬间给跪了! 但是,类写多了,我就感觉越来越别扭

左耳听风-ARTS-第7周(2019/05/19-2019/05/25)

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-05 00:32:45
Algorithm 本周的算法题是Count and Say( https://leetcode.com/problems/count-and-say/ ),看了几遍题,没找出n与产生字符串的规律来,上网一查才知道,是通过数上一个字符串的字符数来生成下一个字符串,所以用了递归。 public String countAndSay(int n) { if (n == 1) { return "1"; } else { String rawStr = countAndSay(n - 1); char[] chars = rawStr.toCharArray(); StringBuilder sb = new StringBuilder(); int i = 0; char temp = ' '; for (char c : chars) { if (temp == c) { i++; } else { if (temp != ' ') { sb.append(i).append(temp); } temp = c; i = 1; } } sb.append(i).append(temp); return sb.toString(); } } Reading 《Beauty Is in Simplicity》( https://97-things-every-x-should-know

机房重构数据库设计---工具“PowerDesigenr”

被刻印的时光 ゝ 提交于 2020-02-02 03:58:25
俗话说:工欲善其事必先利其器,这是第二次机房收费系统。不想使用之前的数据库,所以就在网上查询用什么可以设计数据库。最后在哔哩哔哩上找到一个视频~讲的就是如何使用PowerDesigenr这个软件设计数据库。 界面展示 数据库设计成品展示: 具体怎么使用就不在这啰嗦了大家都可以找到更加详细的教程,不怕不知道,就怕不知道。所以不担心大家不会,只是担心大家不知道这个软件的存在! 好处: 好处非常有必要在这里多啰嗦下,也算是让大家眼馋一下吧!看上面已经设计好的关系图了没,这个图可以支持正向生产代码。可以生成SQL语句的代码,然后你就可以把这个代码复制到你已经创建的数据库里去创建表(切记,一定要先创建一个空的数据库) 生成的SQL语句部分代码 /*==============================================================*/ /* DBMS name: Microsoft SQL Server 2012 */ /* Created on: 2020/1/29 22:43:20 */ /*==============================================================*/ if exists (select 1 from sys.sysreferences r join sys.sysobjects

音乐可视化specinker重构开发日志

半城伤御伤魂 提交于 2020-01-30 05:12:28
重构前后对比: 由于期末临近,同学哀求老师给时间复习,就推迟到考试结束一星期之后,这也给了充足的时间,对软件进行了一次彻彻底底的重构!! 有多彻底?我重构之前这个项目的代码只界面部分就已经七千多行了,这次重构小到基本控件,大到整个界面,引擎,都重新写了,唯一留下的,还是那个颜色选择控件。 为什么要重构?有三方面原因: 1、性能跟不上,内存占用太多:起初频谱引擎的响应速度为25ms刷新一次,也就是说25ms之内要分析波形,根据波形,绘制轨道,得到轨道后,又要根据属性,绘制图形。而我在代码设计之初并未考虑效率问题,导致软件做好之后频谱有轻微的卡顿,起初我以为是音频数据的问题,因此还特意写了一个缓冲算法,进行平滑,勉强能够用得下去。而内存就更夸张了,每创建一个频谱,内存要多几十MB,而删除之后还不会减少,我明明有把对象析构啊! 2、界面粗糙,操作困难:界面丑不丑大家各有各的看法=.=,操作困难倒是真的,那个时候还没写手势拖动的功能,要移动频谱,只能在那个微调框那里,输入数据或拖动滑动条,手都给弄酸了 3、代码混乱,扩展困难:写代码的时候只管当下想要什么,就写什么,而没有把目标放长远,为以后的扩展给预留位置。 我是如何解决性能和内存问题的: 按照常规的界面,我都是在窗口的绘图事件之中创建画笔,然后进行绘图,这样做常规的界面通过事件绘图,看不出又什么区别,但是我这里25ms刷新一次

IntelliJ IDEA 快捷键

纵然是瞬间 提交于 2020-01-30 02:32:29
工欲善其事必先利其器!!! 要想高效的编写代码,就先要把开发工具玩到飞起! 下面就总结了一下idea的快捷键: 自动代码 常用的有fori/sout/psvm+Tab即可生成循环、System.out、main方法等boilerplate样板代码 。例如:要输入for(User user : users)只需输入user.for+Tab ;再比如:要输入Date birthday = user.getBirthday()只需输入user.getBirthday().var+Tab即可。 代码标签输入完成后,按Tab,生成代码。 1.Ctrl+Alt+O 优化导入的类和包 2.Alt+Insert 生成代码(如get,set方法,构造函数等) 或者右键(Generate) 3.fori/sout/psvm + Tab 4.Ctrl+Alt+T 生成try catch 或者 Alt+enter 5.CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里 6.Ctrl + O 重写方法 7.Ctrl + I 实现方法 8.Ctr+shift+U 大小写转化 9.ALT+回车 导入包,自动修正 10.ALT+/ 代码提示 11.CTRL+J 自动代码 12.Ctrl+Shift+J,整合两行为一行 13.CTRL+空格 代码提示 14.CTRL+SHIFT

Java8-19-lambda 重构代码

▼魔方 西西 提交于 2020-01-29 11:15:38
通过本书的前七章,我们了解了Lambda和Stream API的强大威力。 你可能主要在新项目的代码中使用这些特性。如果你创建的是全新的Java项目,这是极好的时机,你可以轻装上阵,迅速地将新特性应用到项目中。然而不幸的是,大多数情况下你没有机会从头开始一个全新的项目。很多时候,你不得不面对的是用老版Java接口编写的遗留代码。 这些就是本章要讨论的内容。我们会介绍几种方法,帮助你重构代码,以适配使用Lambda表达式,让你维护的代码具备更好的可读性和灵活性。 除此之外,我们还会讨论目前比较流行的几种面向对象的设计模式,包括策略模式、模板方法模式、观察者模式、责任链模式,以及工厂模式,在结合Lambda表达式之后变得更简洁的情况。 最后,我们会介绍如何测试和调试使用Lambda表达式和Stream API的代码。 为改善可读性和灵活性重构代码 从本书的开篇我们就一直在强调,利用Lambda表达式,你可以写出更简洁、更灵活的代码。 用“更简洁”来描述Lambda表达式是因为相较于匿名类,Lambda表达式可以帮助我们用更紧凑的方式描述程序的行为。 第3章中我们也提到,如果你希望将一个既有的方法作为参数传递给另一个方法,那么方法引用无疑是我们推荐的方法,利用这种方式我们能写出非常简洁的代码。 采用Lambda表达式之后,你的代码会变得更加灵活