设计模式

不讲码德!坏味道偷袭我这个老码农

允我心安 提交于 2020-12-18 13:18:03
作者 | 雷架 来源 | 爱笑的架构师(ID:DancingOnYourCode) 大家闭上眼睛想一下什么是好代码?也许你的脑海中漂浮着一堆词:干净、整洁、命名规范、注释合理、高内聚低耦合…… 人人都想写好代码,因为看好的代码就如同看一位五官端正的女子,会心情愉悦、舒畅;而看糟糕的代码就如同看见腐烂的食物,闻起来也有一股坏味道。 大多数人写的代码不能被称为好代码有两个原因,一是由于自身技能限制,二是很可能他们根本就分不清好代码和坏代码的区别。 本文,笔者将结合日常编码实践,与大家分享一下 常见的代码坏味道。 Long Method(过长函数) 过长函数,简而言之就是函数长度超标了,包括横向和纵向。 为什么过长函数是一种坏味道? 横向过长会导致无法一眼就能看出这行代码的作用 ,需要用鼠标慢慢往后边拖,相信用小屏幕的小伙伴经常会遇到这个问题,拖动的过程会严重影响读代码的效率。 纵向过长其实就是出现了大函数,一个函数的行太多,使得函数难以读懂,代码修改难度大。 那么如何解决过长函数问题呢? 关于横向过长的问题, 一般会在 IDE 中提前配置好最大宽度 ,比如80字符或者120字符(具体根据公司内部规范设置),然后格式化代码即可解决。 比如我们在写 Java8 stream链式表达式的时候可以会很长: List<String> nodes = list.stream().filter()

对象及原型

岁酱吖の 提交于 2020-12-18 13:08:24
目录 创建对象 字面量 创建对象 new Object() 创建对象 获取、设置对象属性 obj.key 获取/设置obj的key属性的值value obj['key'] 获取/设置obj的key属性的值value key in obj 判断obj中是否有属性key delete obj.key 删除obj的key属性 批量创建对象方法 工厂模式 构造函数 构造+原型 组合模式 全局函数调用 this指向 原型 原型链 new操作符的实现 面向过程 面向对象编程(oop) 面向对象 原型链继承 构造函数继承 组合继承 多态 闭包 创建对象 字面量 创建对象 var obj ={ key:value } new Object() 创建对象 var obj1 = new Object() 获取、设置对象属性 obj.key 获取/设置obj的key属性的值value obj1.key / obj1.key=value obj[‘key’] 获取/设置obj的key属性的值value obj['key'] / obj['key']=value key in obj 判断obj中是否有属性key key in obj delete obj.key 删除obj的key属性 delete obj.key 批量创建对象方法 工厂模式 //优点 生成独立的新对象 //缺点 代码重复 没有从属性

【java设计模式】-00目录

混江龙づ霸主 提交于 2020-12-18 08:45:00
开篇 【java设计模式】-01设计模式简介 创建型模式: 【java设计模式】-02工厂模式(Factory Pattern) 【java设计模式】-03抽象工厂模式(Abstract Factory Pattern) 【java设计模式】-04单例模式(Singleton Pattern) 【java设计模式】-05建造者模式(Builder Pattern) 【java设计模式】-06原型模式(Prototype Pattern) 结构型模式: 【java设计模式】-07适配器模式(Adapter Pattern) 【java设计模式】-08桥接模式(Bridge Pattern) 【java设计模式】-09组合模式(Composite Pattern) 【java设计模式】-10装饰器模式(Decorator Pattern) 【java设计模式】-11外观模式(Facade Pattern) 【java设计模式】-12享元模式(Flyweight Pattern) 【java设计模式】-13代理模式(Proxy Pattern) 行为型模式: 【java设计模式】-14责任链模式(Chain of Responsibility Pattern) 【java设计模式】-15命令模式(Command Pattern) 【java设计模式】-16解释器模式

腾讯C++后台开发面试笔试知识点参考笔记

