첫 번째 Go 코드 리팩토링

11651 단어 gorefactorit
내 첫 번째 Golang 코드는 2018년 4월 25일에 게시되었습니다. Github에서 볼 수 있습니다. 43줄로 이루어진 SHA256 해시 검사기입니다.


데이비드크롤 / 샤리프


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년의 코드는 이전에 예상했던 것만큼 나쁘지는 않았지만 물론 일부 이름만 변경되거나 종료 코드가 추가된 경우에도 항상 가능한 개선 사항이 있다고 말하고 싶습니다.

좋은 웹페이지 즐겨찾기