첫 번째 Go 코드 리팩토링
11651 단어 gorefactorit
데이비드크롤 / 샤리프
SHA(riff) - Go로 지문 확인
오늘 나는 그것을 검토하고 리팩토링 할 것입니다.
main
함수를 분석하여 시작합니다. 이 프로젝트의 유일한 기능입니다.func main() {
args := os.Args[1:]
inFile := args[0]
inHash := args[1]
// keep the check case insensitive
inHash = strings.ToLower(inHash)
file, err := os.Open(inFile)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// review: maybe change the name to hasher here
hash := sha256.New()
if _, err := io.Copy(hash, file); err != nil {
log.Fatal(err)
}
hashToCheck := hex.EncodeToString(hash.Sum(nil))
// review: introduce string formatting here
if inHash == hashToCheck {
color.Green(inFile + " has SHA256 " + inHash)
} else {
color.Red(inFile + " doesn't match with " + inHash)
color.Red("The correct hash is: " + hashToCheck)
}
}
그래서 우리는 이미 몇 가지 문제를 발견했습니다. 또한 확인 논리를 추출하고 이에 대한 테스트를 작성하고 싶습니다.
매개변수 확인 추가
오류 처리 개선을 위해 기본 기능 상단에 매개변수 개수 확인을 추가하겠습니다. 또한 여기에 0이 아닌 종료 코드를 추가하여 명령이 성공적으로 실행되었는지 여부를 명령줄에서 확인할 수 있습니다.
func main() {
// check for missing parameters
if len(os.Args) != 3 {
fmt.Println("Error occured: missing parameters")
// emit non-zero exit code
os.Exit(1)
}
// continue
}
문자열 서식 추가
명령줄에서 인쇄하기 위해 문자열 연결을 수행하는 것은 매우 나쁩니다. 물론 문자열 형식을 사용하여 무언가를 출력하는 것이 좋습니다.
따라서 다음에서 이동하십시오.
color.Green(inFile + " has SHA256 " + inHash)
그것에:
color.Green("%s has SHA256 %s", inFile, inHash)
코드를 뽑아
파일뿐만 아니라 임의의 스트림에 대한 해시를 확인하는 기능을 만들고 싶습니다. HTTP 서버에서 파일을 수신할 때 해시를 확인하는 것을 생각할 수 있습니다. 따라서 파일은 이미 메모리에 있습니다. 따라서
io.Reader
인터페이스를 사용하고 있습니다. 또한 코드를 단위 테스트에 적합하게 만듭니다.// checkHash calculates the hash using and io.Reader, so it is now testable
func checkHash(reader io.Reader, hash string) (isValid bool, calculatedHash string, err error) {
// keep the check case-insensitive
hash = strings.ToLower(hash)
hasher := sha256.New()
if _, err := io.Copy(hasher, reader); err != nil {
return false, "", err
}
calculatedHash = hex.EncodeToString(hasher.Sum(nil))
return hash == calculatedHash, calculatedHash, nil
}
쓰기 테스트
이제 코드를 테스트할 수 있으므로 테스트를 작성해야 합니다.
func TestCheckHash(t *testing.T) {
b := []byte{0xbe, 0xef, 0x10, 0x10, 0xca, 0xfe}
r := bytes.NewReader(b)
isValid, calculatedHash, err := checkHash(r, "77efeeff80507604bbd4c32b32ce44306879154f83f46afe8c15223932a6a4cb")
if err != nil {
t.Error(err)
} else if !isValid {
t.Error("hashes do not match", calculatedHash)
}
}
따라서 위의 코드에서 16진수 코드로 바이트 슬라이스를 생성합니다.
0xbeef1010cafe
에서 io.Reader
를 만들고 해시를 계산합니다.결론
내 첫 번째 게시된 Go 코드는 이제 놀랍게도 22.7%의 테스트 범위를 갖습니다. 우와!! 결국, 2018년의 코드는 이전에 예상했던 것만큼 나쁘지는 않았지만 물론 일부 이름만 변경되거나 종료 코드가 추가된 경우에도 항상 가능한 개선 사항이 있다고 말하고 싶습니다.
Reference
이 문제에 관하여(첫 번째 Go 코드 리팩토링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/davidkroell/refactoring-my-first-go-code-1ble텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)