🔥 이름 있는 옵션 사용하기

276자
4분

count 도구에는 사용성 문제가 있어요. 사용자가 입력 파일을 먼저 제공해야 할지, 출력 파일을 먼저 제공해야 할지 바로 명확하지 않죠. 두 입력에 위치 인자(positional argument)를 사용하는 대신, 레이블이 있는 옵션(labeled option)을 지정할 수 있습니다.:

% count --input-file readme.md --output-file readme.counts
Counting words in 'readme.md' and writing the result into 'readme.counts'.
 
shell

이렇게 하려면 @Argument 속성 래퍼 대신 @Option 속성 래퍼를 사용합니다.:

@main
struct Count: ParsableCommand {
    @Option var inputFile: String
    @Option var outputFile: String
 
    mutating func run() throws {
        print("""
            Counting words in '\(inputFile)' \\
            and writing the result into '\(outputFile)'.
            """)
 
        // 'inputFile'을 읽고, 단어를 세고, 'outputFile'에 저장해요.
    }
}
 
swift

@Option 속성 래퍼는 --name <value>처럼 보이는 명령줄(command-line) 입력을 나타내며, 속성 이름에서 이름을 파생시켜요.

이 인터페이스는 count 도구 사용자에게 장단점(trade-off)이 있어요. @Argument를 사용하면 사용자 입력량은 줄어들지만, 입력 파일과 출력 파일 중 어느 것을 먼저 입력해야 하는지 기억해야 하는 단점이 있습니다. 반면에 @Option을 사용하면 사용자가 입력해야 할 양은 조금 늘어나지만, 각 값 사이의 구분을 명확하게 해 줍니다. 옵션은 순서에 독립적이므로 사용자는 입력 파일과 출력 파일을 어느 순서로든 지정할 수 있어요:

% count --output-file readme.counts --input-file readme.md
Counting words in 'readme.md' and writing the result into 'readme.counts'.
 
shell

이렇게 옵션을 사용하면 사용자가 입력하는 명령이 조금 길어지긴 하지만, 어떤 값이 입력 파일이고 어떤 값이 출력 파일인지 명확하게 구분할 수 있어요. 게다가 옵션은 순서에 영향을 받지 않아서 사용자가 입력 파일과 출력 파일을 어떤 순서로 지정하든 상관없어요.

lecture image

이 다이어그램은 count 명령어 동작 방식을 보여줘요. 사용자는 --input-file--output-file 옵션으로 입력 파일과 출력 파일을 지정하고, count는 입력 파일 단어를 세어서 그 결과를 출력 파일에 저장해요.

이렇게 옵션을 사용하면 사용자가 입력하는 명령은 조금 길어지지만, 값들 역할을 명확히 하고 순서에 구애받지 않게 만들어요. 이는 명령어 사용성을 크게 향상시켜 줍니다!