看了好久，想了好久，重构了吧