首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【笔记】《重构: 改善既有代码设计》

, 先写一个新函数, 然后将其用旧函数包装可以避免一些接口修改问题 临时变量只属于函数本身, 容易助长冗长函数, 且我们容易忘记临时变量跟踪导致一些意外错误计算 用函数调用消除临时变量可以让程序更直观...依赖统计和性能度量大大优化来重构效果 3 代码坏味道 3.1 重复代码 如果项目内多个地方看到了相同代码, 那就想办法将其合为一 3.2 过长函数 多对大函数进行分解, 每当需要长注释时候就应该将所需分段进行包装了...因此可以包装一个足够全面的参数, 然后让目标函数自己从参数对象中获取自己需要参数 但是有时候不希望两个对象由于大量和互相使用而耦合, 那种时候还是需要适当提炼为函数, 但是还是要保持参数列别太长 3.5..., 但是需要接管原构造, 在原构造后则只能通过逐元素拷贝构造来实现副本, 而包装能做到事情更多, 用户应该能够自然地将包装当作原使用....如果两个函数相似但不相同, 则可以试着用模板来优化并提取 11.3 构造函数本体上移 只在子类中保留构造函数有区别的部分, 然后主体通过调用基构造来实现 11.4 函数下移 11.2反面, 主要是当一些子类完全用不到某个操作时下移

1.5K20

【小知识】小例子说明Spring核心思想之一:控制反转。

装饰设计模式(也即包装设计模式) 口诀:     1、编写一个,实现包装相同接口。...(若重写方法时候,还需要用到其他对象,那我们就在构造方法中继续注入即可)     5、对于不需要改写方法,使用包装对象调用原有的方法。   ...,使用包装对象调用原有的方法。...口诀:     1、编写一个,实现包装相同接口。(这样他们就具备了相同行为)     2、定义一个被包装类型变量,即引用,用于接收被包装对象。     ...3、定义构造方法,把被包装对象注入,给被包装变量赋值。(因为后面我要用该包装对象,所以要注入进来)     4、对于不需要改写方法,使用包装对象调用原有的方法。

52910
您找到你想要的搜索结果了吗?
是的
没有找到

【C++】C++11中常见语法(下)

算法,都要重新去写一个,如果每次比较逻辑不一样,还要去实现多个,特别是相同命名,这些都给编程者带来了极大不便。...函数对象 lambda 表达式 函数对象,又称为仿函数,即可以像函数一样使用对象,就是在中重载了 operator() 运算符对象。...三、包装 1. function 包装 function 包装 也叫作适配器,C++ 中 function 本质是一个模板,也是一个包装。 要学包装,首先需要知道包装包装是什么?...其实包装包装是可调用对象,目前我们学习到可调用对象有:函数指针、仿函数、lambda,我们要学包装就是要包装它们三个中任意一个。....)>; 模板参数说明: Ret: 被调用函数返回类型 Args…:被调用函数形参 下面我们来简单使用一下包装包装可调用对象,假设我们需要包装一个实现两个数交换可调用对象

7810

Java-包装

参考链接: Java包装有的基本类型都有一个之对应,这些称为包装。对象包装是不可改变,即一旦构造包装,就不允许更改包装在其中值。...s表示整数数值进行初始化后新Integer对象Integer(int value)Integer构造函数Integer(String s)Integer构造函数,将字符串s表示整数数值赋值给...value(默认为10进制)  包装  每个包装都有两个构造函数:  Type(type value);//以基本类型为参数构造包转 Type(String value);//将字符串转换为相应包装类型...+基本类型(包转类型)字符串向数值类型转换     通过包转构造函数通过包装valueOf(String s) 返回一个包装通过包转静态方法 parseType()(Type为相应基本类型...- 当使用== 进行比较时候,如果== 两边都是包装类型,那么比较将是引用地址是否相同;如果其中一边为包装类型,另一边是基本类型,那么包装类型先自动拆箱为基本类型,那么将是两个基本类型之间比较

