Lambda and std::function
Lambda的生命周期 正常来讲, lambda的所capture的值如果是引用的话, 需要注意一下生命周期的问题。 保证lambda不要获得比这些引用捕获的值长。 在debug一次crash的时候, 发现了一个和lambda生命周期有关的bug [weak_ptr_, cb](int, vector<string>) { if (cb) { cb(); /...
Lambda的生命周期 正常来讲, lambda的所capture的值如果是引用的话, 需要注意一下生命周期的问题。 保证lambda不要获得比这些引用捕获的值长。 在debug一次crash的时候, 发现了一个和lambda生命周期有关的bug [weak_ptr_, cb](int, vector<string>) { if (cb) { cb(); /...
观察者模式 观察者模式在我司SDK中也被大量使用,而且我发现其实大家是没有区分observer和vistor的差异 把observer当vistor用。 observer主要建立了一种通知依赖关系,当对象A的状态发生改变的时候,需要通知到B 如果这样的依赖过于紧密,整体的构架就比较死板。比较难复用 观察者模式的好处就是目标发送通知的时候,不用去指定一个具体的观察者,通知会自动传播 观察...
工场模式 将使用者和具体类型之间的耦合隔离。面对一个经常可能变化的类型,过紧的耦合可能导致 整体的关系脆弱。 factory method将创建具体的类延迟到了子类,从而实现了扩展,解决了耦合的关系。缺点在于 要求创建方法和参数相同 比如说现在有一个划分器的需求,针对不同的类别需要不同的划分器.假设一个回调需要一个 spliter,就可以如下实现 class ISplitter{ p...
策略者模式 起因 针对不同的类别,算法多样。如果按照if-else分支写,没加一个类别,就要多一个分支。修改的成本会逐渐上升。 根据设计模式,把分类拖到运行时,找到算法中的共同点,抽象成接口 代码 比如税法的计算, 不同的地区有不同的税法。比如说传输,不同的传输有不同的传输策略。 enum class TransportType { kTcp, kUdp, kAut,...
Template Method 在软件构建的过程中,整体的步骤流程是确定的A->B->C,假设其中A和B的流程完全明确,但是B的整体流程是需要自己实现的。 定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。 Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(overrided写)该算法的某些特定步骤。 一个简单的例子就是...
Design Pattern Summary 设计模式学完的感受就是尽量不用设计模式,尤其是工程特别大的时候,设计模式的加入反而会使得整个代码框架变得特别难读。 设计模式的核心是写出能够复用的代码,能够抵御足够强的变化,且在新增特性的时候,在原代码上带来的影响是较小的。应该是写出新的部分,在原有的部分上能复用。 8大基本原则 依赖倒置 高层模块(稳定)不应该依...
一些关于网络io的资料 Theory tcpip-study 陈硕的tcp-ip study CS144 Concurrent Servers Life of an HTTP request in a Go server
std::move使用指南 使用move在不实现它两个配套函数,编译器合成,逐个调用move,如果底层类型没有move,那其实还是copy。这种在有指针的时候要尤其注意,指针指向的内存到底在哪里,在这次move之后还有意义吗。 配套move构造函数和拷贝构造和拷贝assign的操作是一样的时候。move我认为是没有意义。 不如看看rust的转移...
Bug修复指南 记录一下第一次正式修复bug干的蠢事。 定位 首先,要习惯需要debug的模块是你所不熟悉的。个人能力最重要的一点就是解决问题的能力。 其次,我觉得这次比较缺失的环节就是通过堆栈分析,leader直接告诉我成因了。通读一遍之后问题其实就基本知道原因。但他不告诉我,这个代码有1w行,我去找的话多半好几天。。。 其实还是按照堆栈一步步看哪里除了问题,然后一路回溯过去吧。...
CS106L 第一个完成的courses,主要是讲了些c++的特性。帮助我理解了一点点move语意。然后配合c++ daily理解了lambda匿名函数。 课程很简单,lab做了一个构造算法,一个数据结构题。 其中wifiracer很有意思,后面其实可以看一下他请求网络的代码。里面做了部分页面的缓存,思路还挺不错的。 实际实现的时候拿一个vector存了所有的path,然后拿heap...