Python3 使用 nonlocal keyword 实现保存状态的嵌套函数

前言:
最近阅读一本书《代码之髓》, 其中篇章:《7.3 静态作用域是完美的吗》
介绍了 Python3 的 nonlocal 关键字, 从12月将工作语言升级到Python3后,
才从一本讲述编程语言概念的书籍里知晓这个 nonlocal -_-b

首先写个小Demo:

Continue reading

C++11 学习笔记(8) 使用bind改进 rtmpd iohandler 与 protocol 的绑定关系的思路

rtmpd ( 即 crtmpserver )的 是C++版本的流媒体服务器,
其实现方式与 Java 版本的 red5类似. 源码中有大量的指针互相
注册, 以便每个类都能找到对应的功能类, 做通知功能或者传输数据.
而指针的声明周期又需要作者自己清楚地了解(没有用到 shared_ptr).
也许在 C++11推出后, 可以方便地使用 std::bind 与 std::function
来重新定义类之间的关系, 通过互相的注册函数(包括通知函数).

在 rtmpd 的 docs 文档中有一个 architecture.txt 描述了 rtmpd 的代码结构:

Continue reading

C++11 学习笔记(5) delegate 模式

delegeate 模式最早接触到是在大四实习ios开发时候.当时使用之后觉得
objc代码写起来很舒服(当时并没有对注册回调函数有清晰的概念)

现在用C++11的 functional 模拟实现 delegate 模式 :)

代码转自cprogramming

[题外话] 工作两年, 对回调函数的理解一次比一次有新的体会.

  • 首先阅读 Redis 的源码, 在C中大量的函数指针其实是注册的回调函数
  • 后来接触了 Lua 脚本(写交互状态的逻辑代码), 发现使用传统的
    面向对象和过程的实现方式 在代码开发上难度和时间会消耗很大又
    因为 Lua 本身支持函数式编程的方式(当时就只懂使用简单的保存
    状态的闭包), 通过项目实践和学习, 异步回调的理解加深, 同时将
    代码逻辑开发的难度降低.
  • 随后 Node.js 流行, 在使用其开发一个小型功能程序中惊奇地发现
    回调的使用与在 Lua项目中的理解是一致的, 更加对自己的工作的
    成果有了自信 :)

C++11 学习笔记(4) 11标准以前模仿 lambda 实现

C++11 推出了 lambda支持

而在之前要想模仿闭包的实现, 可以使用比较技巧的方式:
其原理是利用定义一个 functor类, 重写 operator() 操作符号
实现方式转自cprogramming

C++11 学习笔记(3) 使用闭包模拟实现 finally 关键字

代码出现异常时, 往往会对异常做处理, 而不是直接将程序 abort
而抛出异常之后往往也要做相应的资源释放或者清理步骤, 往往需要最终操作.

例如在在读文件过程:
1. FILE* f open 操作
2. 读文件块
3. 读取后在内存操作, 比如调用 operationRead(f); // 伪代码 操作成功 走 4, 否则出现异常; operationRead(f) 不能正常执行 走 5
4. 操作成功, 走 6
5. 处理异常, 比如打印, 走6
6. 此时属于 finally 步骤, 关闭文件句柄 close(f);

C++11并未实现 finally (注意: 与 final关键字有区别)

那么现在看看模拟实现, 转自codeproject

Continue reading