57720

绝对干货 | Kotlin内联工作原理及使用案例,看完你会回来谢我

这正是Kotlin中内联一大卖点:内联时,除非绝对必要,否则本身不会在字节码中使用。内联大大减少了运行时空间开销。 运行时 在运行时,可以将内联表示为包装类型和基础类型。...除了一些显而易见东西,例如value字段及其getter之外,构造函数是私有的,而新对象将通过Constructor_impl创建,该对象实际上并不使用包装类型,而仅返回传入基础类型。...尽管使用了静态builder_impl函数,它只是返回一个int值,然后将其传递给take函数,该函数也对我们最初在源代码中拥有的内联类型一无所知。...为了解决这个问题,您可能会创建一个包装类型,或者使用有的Pair从该函数返回一对值。这些方法虽然显然会分配额外空间,但仍然是有效,在特殊情况下应避免使用。内联可以帮助您。...() = jacksonObjectMapper().readValue(this.value) 当我们引入用于保存JSON数据字符串包装并相应地将扩展名更改为使用JsonString接收

1.3K30

绝对干货 | Kotlin内联工作原理及使用案例,看完你会回来谢我

这正是Kotlin中内联一大卖点:内联时,除非绝对必要,否则本身不会在字节码中使用。内联大大减少了运行时空间开销。 运行时 在运行时,可以将内联表示为包装类型和基础类型。...除了一些显而易见东西,例如value字段及其getter之外,构造函数是私有的,而新对象将通过Constructor_impl创建,该对象实际上并不使用包装类型,而仅返回传入基础类型。...尽管使用了静态builder_impl函数,它只是返回一个int值,然后将其传递给take函数,该函数也对我们最初在源代码中拥有的内联类型一无所知。...为了解决这个问题,您可能会创建一个包装类型,或者使用有的Pair从该函数返回一对值。这些方法虽然显然会分配额外空间,但仍然是有效,在特殊情况下应避免使用。内联可以帮助您。...() = jacksonObjectMapper().readValue(this.value) 当我们引入用于保存JSON数据字符串包装并相应地将扩展名更改为使用JsonString接收

56620

SWIG 官方文档第二部分 - 机翻中文人肉修正

C++ 编译构造,不能从包装中轻松访问,因为它们旨在用于使用特殊std::initializer_list 类型编译时初始化。...,例如,在 Python 中,以下将调用带有 std::vector构造函数: Python>>> c = Container( [1, 2, 3, 4] ) 如果您无法修改被包装,请考虑忽略初始化列表构造函数使用...默认函数包装当然可以在目标语言中使用。显式默认函数对 SWIG 包装没有直接影响,因为声明处理方式 SWIG 解析任何其他方法声明非常相似。 删除函数还旨在防止调用函数时进行隐式转换。...如果目标语言不支持代理,则使用此宏将生成 %pointer_functions() 宏相同示例函数。 应该注意是,接口确实引入了一个新对象或将一个指针包裹在一个特殊结构中。...然而,参数转换细节和暴露给解释公共 API 各不相同。 9.4.3 STL 异常 许多 STL 包装函数添加了参数检查,如果值无效,将抛出依赖于语言错误/异常。经典例子是数组边界检查。

2.2K20

Java学习笔记(三)——和对象

构造方法可以在实例化过程中做一些初始化工作。 构造方法名称必须名称相同,并且没有返回值。 每个都有构造方法。...如果没有显式地为定义构造方法,Java编译将会为该类提供一个默认构造方法。 说明: 构造方法不能被显示调用。 构造方法不能有返回值,因为没有变量来接收返回值。...Java程序main() 方法必须设置成公有的,否则,Java解释将不能运行该类。...级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以 C/C++ 中 static 变量对比学习。...t.test1(); } } this关键字 this 关键字用来表示当前对象本身,或当前一个实例,通过 this 可以调用本对象所有方法和属性。

47510

【C++】C++11 新特性

