重构

Leetcode 767:重构字符串

∥☆過路亽.° 提交于 2019-12-11 02:10:09
题目描述 给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。 若可行,输出任意可行的结果。若不可行,返回空字符串。 示例 1: 输入: S = "aab" 输出: "aba" 示例 2: 输入: S = "aaab" 输出: "" 注意: S 只包含小写字母并且长度在[1, 500]区间内。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorganize-string 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解题思路 struct cmp{ bool operator()(pair<char,int> a,pair<char,int> b){ return a.second<b.second; } }; class Solution { public: string reorganizeString(string S) { string ans = ""; char pre=' '; unordered_map<char,int> mp; stack<pair<char,int>> sk; priority_queue<pair<char,int>,vector<pair<char,int>>,cmp> que; for(auto it : S) ++mp[it];

重构——一个小例子

假装没事ソ 提交于 2019-12-10 05:29:02
菜鸟区域,老鸟绕路! 原代码,这是一个可以借阅影片的小程序,你可以想象成某个大型系统,我想代码应该都能很容易看懂: using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Reconsitution { public class Movie { /// <summary> /// 常规的 /// </summary> public const int Regular = 0; /// <summary> /// 新发布 /// </summary> public const int NewRelease = 1; /// <summary> /// 儿童版 /// </summary> public const int Childrens = 2; public string Title { get; private set; } public int PriceCode { get; set; } public Movie(string title, int priceCode) { Title = title; PriceCode = priceCode; } } public class Rental { public Movie @Movie

VC模式下javascript项目重构

拟墨画扇 提交于 2019-12-09 10:34:47
项目现状 项目为单页web应用,只针对chrome浏览器,无开发文档。由于是追求进度的项目,开发约定极少,除了jquery、LAB.js、bootstrap以及一些UI组件外,没有使用其他开源组件。 项目简单封装了 ajax请求 , form表单信息获取 , 缓存 , 获取和渲染模板函数 以及一些UI组件,ajax请求没有按照restful api进行封装。 现在项目开发中所遇到的问题: 代码命名不规范,例如 action , do_action 代码结构不清晰,没有按照功能或mvc拆分成独立的文件,只能依靠dom去查找具体的业务代码在哪里 模板写的有问题,复用模板使用id来做dom索引,或混入javascript业务逻辑,也有整个模板只包含一行代码 工具类封装与引用不规范,主要是没有注释,没有规范的例子可做参照,导致出现错误的使用工具类 业务逻辑的流转依靠dom操作,例如,在实现数据联动的时候,往往需要手动点击刷新按钮或者$(...).click()。 模板渲染封装太薄,导致不同模块的模板渲染方法各异,且会渲染模板中的javascript代码 无法对代码进行代码测试,只能依靠人工测试确保代码质量 css文件过大,基本上所有的css都集中在一个css文件下 页面跳转策略是隐藏老页面,显示新页面。 重构项目方案 代码书写规范 css规范 : http://www.iteye.com

WPF原生控件样式重构

六月ゝ 毕业季﹏ 提交于 2019-12-09 03:02:49
WPF中常用控件都有一个默认的自定义样式,当我们想要这个控件的样式变成自己喜欢的样式的时候,要怎么做呢,在Visual Studio中不能直接查看控件样式的,但是在Blend for Visual Studio中可以通过模板来查看 打开Blend for Visual Studio,把视图菜单下的资产窗口调出来,选择控件,把自己想要重构的控件拖到窗口里 选择视图菜单下的对象和时间线,它就会显示自己刚刚拖进去的控件,右击这个控件选择编辑模板下的编辑副本 选择样式的名称(关键字)和定义位置,在“名称(关键字)”中,如果选第一行,则样式含有自定义的x:Key属性;若选第二 行,则没有key,会自动为指定Type应用样式, 在“定义位置”中,第一行“应用程序”表示样式会放到app.xaml中,第二行放到当前xaml 文档中;第三行表示自定义资源字典 点击确定后就生成了相应的原生控件样式,样式中也包含ControlTemplate,这是就可以自己来重构控件样式了,还可以添加相应的鼠标触发事件 ​​​​​​​ 来源: CSDN 作者: 一只九离吖 链接: https://blog.csdn.net/weixin_44588733/article/details/92715655

学习重构(5)-简化条件表达式

北慕城南 提交于 2019-12-07 18:20:30
1.Decompose Conditional (分解条件表达式) 应用场景:你有一个复杂的条件(if-then-else)语句。从if、then、else三个段落中分别提炼出独立函数。 示例: if (date.before(SUMMER_START) || date.after(SUMMER_END)) {   charge = quantity * mWinterRate + mWinterServiceCharge; } else {   charge = quantity * mSummerRate; } 重构为: if (notSummer(date)) {   charge = winterCharge(quantity); } else {   charge = summerCharge(quantity); } private boolean notSummer(Date date) {   return date.before(SUMMER_START) || date.after(SUMMER_END); } private double winterCharge(int quantity) {   return quantity * mWinterRate + mWinterServiceCharge; } private double

重构步骤笔记

£可爱£侵袭症+ 提交于 2019-12-07 08:45:33
重构的目的 相同的代码不要出现两次 相同功能的代码可以及时抽取,以备日后复用,不要 重复创建轮子 重构的原则 明确 每一步的目标 小步走 测试(每一个改动都有可能出现错误) 抽取代码的步骤 新建方法 复制代码 根据代码调整参数和返回值 调整调用位置代码 测试 抽取类的步骤 示意图 抽取主方法 新建类 抽取主方法 在 .h 中定义方法接口,明确该方法是否适合被外部调用 在 .m 中增加方法实现 将主方法复制到新方法中 复制相关的 子 方法 复制相关属性 检查代码的 有效性 调整内部变量,让 NSURL 由调用方传递,保证代码的灵活性 复制代理方法, 注释更新 UI 部分的代码 使用 #warning TODO 提醒自己此处有未完成的工作 这样做可以不影响重构的节奏 调整视图控制器 测试 重构方法执行 调整视图控制器代码,删除被移走代码 再次测试,确保调整没有失误! 确认接口 确认重构的接口 需要 进度 回调 需要 完成&错误 回调 定义类方法,传递回调参数 实现类方法,记录住回调 block 调整调用方法 增加 block 实现 测试 增加已经下载完成的回调 进度回调(100%) 完成回调(路径) 断言 暂停操作 测试,测试,测试! 新问题:如果连续点击,会重复下载,造成错乱! 解决办法:建立一个下载管理器的单例,负责所有的文件下载,以及下载操作的缓存! 示意图 抽取下载管理器

读《代码重构》一书小计

淺唱寂寞╮ 提交于 2019-12-06 19:38:07
通过阅读《代码重构》一书,让我了解的最重要的一点是“重构不同于优化”。在这之前,我的观念中,“重构”与“优化”是划等号的。不过通过这本书,我了解到他们做着完全不同的事情,甚至是对立的。 下面讲讲重构一书中对我当前有用的部分: 第一章: 重构原则:去除临时变量 需要注释的地方都可以提取函数或方法(用函数名作为注释) 函数或方法名应该描述实现什么功能,而不是描述怎么实现 对比:重构——使代码(对人)易读、易改、易复用 优化——提高代码性能(往往使代码难以理解) 开发正常流程:增加新功能-》重构-》增加新功能-》重构……(一个正常的开发者,往往在这之间不断来回切换,间隔有时只有几分钟。要时刻知道自己当前是在增加新功能还是在重构) 第二章: 重构作用: 重构改进软件设计——去除重复代码(代码维护变得简单) 重构使软件更易理解 重构帮助寻找bug(随着理解的加深,bug浮出水面) 重构提高编程速度(短期拖慢进度,提高的是后续的编程速度,达到整体的进度加快、速度提高。如果一个项目接近尾声,就不要使用重构,因为重构只会起到反作用) 第三章: 自动测试: 一个开发人员,开发过程中,70%以上的时间是在做测试工作。这足以体现自动测试的重要性。 之后的8章讲的是在重构工具中使用的各种函数,对我来说是没有任何用处的,所以就没有看。 来源: oschina 链接: https://my.oschina

如何提高程序员的生产率 (2)

走远了吗. 提交于 2019-12-06 18:50:47
版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/252 来源:腾云阁 https://www.qcloud.com/community 接上篇 如何提高程序员的生产率 (1) 三. 开发过程 沟通 软件通常都需要经过很多人和很多次的沟通才能生产出来,但是沟通本身又往往会影响软件的开发速度。这是一段很矛盾的关系。好的沟通方法能降低开发中因为信息不透明导致的开发资源浪费,而又尽量减少沟通所占用的精力。 1. 需求沟通 在任何一个软件产品中,如何应对需求的变更,都是至关重要的。需求一直是软件工作得以成功或者失败的最重要因素。软件开发中很多技术和方法都是围绕着需求来设计的。 需求的沟通是需求工作的第一个环节。首先沟通的对象必须是经过挑选的,以免添加不必要的需求混乱。最佳的需求沟通是和用户或者用户代表。但是他们往往他们缺乏必要的计算机知识。而程序员却很少有丰富的需求领域的知识。这个鸿沟需要双方共同去弥补,最重要的做法是,不要光靠口说。 程序员应该认真研究需求领域的知识,仔细查看涉及的单据、原型产品、现有工作流程等,而且必须用笔记录下来,之后再去整理问题,逐条咨询用户。在仔细了解情况之前,不宜开始设计整体程序结构。 当你有一定了解之后,程序员就可以动手开发一个快速的原型,如果没有足够资源

大型系统重构的步骤简单梳理

时间秒杀一切 提交于 2019-12-06 14:59:07
目前正在参与公司一个核心大系统的重构工作。本文梳理一下大型系统重构的一些步骤和心得。 概述 随着公司业务不断的发展,用户量不断的增加,对系统的性能要求会越来越高,而原来仓促做出来的项目,其不合理性的地方就会不断的暴露出来。大家如果接触过非常赚钱的互联网产品,一定会知道产品的一个小小的bug,公司就可能损失好几百万甚至几个亿。当产品的用户数达到一定量的时候,对系统的各个方面的要求就越高,例如qps、cpu、容灾、降级、限流、可扩展性、可维护性等等。系统除了要应付大量的并发请求,还必须快速支持各种业务需求,必须对系统进行大重构。 备注: 下面的一些步骤和方式是根据我自己的项目的实际列出的。 业务梳理 要弄懂原来的业务流程,如果有不合理的业务流程,必须进行业务流程优化。这种一般是公司的业务架构师来处理的。 数据库重构 前期的项目,由于赶进度,并没有充足的时间设计表,导致各种冗余表、大表、大量的冗余的字段、扩展性差的表。所以重构系统的时候,可以先从表开始,通过对当前业务的梳理,重新把表整理一下。 1. 字段太多的表,可以根据部分字段的业务属性,抽取成一个新表; 2. 已经不再用的表字段,删除掉; 3. 可以合并的字段,尽量进行合并,例如,想表示一个商品是旅游商品,就没必要新增一个类似is_travel的字段,可以直接在商品类型product_type中增加一个枚举值即可; 4.

重构drf后的环境变量配置

十年热恋 提交于 2019-12-06 12:55:17
环境变量 dev.py # 环境变量操作:小luffyapiBASE_DIR与apps文件夹都要添加到环境变量 import sys sys.path.insert(0, BASE_DIR) APPS_DIR = os.path.join(BASE_DIR, 'apps') sys.path.insert(1, APPS_DIR) 在写项目直接导入utils文件夹,如何使它不''错误提示'' 比如import utils会出现下划线 (注意: 只有添加了环境变量的文件夹设置) 配置media media配置:dev.py MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') media目录配置 封装logger dev.py # 真实项目上线后,日志文件打印级别不能过低,因为一次日志记录就是一次文件io操作 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s' }, 'simple': { 'format': '%(levelname)s