refactor and add some explain