,使其 可用于所有的内置类型和自定义类型 初始值设定,即通过初始化列表初始化 (注意和构造函数初始化列表进行区分),并且在使用初始化列表初始化时,可以省略赋值符号 = 。...(STL 中所有容器都重载了参数类型为 initializer_list 构造和赋值函数,但是不包括容器适配器,因为容器适配器本身不是一个容器,其只是对容器封装) ---- 四、变量类型推导 1、...---- 十一、可变参数模板 1、可变参数模板语法 在C语言中我们使用 … 来表示可变参数,比如 printf 和 scanf 函数,C++ 中沿用了这个用法: 可变参数模板形式 但 C++ 也...---- 2、lambda 表达式函数对象 lambda 表达式和仿函数一样,本质上也是一个可调用函数对象,所以 lambda 表达式使用方式和仿函数完全相同;但和仿函数不同是,lambda 表达式类型是由编译自动生成...function 是一个可调用对象包装,可它以将函数指针、仿函数以及 lambda 表达式、成员函数等可调用对象进行包装,使他们具有相同类型,包装也可以像普通函数一样进行调用,包装本质还是仿函数

1.3K10

Kotlin Vocabulary | 内联 inline class

有参构造函数是私有的,第二个构造函数名字中包含了一个 "-",其在 Java 中为无效字符。这意味着无法从 Java 实例化内联。...覆盖使用原生类型和内联作为参数函数 定义一个方法时,Kotlin 编译允许使用原生类型和不可空内联作为参数: fun pet(doggoId: Long) {} fun pet(doggoId:...为了实现此功能,Kotlin 编译会改写函数名称,并使用内联作为函数参数。 在 Java 中使用内联 我们已经讲过,不能在 Java 中实例化内联。那可不可以使用呢?...这意味着未来,不熟悉这段代码开发者,也没法像在数据中那样,可以给构造函数添加参数,从而导致复杂度被错误地增加。...它是否会发布正式版,以及正式版发布时,它实现是否现在相同,都还是未知数。 因此,既然您了解了内联好处和限制,就可以在是否以及何时使用它们问题上做出明智决定。

64630

Kotlin Vocabulary | 内联 inline class

有参构造函数是私有的,第二个构造函数名字中包含了一个 "-",其在 Java 中为无效字符。这意味着无法从 Java 实例化内联。...覆盖使用原生类型和内联作为参数函数 定义一个方法时,Kotlin 编译允许使用原生类型和不可空内联作为参数: fun pet(doggoId: Long) {} fun pet(doggoId:...为了实现此功能,Kotlin 编译会改写函数名称,并使用内联作为函数参数。 在 Java 中使用内联 我们已经讲过,不能在 Java 中实例化内联。那可不可以使用呢?...这意味着未来,不熟悉这段代码开发者,也没法像在数据中那样,可以给构造函数添加参数,从而导致复杂度被错误地增加。...它是否会发布正式版,以及正式版发布时,它实现是否现在相同,都还是未知数。 因此,既然您了解了内联好处和限制,就可以在是否以及何时使用它们问题上做出明智决定。

11610

JavaScript 模式》读书笔记(3)— 字面量和构造函数3

构造函数方式思考。...也就是说,如果在一个循环中创建了相同正则表达式,那么后面返回对象前面创建对象相同,并且所有的属性都将被设置为第一次值。这种行为已经在ES5中得到了改变,并且字面量会创建新对象。   ...最后要说明是,调用RegExp()时不使用new行为使用new行为时相同。 七、基本值类型包装 JavaScript有五个基本值类型:数字、字符串、布尔、null和undefined。...(3,6); // "key" // 数值方法相同 (22 / 7).toPrecision(3); // "3.14"   由于基本值类型也可以充当对象,只要需要它们这样做,不过通常并没有理由去使用更为冗长包装构造函数...当使用时没有带new操作符时,包装构造函数将传递给它们参数转换成一个基本类型值: typeof Number(1);// 输出“number” typeof Number("1");// 输出“number

61020

C++11『lambda表达式 ‖ 线程库 ‖ 包装

线程安全 问题 首先要明白 线程拥有自己独立栈结构,但对于全局变量等 临界资源,是直接被多个线程共享 如果想给线程回调函数传递 左值引用 类型参数,需要使用 ref 引用包装函数进行包装传递...线程库中还有一个 future ,用于 异步编程和数据共享,并不是很常用,这里就不作介绍,使用细节可以看看这篇文章 《C++11中std::future使用》 3.包装 包装 属于 适配器...根据给出指令,调用对应函数 function 包装 还可以用在刷题中,比如下面这道题目中,就可以使用 包装 在 运算符 具体操作 之间建立映射关系,使用起来十分方便 150....绑定普通参数显得没意思,bind 绑定 参数个数用在 成员函数 上才舒服,比如对之前 function 包装 包装 成员函数 代码进行优化,直接把 对象 这个参数绑定,调用时就不需要手动传递...,但实际调用时,仍然需要传递对应函数参数,否则无法进行函数匹配调用,当然实际传入参数是绑定值,这里传参只是为了进行匹配;并且如果不对对象进行绑定,需要更改包装类型,调用时也需要传入参数进行匹配

29010

《JavaScript 模式》读书笔记(3)— 字面量和构造函数3

构造函数方式思考。...也就是说,如果在一个循环中创建了相同正则表达式,那么后面返回对象前面创建对象相同,并且所有的属性都将被设置为第一次值。这种行为已经在ES5中得到了改变,并且字面量会创建新对象。   ...最后要说明是,调用RegExp()时不使用new行为使用new行为时相同。 七、基本值类型包装 JavaScript有五个基本值类型:数字、字符串、布尔、null和undefined。...(3,6); // "key" // 数值方法相同 (22 / 7).toPrecision(3); // "3.14"   由于基本值类型也可以充当对象,只要需要它们这样做,不过通常并没有理由去使用更为冗长包装构造函数...当使用时没有带new操作符时,包装构造函数将传递给它们参数转换成一个基本类型值: typeof Number(1);// 输出“number” typeof Number("1");// 输出“number

51840

C++11特性大杂烩

,main函数里实现了两个Rate中仿函数成员相同作用lambda表达式,分别是r2和r3。...构造+移动构造优化成构造,稍稍减少了一些消耗。但对于只有浅拷贝构造+浅拷贝优化成构造,效率大大提升。图片图片包装这里介绍是function包装。function包装 也叫作适配器。...;模板处需要传递名称(传递this指针);调用处需要传递匿名对象。下面是对function包装使用。可以看到这里有一个useF模板函数参数是两个模板参数。...图片然而这三者返回值类型相同(都是double),传递给useF函数参数个数相同,形参类型相同,那么这里可以用包装对这三个对象进行包装,然后通过function对象对这三者进行传参调用,这样就只会实例化出来一份...但只要是通过包装调用中成员函数就需要传递Sub()匿名对象。可以通过bind把Sub()匿名对象这个参数绑定在表达式中,后续参数不用传。

88250

iOS小技能:装箱和拆箱(boxing、unboxing)​

引言 get 和post 布尔值参数处理( 使用NSNumber 传BOOL值) 全局const常量代替宏常量,节省内存空间。 敏感逻辑保护: 把函数名隐藏在结构体里,以函数指针成员形式存储。...编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛 I 装箱和拆箱 1.1 Java包装 Java包装(装箱和拆箱) 全部被final修饰,顺便提一下,java.lang.Math,...System,String也被final修饰 包装使用面向对象思想把简单数据类型封装成 特点 包装把简单数据类型包装。...注:简单数据类型不是使用简单数据类型主要为了提高代码运行效率 装箱和拆箱把简单数据类型包装成对应包装称为boxing(示例:Integer i=1;将1包装成Integer再使用Object引用...而bool表示0是false,所以非0是true; 2.1 NSCFBoolean NSCFBoolean是NSNumber簇中一个私有的,它是通往CFBooleanRef类型桥梁。

54510

SWIG 官方文档第四部分 - 机翻中文人肉修正

.); ... } 考虑到有可能让自己陷入困境,创建可变参数 C++ 成员函数完全通用包装相比,重新考虑您设计或使用辅助函数提供替代接口可能更容易。...首先,该示例结构方式试图在特定于包装信息和函数本身声明之间保持分离。...友元函数 ' name ' 被忽略。 • 511. 不能对重载函数使用关键字参数。 • 512. 重载方法声明被忽略,使用非常量方法声明代替。 • 513. 无法为未命名结构/生成包装。...请参阅 Lua 手册以确定您平台是否支持它。为了编译动态加载模块,可以使用相同包装。...选择模块名称时,请确保不要使用内置 Lua 命令或标准模块名称相同名称。 28.3.2 功能 全局函数包装为新 Lua 内置函数

5.3K40

C++11(下篇)

新功能 默认成员函数 在以前C++中,有6个默认成员函数构造函数 析构函数 拷贝构造函数 拷贝赋值重载 取地址重载 const 取地址重载 比较重要是前4个,后两个用处并不大,默认成员函数就是我们不写编译会生成一个默认...mutable :默认情况下,lambda函数总是一个const函数,mutable可以取消常量性,使用该修饰符时,不能省略() 返回值类型:常规函数一样,可以省略 函数体:除了使用参数外,还可以使用捕捉变量...C++中function本质是一个模板,也是一个包装。为什么需要function呢?...我们上包装: function包装器用法 function在在头文件 模板参数说明: Ret: 被调用函数返回类型 Args…:被调用函数形参 我们改造上面的程序...普通成员函数包装又有了新问题,同样以上方代码为例,两个功能类似的函数包装确不一样,这个可以解决吗?

63110

【笔记】C++标准库: 体系结构内核分析(上)

可重复集合, 理解为valuekey相同map 关联型 map 红黑树 1. 不允许重复, 插入重复数据会报错, 可以使用下标插入法x[key]=value 关联型 set 红黑树 1....实例化模板时必须知名模板参数类型, 因为实例化模板对于编译来说没有任何可供推理线索 模板函数: 和模板相近, 在函数定义之前加template, 区别在于由于函数参数独一性...但对于模板模板函数, 使用时则需要提供对应模板模板参数, 然后函数自己模板实参由编译自动推导. 在外定义时候需要提供两个模板标识符....全特化是在定义了普通泛化模板之后, 额外写一个相同模板定义但是指明所有模板参数类型, 只保留空template....偏特化是介于泛化和全特化之间状态, 其只指明了模板参数列表中某几个类型或者缩小类型本身数据范围(任何类型(T), 仅限指针类型(T*), 仅限指向常量指针类型(const T*)), 例如template

1.1K30

【JavaSE学习】 Day5JavaSE面向对象(中)看这三篇就够了

关键字 super调用属性、方法 super调用构造 四、子类对象实例化全过程 继承性 从过程上看 强调说明  五、面向对象之多态性 何为多态性 多态性使用:虚拟方法调用 多态性应用举例 关于向上转型向下转型...super调用构造 我们可以在子类构造中显式使用"super(形参列表)"方式,调用父中声明指定构造 "super(形参列表)"使用,必须声明在子类构造首行!  ...:super() 在多个构造中,至少一个构造使用了"super(形参列表)",调用父构造 四、子类对象实例化全过程 理解即可。...只适用于方法,不适用于属性(编译和运行都看左边) 关于向上转型向下转型 向上转型:多态 向下转型: 为什么使用向下转型:有了对象多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类型...基本数据类型对应包装 需要掌握类型间转换(基本数据类型、包装、String) 简易版: 基本数据类型包装:JDK 5.0 新特性:自动装箱 自动拆箱 基本数据类型、包装

64220
领券