基于java nio的server设计

最近由于业务需要,写了一个 java server用来与我们的游戏服务器实现交互。 server只实现了最基本的功能: 维护多个长连接,发送与接收消息;连接建立及断开(主动与被动)。 在实现的过程中,最有意思的是java nio里的buffer,但我认为这是一个失败的设计。 java nio buffer三个主要的属性,position, limit, capacity. 通常来讲,传统的ringbuffer都会有一个read index和write index, 但buffer nio将两者统一为postion,然后弄出了读写模式切换的概念。 当从buffer里取出数据,即buffer.getXXX或者channel.write(buffer), 当往buffer里放入数据,即buffer.putXX或者channel.read(buffer), 的前后,经常要考虑模式的切换,比如调用flip,这样的设计增加了复杂性,对库的使用者带来困难(笔者才疏学浅,一直疑惑他们为什么这么设计,求高人指教),这本质上是因为position属性既要当作readindex来使用,又要当作writeindex来使用。 另外一点就是由于postion的大小不能超过limit和capacity, 导致使用的过程中经常需要compact, 每次compact会导致额外的内存拷贝;传统的ringbuffer会在writeindex < readindex在的时候才可能涉及到额外内存的拷贝。 也难怪,netty里抛弃了这种设计。

type 与 RTTI

时常,我们在程序中经常出现这样的switch或者if-else分支: if (pobj->IsKindOf(Circle)) else if (pobj->IsKindOf(Rectangle)) 等。其中上面的IsKindOf也可能是我们自定义的GetType(),或者是C++标准中的dynamic_cast。 不管怎么样,这是十分不好的设计/风格。 原因很简单,要添加一个新的类型,所有这些条件判断的地方都需要做更改;反之,使用多态只需要添加一个SubClass(当然,也可以在类层次上作一些调整)。 因此,MFC的CObject::IsKindOf() 明确的指出Do not use this function extensively because it defeats the C++ polymorphism feature. Use virtual functions instead. 如何应对这个问题呢, MartinFlower在《重构》中明确的指出了几条细则,包括: Replace Type Code with Class; Replace Type Code with State/Strategy; Replace Type Code with Subclasses; Replace Conditional with Polymorphism 既然如此,为什么还需要IsKindOf,dynamic_cast这些玩意呢。 在BS的《C++语言的设计与演化》中的《强制》一章“为什么提供一种危险‘特征’”一节中,我们可以找到讲RTTI作为标准的一些理由。这里就不一一罗列。 (“危险”两个词用的好,o(∩_∩)o) 每一个有用的特征都可以被误用。。。

了解Lua

  了解Lua(Orient_KingSoft_20141210) ● What and Why : Lua vs C/C++, Lua vs Python, etc ● Lua哲学: small is beautiful (5000行-22000行(Lua5.3)) ● Lua变量: 变量(标识符,修饰符,类型,值,内存,时间,空间) ● Lua函数: cloure, coroutine ● 脚本组成结构与执行过程 ● Lua核心: lua_state, table ● Lua进阶: lua源代码, luajit , lua源代码赏析(cloud) ● Lua应用(游戏): C/C++与Lua交互,热更新

Lua 5.3

Lua5.3发布了: 看看Lua官方上的主要变化描述: Main changes · integers (64-bit by default) · official support for small architectures (“Small Lua” with 32-bit numbers) · bitwise operators · basic utf-8 support 其实跟5.2相比,也没有什么大的变化。 这也体现了lua的Small is Beautiful的设计哲学。可以参考这里:http://web.stanford.edu/class/ee380/Abstracts/100310-slides.pdf。 另外一个有趣的事实是,从93年到现在20多年的时间里,lua从最初5000来行源代码到现在也就增长到2万行左右。 Lua的源代码分析,可以参考cloud的http://www.codingnow.com/temp/readinglua.pdf,估计他还没写完把,将来会出书?

STL之争

STL向来是一个有争议的话题。 最初接触STL的时候,给人眼前一亮的是,STL实现了数据结构和算法的分离,这也是STL设计的核心思想。 在实现上,STL源代码也是能够给人一些启发的。比如sort算法的实现(这应该不是STL的开创),sort主要采用快速排序,对于初步有序的短系列,采用插入排序,对于快速排序的极端情况,还可能使用堆排序。