痴心易碎 提交于 2020-12-18 07:53:22
文章是由我笔试面试腾讯笔记整理而来,主要是针对面试的C++后台开发岗位,涵盖了大部分C++后台开发相关可能会考察和被问到的技术点。 自认为这篇笔记是比较全面的总结,不管你是已经工作准备参加社招,还是在校学生准备参加校招,笔记都可以作为技术面试准备阶段参考查阅,查缺补漏。 笔记是基础C++知识点总结,没有过多的阐述后台开发的系统架构和分布式后台服务设计相关,还有c++11新特性,这些笔试面试也会被问到但不在这篇讨论范围,可以关注我后面有时间再补上。 阅读提示 文章约12839字,阅读时长预计33分钟。建议关注收藏方便回头查阅。 gdb调试命令 step和next的区别? 当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数. 查看内存 (gdb)p &a //打印变量地址 (gdb)x 0xbffff543 //查看内存单元内变量 0xbffff543: 0x12345678 (gdb) x /4xb 0xbffff543 //单字节查看4个内存单元变量的值 0xbffff543: 0x78 0x56 0x34 0x12 多线程调试 (gdb) info threads:查看GDB当前调试的程序的各个线程的相关信息 (gdb) thread threadno:切换当前线程到由threadno指定的线程 break filename:linenum

深入理解设计模式(22):享元模式

六眼飞鱼酱① 提交于 2020-12-18 02:45:51
一、引言 大家都知道 单例模式 ,通过一个全局变量来避免重复创建对象而产生的消耗,若系统存在大量的相似对象时,又该如何处理?参照单例模式,可通过对象池缓存可共享的对象,避免创建多对象,尽可能减少内存的使用,提升性能,防止内存溢出。 在软件开发过程,如果我们 需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况 ,这样的问题是非常严重,然而享元模式可以解决这个问题,下面具体看看享元模式是如何去解决这个问题的。 二、什么是享元模式 定义: 共享元对象,运用共享技术有效地支持大量细粒度对象的复用。如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象。 享元模式是为数不多的、只为提升系统性能而生的设计模式,主要作用就是复用大对象(重量级对象),以节省内存空间和对象创建时间。   面向对象可以非常方便的解决一些扩展性的问题,但是在这个过程中系统务必会产生一些类或者对象,如果系统中存在对象的个数过多时,将会导致系统的性能下降。对于这样的问题解决最简单直接的办法就是减少系统中对象的个数。享元模式提供了一种解决方案,使用共享技术实现相同或者相似对象的重用。也就是说实现相同或者相似对象的代码共享。 所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用

9年技术面试官讲解:计算机专业应届生怎样写简历

ぃ、小莉子 提交于 2020-12-17 19:29:56
本人作为面试官,也有过校招经历。在这过程中,发现有些毕业生同学的简历无法证明自己能胜任程序员的工作,甚至也没有面试价值。同时,本人也见识了不少“一看就想留下”的简历。在本文里,就将用正反两方面的实例,告诉广大计算机专业的毕业生朋友,简历该怎么写。 1、得不到面试机会的简历长什么样? 先来看份简历,其中的问题比较典型,在其中没有面试官感兴趣的内容。 可能这份简历比较夸张,但有不少简历或多或少会出现类似的问题。 第一个问题,缺乏商业项目开发经验的描述。换位思考下,公司要的人,最好有实际项目经验,对毕业生而言,这块标准可以降低为“具有一定的编程能力”,在这份简历中,能给出的这方面证据不多,虽然介绍了得到的计算机证书,也有给出了编程获奖经历,甚至也介绍了毕业设计,但从面试官角度来看,很缺乏实际商业项目经验。如果这批收到的简历中,大多数简历都这样,都没有包含实际的商业项目经验,或许这份简历还能凭借编程获奖等亮点得到面试机会。相反,如果这份简历的主人学校一般,而且还是专科,那么恐怕很难得到面试机会。 第二个问题,亮点不直接,且缺乏客观证据。比如这份简历中,通过获奖情况来说明自己编程能力强,通过大学课程来介绍自己的能力,这些点都不直接,而且口说无凭。在简历筛选阶段,面试官要在短时间内阅读大量简历,像这类简历,不能直接让面试官留下深刻印象,那么恐怕很难得到面试机会。 第三个问题,喧宾夺主

