看代码的时间占比,然后,看看哪些部分是可以优化的,减少运行时间的。...能使用构造函数一步到位的,就尽量使用构造函数,而不是使用一个个setter函数 2. 能使用数组的,就使用数组。替代list,数组是真的快。...import com.lxk.model.Dog; /** * 测试谁快 直接构造或者一个个set,他们的效率差多少 * * @author LiXuekai on 2019/6/18 *...,所以,在能一步到位给属性设置值的时候,考虑到效率问题,就要这么干!...结果: 可以看到,还是构造函数牛x呀,还是他快,另外,上面的比例:72.6 : 27.4 = 33 :12.4 = 2.64 构造和set的时间比例是没有变化的。 (完)
现要做一个简单的登录页面,如果用户通过验证,会显示Welcome用户名的欢迎词,反之则返回登录页面让用户再次输入 这部分的完整代码是JSPDemo项目里的login.jsp,下面来分析一下关键代码。...首先来分析一下业务,当进入这个页面的时候,需要判断是否有用户名和密码信息输入,以此来做不同的动作,所以在开始部分,需要用一个内嵌对象request来完成这个功能,主要代码如下。...31和35行得到了用户名和密码之后,用第38行的Class.forName载入了JDBC的驱动程序,然后在第43行定义了一个PreparedStatement来执行SQL语句,并在第46行用一个ResultSet...①修改点一:我们需要调整供用户验证身份的Form代码,加入验证码的输入框。 我们不得不修改两个重复且相同的代码,这样不仅会增加工作量,而且一个疏忽就会导致忘记修改其中一个,增加代码维护的难度。...具体来说,在JSP页面里,剥离与显示无关的代码,一个好的JSP页面里,应该少见甚至不用包含起来的Java代码。
,代码中有下列一些问题,这些问题是由于两个显式调用new关键字的构造对象实例引起的。...继续我们的重构,重构后的构造函数代码部分已经加粗显示,重构动作的改动非常小,但是管理依赖的能力却大不相同。...当我们使用“new”的时候,就是在实例化具体类。当出现实体类的时候,代码就会更缺乏“弹性”。越是缺乏弹性越是难于改造。在后面我们还会继续讨论“new代码味道”。 简单工厂 让我们继续回到游戏。...这是设计模式里对于工厂模式的说明。 工厂模式确实在一定程度上解决了创建对象的难题,项目中不会再到处充斥了“new代码味道”。但是有一个问题没有解决,要实例化哪一个对象,是在运行时由一些条件决定。...有些类是需要默认构造函数的,比如MVC框架的Controller类,一旦使用构造函数注入,就无法使用默认构造函数。
",比较容易搞清楚,避免代码里的“坏味道",离好的代码就不远了,坏味道一二三及推荐做法: 代码重复 函数太长 如果太长(一般不宜超过200行,但不绝对),你自己都不太容易读懂,请不要犹豫,拆成小函数吧。...还是那个大型复杂的金融软件,核心的几个Algo C++文件,2万到3万行,我的心在滴血 数据泥团 即很多地方有相同的三四项,两个类中有相同的字段、许多函数签名中有相同的参数。...把这些应该捆绑在一起的数据项,弄到一个新的类里吧。这样,函数参数列表会变短不少 函数参数列表太长 工作中有7个参数的函数调用,搞清楚每个参数的业务含意,和顺序有点头晕。...,delteteUserByName 太多的if else 在循环里定义大量耗资源的变量 大对象,如果可以放在循环外,被共享,推荐这么搞 try 块代码太长 try块只包住真的可能发生异常的语句,最小原则...TRUE : FALSE); } 静态工厂方法,不必在每次调用时都创建一个新的对象;而且相较于构造器,它有名称,便于阅读和理解;同时可以返回原类型的任意子类型;也可以根据参数不同,返回不同的类对象,如EnumSet
什么是好代码,不好定义,但是关于什么是代码里的"坏味道",比较容易搞清楚。...还是那个大型复杂的金融软件,核心的几个Algo C++文件,2万到3万行,我的心在滴血 数据泥团 即很多地方有相同的三四项、两个类中有相同的字段、许多函数签名中有相同的参数。...把这些应该捆绑在一起的数据项,弄到一个新的类里吧。这样,函数参数列表会变短不少,简单化了 函数参数列表太长 工作中有7个参数的函数调用,搞清楚每个参数的业务含意,和顺序有点头晕。...,delteteUserByName 太多的if else 在循环里定义大量耗资源的变量 大对象,如果可以放在循环外,被共享,节省时间空间 try 块代码太长 try块只包住真的可能发生异常的语句,最小原则...TRUE : FALSE); } 静态工厂方法,不必在每次调用时都创建一个新的对象;而且相较于构造器,它有名称便于阅读和理解;同时可以返回原类型的任意子类型;也可以根据参数不同,返回不同的类对象
://localhost/api/demo/test'); 上面这个代码示例很简单,实现了一个get方法调用api的函数,后来陆陆续续加上了post、put、delete function httpGet...person.name = '王二' 工厂模式 声明式虽然能创建对象,但是有个缺点,如果要创建多个对象,就需要重复写以上的代码。...假如你熟悉面向对象编程,那么你一定更倾向于使用new Person() 还有一个重要的好处:使用构造函数模式产生的对象式该函数的实例。...也就是说工厂模式下,得到的person是Object的实例,而构造函数模式下得到的person是更为具体的Person的实例。...我们可以用instanceof关键字来判断一个实例属于哪个类型,或者我们可以通过实例的constructor来看构造函数是谁 到此为止,如果不考虑构造函数模式的一些细节问题,这种插件的写法已经可以应用到我们当前项目里了
:one:全局单一实例:单例模式:car:获取对象超简单:工厂模式:clipboard:重复代码太多?试试:模板方法模式:ghost:接口对应功能不知道怎么维护?...设计模式提供了一种标准化的解决方案,可以让相同的功能代码在多个地方重复使用,从而避免了重复编写相同的代码,减少了开发时间和成本。提高代码的灵活性和扩展性。...设计模式允许开发人员在不改变现有代码的情况下,轻松地添加新的功能或修改现有的功能。...试试:模板方法模式模板方法模式通常应用于以下场景:(1)当一个算法的步骤中有一部分是不变的,而另一部分是需要根据不同的条件进行变化时,可以使用模板方法模式来实现。...通过将它们作为函数的选项传递,可以更灵活地控制函数的行为具体场景:gRPC服务进行实例化的时候有些参数可以不同填,即选填,之后在源码内部会使用默认的值,于是我们就可以使用以下的方式进行处理。
重写而非重构的一个清楚讯号是:现有代码根本不能正常运作。 (二)代码的坏味道 1、重复代码 如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将它们合二为一,程序会变得更好 。...如果代码前方有一行注释,就是提醒你:可以将这段代码替换成一个函数。 条件表达式和循环常常也是提炼的信号。 3、过大的类 如果想利用单个类做太多的事情,其内往往就会出现太多实力变量。...使用的太多的间接层,使得系统中的所有函数都似乎只是对另一个函数的简单委托,造成在委托动作之间晕头转向。...11、隐藏函数 某个函数,从来没有被其他任何类用到 。将函数修改为private。 12 、以工厂函数取代构造函数 希望在创建对象时不仅仅是做简单的建构动作 。 将构造函数替换为工厂函数。...3 、构造函数本体上移 各个子类中有一些构造函数本体几乎完全一致 。在超类中新建一个构造函数,并在子类构造函数中调用它。 4、函数下移 超类中的某个函数只与部分(而非全部)子类用到。
蔡了一听,知道老马又要上课了,赶紧推了一把椅子,收了心里的腹诽,像个乖乖女一般规规矩矩地坐下来,看着老马屏幕上打开的一个类。正是昨天自己写的一个工厂类Kafka251Factory。...更何况,作为一个工厂对象而言,频繁地创建工厂实例,既无必要,也增加了垃圾回收的负担。” 蔡了点点头,说道:“大叔,我貌似懂了,就是说从调用者的直觉来看,这样的静态工厂方法应该更符合调用者的期望。...,将它们定义为字段,然后在构造函数中接收其值,这一设计是合理的。...马丁花说到这里,想了想,继续说道:“若要说重复,代码中的config.item(label).topic()出现了两次,有着很明显的重复代码坏味道,可以再改进一下。” “这个还不简单!”...当你发现调用一个对象时,频繁出现多个方法链式的调用,只要不是像Java Stream API那样的流畅接口,都说明它的封装不够彻底,属于Martin Fowler指出的Message Chain坏味道,
很显然,工厂模式帮助我们解决了重复代码上的麻烦,让我们可以写很少的代码,就能够创建很多个person对象。但是这里还有两个麻烦,需要我们注意。 第一个麻烦就是这样处理,我们没有办法识别对象实例的类型。...); // true console.log(foo instanceof Function); // true 因此在工厂模式的基础上,我们需要使用构造函数的方式来解决这个麻烦。...四、原型 虽然构造函数解决了判断实例类型的问题,但是,说到底,还是一个对象的复制过程。跟工厂模式颇有相似之处。...在这个例子中,我们同时在原型与构造函数中都声明了一个getName函数,运行代码的结果表示原型中的访问并没有被访问。...在上面我们已经理解了构造函数的本质,它其实是在new内部实现的一个复制过程。而我们在继承时想要的,就是想父级构造函数中的操作在子级的构造函数中重现一遍即可。我们可以通过call方法来达到目的。
设计模式指导思想:找到不同场景下,需求容易发生变化的地方,把这一部分变化的逻辑封装起来。 创造型设计模式一共有5种:工厂模式、抽象工厂、单例模式、创造者模式、原型模式。本文我们介绍工厂模式。...实际编程中,当一个类的构造函数接受十几个甚至更多参数时,可以需要考虑下是否需要创建者模式。 实现步骤 创建生成器接口,接口包含创建产品的多个步骤。 创建生成器实现类,实现创建产品的所有方法。...在产品的构造函数中使用生成器创造产品。...throw new Error("Method not implemented."); } } /** * 具体产品类 * 在构造函数中传入创建者接口类型...* 当创建逻辑特别复杂时,也可以把下面构造函数中调用Builder方法的代码,放到单独的类中。
重写而非重构的一个清楚讯号是:现有代码根本不能正常运作。 二、代码的坏味道 1、重复代码 如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将它们合二为一,程序会变得更好 。...如果代码前方有一行注释,就是提醒你:可以将这段代码替换成一个函数。 条件表达式和循环常常也是提炼的信号。 3、过大的类 如果想利用单个类做太多的事情,其内往往就会出现太多实力变量。...使用的太多的间接层,使得系统中的所有函数都似乎只是对另一个函数的简单委托,造成在委托动作之间晕头转向。...11、隐藏函数 某个函数,从来没有被其他任何类用到 。将函数修改为private。 12 、以工厂函数取代构造函数 希望在创建对象时不仅仅是做简单的建构动作 。将构造函数替换为工厂函数。...3 、构造函数本体上移 各个子类中有一些构造函数本体几乎完全一致 。在超类中新建一个构造函数,并在子类构造函数中调用它。 4、函数下移 超类中的某个函数只与部分(而非全部)子类用到。
重写而非重构的一个清楚讯号是:现有代码根本不能正常运作。 (二)代码的坏味道 1、重复代码 如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将它们合二为一,程序会变得更好 。...同一个类中有相同的表达式:提炼出重复的代码,然后让两个地方都调用被提炼出来的那一段代码; 两个互为兄弟的子类内含有相同的表达式:提炼出相同代码,将它推入超类内; 两个毫不相干的类中出现:将重复的代码提炼到一个独立的类中...使用的太多的间接层,使得系统中的所有函数都似乎只是对另一个函数的简单委托,造成在委托动作之间晕头转向。...11、隐藏函数 某个函数,从来没有被其他任何类用到 。将函数修改为private。 12 、以工厂函数取代构造函数 希望在创建对象时不仅仅是做简单的建构动作 。 将构造函数替换为工厂函数。...3 、构造函数本体上移 各个子类中有一些构造函数本体几乎完全一致 。在超类中新建一个构造函数,并在子类构造函数中调用它。 4、函数下移 超类中的某个函数只与部分(而非全部)子类用到。
重写而非重构的一个清楚讯号是:现有代码根本不能正常运作。 二.代码的坏味道 1.重复代码 如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将它们合二为一,程序会变得更好 。...如果代码前方有一行注释,就是提醒你:可以将这段代码替换成一个函数。 条件表达式和循环常常也是提炼的信号。 3.过大的类 如果想利用单个类做太多的事情,其内往往就会出现太多实力变量。...使用的太多的间接层,使得系统中的所有函数都似乎只是对另一个函数的简单委托,造成在委托动作之间晕头转向。...11.隐藏函数 某个函数,从来没有被其他任何类用到 。将函数修改为private。 12.以工厂函数取代构造函数 希望在创建对象时不仅仅是做简单的建构动作 。将构造函数替换为工厂函数。...3.构造函数本体上移 各个子类中有一些构造函数本体几乎完全一致 。在超类中新建一个构造函数,并在子类构造函数中调用它。 4.函数下移 超类中的某个函数只与部分(而非全部)子类用到。
重写而非重构的一个清楚讯号是:现有代码根本不能正常运作。 (二)代码的坏味道 1、重复代码 如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将它们合二为一,程序会变得更好 。...如果代码前方有一行注释,就是提醒你:可以将这段代码替换成一个函数。 条件表达式和循环常常也是提炼的信号。 3、过大的类 如果想利用单个类做太多的事情,其内往往就会出现太多实力变量。...使用的太多的间接层,使得系统中的所有函数都似乎只是对另一个函数的简单委托,造成在委托动作之间晕头转向。...11、隐藏函数 某个函数,从来没有被其他任何类用到 。将函数修改为private。 12 、以工厂函数取代构造函数 希望在创建对象时不仅仅是做简单的建构动作 。将构造函数替换为工厂函数。...3 、构造函数本体上移 各个子类中有一些构造函数本体几乎完全一致 。在超类中新建一个构造函数,并在子类构造函数中调用它。 4、函数下移 超类中的某个函数只与部分(而非全部)子类用到。
《重构--改善既有代码设计》 的第2版提供了 JavaScript 的版本,已经非常方便我们前端同学阅读了,但是在 TypeScrip 如此火热的今天,缺了 TS 的版本,始终觉得是些遗憾,所以老袁打算每天拿出一些时间将一些非常经典的案例...① 重复性工作,既有的代码无法帮助你轻松添加新特性时 ② 修补bug时,排查逻辑困难 ③ 太多的代码无注释,已然连自己都无法快速理清代码逻辑 1....[ ] Replace Conditional with Polymorphism(以多态取代条件表达式) [ ] Replace Constructor with Factory Method(以工厂函数取代构造函数...:如果一个函数能够不需要任何参数能够解决你的问题(包括使用其他的函数,),这当然是绝佳的。但是在我们日常开发中需要经常为函数添加参数。 动机?...,减少了过长的参数(它是代码的坏味道Data Clnmps,坏味道不是翻译的尴尬是坏味道包含如下),后面也会给大家逐步介绍。
6.内联singleton 用creation method代替构造函数 因为在java中,构造函数和类名相同。...构造函数过多,则需要用参数进行区分不同的功能。这种方式会让人迷惑。 用一个简单的static函数包装下原本的构造函数,能极大的消除创建迷惑。真是太棒了。...把创建知识搬移到factory中 创建漫延指,创建一个对象的代码和数据重复出现在了多个地方。此时管理起来就不方便了。 简单的factory把创建对象的过程和数据封装在了一个类对象中。...通常,简单工厂就能满足需要,但如果工厂中有太多的switch,可以考虑将工厂升级为抽象工厂。 factory容易被滥用,因为factory仅仅是一组creation method的集合。...用build封装composite 有时,一个composite的实现不是那么的可爱。比如系统自带的高度抽象的xml包。 此时,可以在它的上面再加一层封装。即用builder代码来替换原生代码。
Duplicated Code(重复代码) 如果你在一个以上的地点看到相同的程序结构,设法将他们合而为一,程序会变得更好。...你应该将循环和其内的代码提炼到一个独立的函数中。 三. Large Class(过大的类) 如果想利用单个类做太多事情,其内往往就会出现太多实例变量。一旦如此,重复代码也就接踵而至了。...和“太多实例变量”一样,类内如果有太多代码,也是代码重复、混乱并最终走向死亡的源头。...如果有五个“百行函数”,他们之中有很多代码相同,那么你也许可以把他们变成五个“十行函数”和十个提炼出的“双行函数”。...如果类中有一个复杂算法,需要好几个变量,实现者不希望传递一长串参数,所以他把这些参数放进字段中,导致坏味道。
领取专属 10元无门槛券
手把手带您无忧上云