使用each_with_ojbect而不是滥用reduce
用模块作为命名空间；better code, better doc