C#设计模式之十一享元模式(Flyweight Pattern)【结构型】

試著忘記壹切 提交于 2020-12-17 08:12:11
原文: C#设计模式之十一享元模式(Flyweight Pattern)【结构型】 一、引言 今天我们要讲【结构型】设计模式的第六个模式,该模式是【享元模式】,英文名称是:Flyweight Pattern。还是老套路,先从名字上来看看。“享元”是不是可以这样理解,共享“单元”,单元是什么呢,举例说明,对于图形而言就是图元,对于英文来说就只26个英文字母,对于汉语来说就是每个汉字,也可以这样理解“元”,构成事物的最小单元,这些单元如果大量、且重复出现,可以缓存重复出现的单元,达到节省内存的目的,换句说法就是享元是为了节省空间,对于计算机而言就是内存。面向对象很好地解决了系统抽象性的问题(系统抽象性指把系统里面的事物写成类,类可以实例化成为对象,用对象和对象之间的关系来设计系统),在大多数情况下,这样做是不会损及系统的性能的。但是,在某些特殊的应用中,由于对象的数量太大,并且这些大量的对象中有很多是重复的,如果每个对象都单独的创建(C#的语法是new)出来,会给系统带来难以承受的内存开销。比如图形应用中的图元等对象、字处理应用中的字符对象等。 二、享元模式的详细介绍 2.1、动机(Motivate) 在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时

vi或者vim编辑器的最基本的命令

≯℡__Kan透↙ 提交于 2020-12-17 00:07:00
TOMORROW 星辰 , 版权所有丨如未注明 , 均为原创丨本网站采用 BY-NC-SA 协议进行授权 转载请注明原文链接: vi 或者 vim 编辑器的简单操作方法 vim 是由 vi 发展而来的,基本操作都是通用的。 Linux 操作系统一般都会默认安装vi 编辑器,简单而强大。 现在来简单说说 vi 编辑器的基本操作,这是最简单最精简的教程了,特别适合新手,或者是临时需要用到vi 编辑器的人看。 首先,vi 编辑器有两种模式,一种是命令模式;一种是编辑模式。在刚打开 vi 编辑器的时候,默认是处于命令模式。 编辑模式下,就是可以随意编辑文本;在命令模式下可以执行各种命令和快捷键操作。 比如在命令模式下,按键 i ,表示在当前光标处插入文本(进入到编辑模式),通过按键 ESC 可以回到命令模式。 以下是每次打开 vi 编辑几乎必须用到的几个快捷键: i--------当前位置插入 h-------表示光标向左移动 l-------表示光标向右移动 j-------表示光标向下移动 k-------表示光标向上移动 x-------表示删除当前字符 dd------表示删除当前行 通过输入:来执行命令,如 :wq 命令会出现在窗口左下方,输完之后需要回车,wq 命令就是保存(write)并且退出(quit)的意思。 也可以只退出不保存 :q 懂得以上操作就可以使用 vi

CTO 写的代码,真是绝了

无人久伴 提交于 2020-12-16 22:16:10
作者:聚IT 来源:touyatoutiao.com/i6847406631983153672 场景:当我们接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,头条),不同渠道所需的处理方式不同,下面我们写一个简单Demo来实现该的场景。 解决思路 1、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法process(),不同的渠道都需要实现该抽象方法。 public abstract class GeneralChannelRule { public abstract void process(); } 2、编写一个腾讯的规则类,定义具体对于腾讯渠道数据的处理逻辑 public class TencentChannelRule extends GeneralChannelRule @Override public void process () { // Tencent处理逻辑 } } 3、编写一个头条的规则类,定义具体对于头条数据的处理逻辑 public class TouTiaoChannelRule extends GeneralChannelRule @Override public void process () { // TouTiao处理逻辑 } } 4、建立一个简单的枚举类 public enum

Struts2和SpringMVC的区别

天大地大妈咪最大 提交于 2020-12-16 15:37:50
struts2和springmvc的区别 一、拦截机制的不同    Struts2是类级别的拦截 ,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter吧request数据注入到属性。Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。    SpringMVC是方法级别的拦截 ,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。   Struts2有自己的拦截Interceptor机制