WordPress5.0插件适应升级指南

最近发布的WordPress5.0因为启用全新可视化编辑器gutenberg而带来了巨大变化,除了用户文章编辑使用习惯上的不适之外,更关键的是因为编辑面板的调整,你会发现自己原来一直能够好好工作的插件都突然间失灵啦。比如本人开发的simple post series插件已经近半年没有更新啦,但是之前在4+版本都可以正常工作的,结果升级到最新5.0版发现居然功能从边栏消失不见啦,而且写的editor …

阅读全文

再看设计模式——状态模式与策略模式

根据不同的状态,执行不同的行为。相比switch case思路,使用状态模式能让数据与行为封闭性更好,添加新的状态也比较简单,状态间的切换逻辑不用刻意去维护,但是不如switch切换状态顺序流那么清晰。 实际实现中状态模式对”开闭原则”的支持并不太好。有两种实现存放的思路: 静态状态。初始化时把所有可能的状态对象都new好,状态切换时通过赋值改变当前的状态。 实例化状态。每 …

阅读全文

再看设计模式——单例模式

这个模式其实就是要保证只有一个实例存在。通常的实现思路就是持有一个私有静态实例,保证仅一次初始化,以getInstance方法返回。但是实际实现这个模式要考虑更多细节:  线程安全与DLC 单例对象的析构与销毁 组件中单例对象的管理 单例模式的单元测试 使用C++实现还必须额外注意一些实现细节 静态成员变量初始化顺序不依赖构造函数, 多个单例可能初始化顺序不对 延迟初始化(第一次使用才初始化)需要 …

阅读全文

volatile与内存屏障总结

一. 内存屏障 Memory Barrior 1.1 重排序 同步的目的是保证不同执行流对共享数据并发操作的一致性。在单核时代,使用原子变量就很容易达成这一目的。甚至因为CPU的一些访存特性,对某些内存对齐数据的读或写也具有原子的特性。但在多核架构下即使操作是原子的,仍然会因为其他原因导致同步失效。 首先是现代编译器的代码优化和编译器指令重排可能会影响到代码的执行顺序。 其次还有指令执行级别的乱序 …

阅读全文