<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[beyongwang的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/beyongwang</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; beyongwang]]></copyright><item><title><![CDATA[[读书笔记] 重构改善既有代码的设计（5）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/71189459</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/71189459</guid><author>beyongwang</author><pubDate>Thu, 04 May 2017 22:09:00 +0800</pubDate><description><![CDATA[继续整理下第七章的内容， 关于对象属性的迁移。1. 迁移函数当某个函数与其不所属类有着更密切的关系时，考虑把该函数移到新类中，在新类中建立一个有着类似行为的函数，移除就函数，或者将旧函数变成一个单纯的委托函数。这样做的目的是减少类间的耦合，保证类更简单。2. 迁移字段跟第一条类似，如果类的某个成员被另一个类更加频繁的使用，则考虑移到另一个类中，注意这里的使用不一定是直接使用，也有可能是通过取值设值函]]></description><category></category></item><item><title><![CDATA[[读书笔记] 重构改善既有代码的设计（4）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/70880215</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/70880215</guid><author>beyongwang</author><pubDate>Thu, 27 Apr 2017 21:47:03 +0800</pubDate><description><![CDATA[最近比较忙，偷闲整理下第六章的内容，关于重新组织函数的内容。1. 提炼函数比较简单但又很常用的手法，目的是把一段逻辑上紧密联系构成相对独立功能块的代码封装起来，通过函数名字清晰的表达其用途，这样潜在的提供了其他模块复用该函数的概率，同时也更加易于维护，因为原来嵌在一大段逻辑中的代码被抽离出来了，对其修改不必在去关系大范围的影响。实施这个重构手法时要注意涉及的上下文变量，可以通过参数，返回值，甚至是添]]></description><category></category></item><item><title><![CDATA[[读书笔记] 重构改善既有代码的设计（3）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/69213701</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/69213701</guid><author>beyongwang</author><pubDate>Tue, 04 Apr 2017 21:29:36 +0800</pubDate><description><![CDATA[继续整理本书的内容。第四章：构建测试体系。关于测试体系的几条参考准则： 
1. 确保所有的测试都完全自动化，让他们检查自己的测试结果。 
2. 一套测试就是一个很强大的bug侦测器，能够大大的缩减查找bug所需的时间。 
3. 频繁的运行测试，每次编译请把测试也考虑进去，至少每天执行一遍每一个测试。 
4. 每当收到bug报告，请先写一个单元测试来暴露bug。 
5. 编写未臻完善的测试并实际运行，]]></description><category></category></item><item><title><![CDATA[[读书笔记] 重构改善既有代码的设计（2）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/57501485</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/57501485</guid><author>beyongwang</author><pubDate>Sun, 26 Feb 2017 21:41:02 +0800</pubDate><description><![CDATA[整理第三章的内容，关于代码的坏味道，这些往往也是可以进行重构的信号。 
1. 重复代码。这个是非常常见的代码结构问题，这样的代码问题也很明显：难以维护，重复代码意味着当一份代码改动时，另一份也必须做出相应的改动，否则就会出现不一致的问题。这种情况应该提取共同代码。 
2. 过长函数。函数过长意味着函数很复杂，处理了好多内容，违背单一职责，同时，程序愈长愈时难以理解，也很难为其起一个合适的可以表其意的]]></description><category></category></item><item><title><![CDATA[[读书笔记] 重构改善既有代码的设计（1）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/54577464</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/54577464</guid><author>beyongwang</author><pubDate>Mon, 16 Jan 2017 21:09:04 +0800</pubDate><description><![CDATA[《重构：改善既有代码的设计》已经读了一大半了，书中讲了很多的重构手段和指导原则，但整体感受下来，重构的一个主要目的就是消除重复，放眼看去，众多的重构手段都是在消除重复代码，提炼函数，提炼父类等等。 
之后会针对每一章，整理一下读书笔记，方便之后参阅。第一章：重构，第一个案例着一章主要是起到入门的作用，以一个不是很复杂的例子，一步步演示可以进行哪些重构，也用到了后面章节提到的部分重构手段，但是主要目的]]></description><category></category></item><item><title><![CDATA[C++11/14新特性快速概览]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/54348717</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/54348717</guid><author>beyongwang</author><pubDate>Wed, 11 Jan 2017 21:53:35 +0800</pubDate><description><![CDATA[推荐几篇关于C++11/14新特性的文章，是一个系列的，可以快速了解那些新特性，并配有简单移动的代码示例： 
1. 关于初始化列表的，例如使用形如{1, 2, 3, 4, 5}为以前并不支持此种初始化方法的结构初始化，例如：std::vector等等。 
http://www.bogotobogo.com/cplusplus/C11/C11_initializer_list.php 
2. 更统一的]]></description><category></category></item><item><title><![CDATA[C++11 reference collapsing and perfect forward (引用折叠以及完美转发)]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/54025439</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/54025439</guid><author>beyongwang</author><pubDate>Wed, 04 Jan 2017 22:54:18 +0800</pubDate><description><![CDATA[引用折叠原则和完美转发是有联系的，可以说后者是基于前者的某些特性实现的，具体来看一下。 
要理解完美转发，需要了解两个知识点： 
1. 引用折叠原则（Reference collapsing rules）。 
2. 右值函数模版参数类型推导（Template argument deduction）先看引用折叠。所谓引用折叠或者崩塌（collapse）既为当引用指向引用的时候，这里的引用可以是左值也可]]></description><category></category></item><item><title><![CDATA[[读书笔记] 代码整洁之道（七）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53792007</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53792007</guid><author>beyongwang</author><pubDate>Wed, 21 Dec 2016 22:12:25 +0800</pubDate><description><![CDATA[琐事耽误，重新执笔。 
十四，十五，十六章的内容是针对特定的例子的讲解，不做笔记。第十七章 味道与启发本章主要给出了一些代码中的坏味道以及一些启发，同时也有对前几章的总结和归纳，关于纯代码方面还可以参考《重构：改善已有代码的设计》一书。 
整理几条个人认为比较容易忽略的。限制源文件中的语言数量由于不同的编程语言拥有不同的规则和格式，甚至是风格，而当他们混杂在一起时，很容易令人摸不着头脑，所以应该限制]]></description><category></category></item><item><title><![CDATA[[读书笔记] 代码整洁之道（六）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53457749</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53457749</guid><author>beyongwang</author><pubDate>Sun, 04 Dec 2016 23:14:09 +0800</pubDate><description><![CDATA[第十三章 并发编程并发编程或者说是多线程编程，可以有效的减少系统响应时间，增加系统吞吐量。 
一些关于编写并发软件的中肯说法： 
1. 并发会在性能和编写额外代码上增加一些开销。 
2. 正确的并发是复杂的，即便是对于简单问题也是如此。 
3. 并发缺陷并非总能重现，所以常被看作偶发事件而忽略，未被当作真的缺陷看待。 
4. 并发常常需要对设计策略的根本性修改。并发防御的原则
单一职责原则。要满足这]]></description><category></category></item><item><title><![CDATA[[读书笔记] 代码整洁之道（五）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53448950</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53448950</guid><author>beyongwang</author><pubDate>Sat, 03 Dec 2016 23:20:19 +0800</pubDate><description><![CDATA[继续整理本书本书的内容：第十一章 系统本章感觉更偏重Java语言本身，所以不做过多总结，总之，对于系统整体，可以通过运用合适的模式设计，保证系统的灵活性，引用部分原文的总结语：
  系统应该是整洁的。在所有的抽象层级上，意图都应该清晰可辨。无论是设计系统或单独的模块，别忘了使用大概可以工作的最简单方案。
第十二章 迭进有四条建议可以帮助我们创建具有良好设计的软件，让设计变得更“简单”： 
1. 运行]]></description><category></category></item><item><title><![CDATA[[读书笔记] 代码整洁之道（四）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53401960</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53401960</guid><author>beyongwang</author><pubDate>Tue, 29 Nov 2016 23:20:43 +0800</pubDate><description><![CDATA[继续整理本书的内容。第八章 边界本章主要讲了如何控制代码的边界，己方代码与第三方代码之间，不同模块之间，核心的思想是，要保证边界整洁，需要透彻的浏览和学习边界，对边界内容进行过载的测试也是值得的，同时，对于尚未完成的依赖边界，要大胆的预使用它们，这样可以保证即便依赖之物尚未存在，仍不会耽误什么，同时，一旦依赖准备就绪，只需要少量的适配工作就可以很快的投入联调之中，Google的mock测试框架就是基]]></description><category></category></item><item><title><![CDATA[[读书笔记] 代码整洁之道（三）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53365109</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53365109</guid><author>beyongwang</author><pubDate>Sun, 27 Nov 2016 16:19:24 +0800</pubDate><description><![CDATA[继续本书读书笔记的整理。第五章 格式本章主要讲了代码排版方面的一些建议，当然这些只是建议，毕竟代码格式方面的东西每个公司甚至各个团队之间都可能不一样。 
代码的格式说白了就是代码的风格，它跟代码的清晰度密切相关，代码可读性如何，很大程度上取决于代码的格式是否清晰。 
可以从代码的横向和纵向连两个方向来观察代码的格式。横向格式最明显的就是代码的缩进，缩进可以从视觉上把代码分层，例如：if(A)
{]]></description><category></category></item><item><title><![CDATA[[读书笔记] 代码整洁之道（二）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53313905</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53313905</guid><author>beyongwang</author><pubDate>Wed, 23 Nov 2016 23:18:19 +0800</pubDate><description><![CDATA[继续整理本书的笔记。第四章 注释天真的年代里，我们认为代码里的注释就犹如公式旁边的备注，必不可少，越多与好，越详细越有用，常常技术头头们会把代码要有详细注释放在编码规范的头几条，甚至会有规定所谓的代码注释比，即多少行代码要配上多少行注释，每次代码复查时，“注释不够啊” “注释不清晰啊”头头A语重心长的对初级码农说道。现实的年代里，真的是这样的吗？一小组的人加班加点，不是在改bug，也不是在加新fea]]></description><category></category></item><item><title><![CDATA[[读书笔记] 代码整洁之道（一）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53271445</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53271445</guid><author>beyongwang</author><pubDate>Tue, 22 Nov 2016 00:32:24 +0800</pubDate><description><![CDATA[最近读完了马丁的clean code，颇有收获，简单整理下读书笔记，虽然整书是以Java代码做代码示例，但语言无国界，特别是编程语言更是如此，不管你从事的是以何种语言为主的开发环境，我相信，从本书中都会有所发现，有所收获。 
全书总共17章，加上一个关于并发编程的附录，300多页的书，在面向程序员的书中，算不上厚。第一章 整洁代码本章主要是一个背景介绍和入门引导的作用，通过访问几个业界颇有建树的大师]]></description><category></category></item><item><title><![CDATA[C++ lambda表达式]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53152870</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53152870</guid><author>beyongwang</author><pubDate>Sun, 13 Nov 2016 22:22:08 +0800</pubDate><description><![CDATA[Lambda表达式是自C++11之后加入的新特性，是一种类似匿名函数的东西，看了一片微软官网的介绍，浅显易懂，特地转载过来： 
原文链接：https://msdn.microsoft.com/en-us/library/dd293608.aspxLambda Expressions in C++In C++11, a lambda expression—often called a lambda—i]]></description><category></category></item><item><title><![CDATA[C++中如何通过无成员变量的空类存储数据]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53092590</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53092590</guid><author>beyongwang</author><pubDate>Wed, 09 Nov 2016 00:28:43 +0800</pubDate><description><![CDATA[最近看到一个比较有意思的存储数据的方法，使用了类，但是不是使用成员变量来存储，所以称为假类（Fake Class）模式，觉得思路挺有意思的，拿来分享一下。整体思路思路比较独特，我们都知道类中如果没有成员变量，没有虚函数，也不是虚拟继承而来的子类，只有非虚成员函数，那么该类可以认为是个空类，也就是类的大小为0（此类型的类在实际编译器中大小一般为1，是为了唯一标识对象之用）。既然没有成员变量又该如何存储]]></description><category></category></item><item><title><![CDATA[关于错误map/set iterator not incrementable]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53074704</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53074704</guid><author>beyongwang</author><pubDate>Mon, 07 Nov 2016 23:54:44 +0800</pubDate><description><![CDATA[今天Debug代码时，碰到一个关于迭代器的崩溃错误（仅限Debug模式，release会被容错）：map/set iterator not incrementable，相关代码如下（仅演示思路代码）：//pretypedef
typedef std::multimap<int, int>::iterator multimapIterator;
typedef std::pair<multimapIt]]></description><category></category></item><item><title><![CDATA[[读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端（下）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/53002689</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/53002689</guid><author>beyongwang</author><pubDate>Tue, 01 Nov 2016 23:51:02 +0800</pubDate><description><![CDATA[整理本系列笔记的最后一篇，关于运行时类型信息（RTTI）。保证安全的向下转型向下类型转换：是指由父类向子类的类型转换，由于父类信息少于子类，所以通常来说，没有特殊机制支持的话，这种转换是不安全的，要支持此机制的话，在空间和时间上都需要额外的负担： 
1. 空间上，需要额外的空间存储类型信息，通常是一个指针，指向某个类型信息节点。 
2. 时间上，需要额外的时间，已决定执行期的类型。 
一种主流的策略]]></description><category></category></item><item><title><![CDATA[[读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端（中）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/52938770</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/52938770</guid><author>beyongwang</author><pubDate>Wed, 26 Oct 2016 22:00:37 +0800</pubDate><description><![CDATA[继续整理最后一章的内容，这一篇是关于异常处理的。注：初学markDown，所得尚少，排版简陋，多多包涵欲支持异常处理，编译器的主要工作是找出catch子句，追踪程序堆栈中每一个函数的当前作用域，编译器必须提供某种查询异常对象的方法，以知道其实际类型（RTTI来源），最后，编译器还需要某种机制管理被丢出的对象，包括其产生，存储，析构，清理。C++异常处理语法由三部分组成： 
1. throw，抛出异常]]></description><category></category></item><item><title><![CDATA[解析C++中的new、operator new、operator new[]和delete、operator delete、operator delete[]（下）]]></title><link>https://blog.youkuaiyun.com/beyongwang/article/details/52865028</link><guid>https://blog.youkuaiyun.com/beyongwang/article/details/52865028</guid><author>beyongwang</author><pubDate>Sun, 23 Oct 2016 23:28:13 +0800</pubDate><description><![CDATA[注：以下测试均在VS2015下进行，其他编译器可能会有轻微差别。


继续整理第二部分的内容。


二、operator new/delete，以及其对应的数组版本new[]/delete[]。




operator new优先调用全局重载的，所以::operator new(sizeof(COperatorTest))和operator new(sizeof(COper]]></description><category></category></item></channel></rss>