初步重构完毕，尚未测试
进一步debug