重构代码，添加了单元测试