完善，可复用版本