Interface를 활용한 검색
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 101번째.
챌린지
쉬움도서 관리 시스템에 유연한 검색 기능을 추가해 봅시다! 인터페이스를 사용하여 전략(Strategy) 패턴을 구현함으로써, 핵심 라이브러리 코드를 수정하지 않고도 사용자가 다양한 기준으로 도서를 검색할 수 있도록 만들 것입니다.
코드는 다음 다섯 개의 파일로 구성됩니다:
book.go: 이전 레슨에서 작성한ID,Title,Author,ISBN,Available필드를 가진Book구조체입니다.NewBook생성자를 포함하세요.user.go:ID,Name,Email,BorrowedBooks필드를 가진User구조체입니다.NewUser생성자를 포함하세요.search.go: 검색 전략 인터페이스와 그 구현체들을 정의합니다.단일 메서드를 가진
SearchStrategy인터페이스를 생성하세요:Match(book *Book, query string) bool세 가지 검색 전략을 구현하세요:
TitleSearch— 도서의 제목이 쿼리를 포함하는지 확인합니다 (대소문자 구분 없음)AuthorSearch— 도서의 저자가 쿼리를 포함하는지 확인합니다 (대소문자 구분 없음)ISBNSearch— 도서의 ISBN이 쿼리와 정확히 일치하는지 확인합니다
library.go: 도서와 사용자를 위한 맵을 가진Library구조체입니다. 임의의SearchStrategy와 쿼리 문자열을 인자로 받아 일치하는 도서 포인터 슬라이스를 반환하는Search메서드를 추가하세요. 이 메서드는 모든 도서를 순회하며 전략의Match메서드를 사용하여 결과를 찾아야 합니다.main.go: 도서들로 라이브러리를 구축한 다음, 서로 다른 전략을 사용하여 검색을 수행합니다.도서의 수를 읽은 다음, 각 도서의 ID, 제목, 저자, ISBN을 읽습니다. 그 다음, 검색 작업의 수를 읽습니다. 각 작업은 검색 유형(
title,author, 또는isbn)과 그 뒤를 잇는 쿼리 문자열로 구성됩니다.각 검색에 대해,
Search by [type]: [query]를 출력하고 다음 줄에 일치하는 도서 ID들을 쉼표로 구분하여 출력하세요. 일치하는 도서가 없으면 대신No results를 출력하세요.
다음과 같은 입력이 제공됩니다:
- 도서 수, 이어서 각 도서의 ID, 제목, 저자, ISBN (각각 별도의 줄에 입력)
- 검색 수, 이어서 각 검색 유형과 쿼리 (각각 별도의 줄에 입력)
예를 들어, 다음과 같이 입력되면:
3
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Go in Action
William Kennedy
978-1617291784
B003
Learning Python
Mark Lutz
978-1449355739
3
title
go
author
kennedy
isbn
978-1449355739출력은 다음과 같아야 합니다:
Search by title: go
B001,B002
Search by author: kennedy
B002
Search by isbn: 978-1449355739
B003그리고 다음과 같이 입력되면:
2
B001
Clean Code
Robert Martin
978-0132350884
B002
The Pragmatic Programmer
David Thomas
978-0135957059
2
title
java
author
martin출력은 다음과 같아야 합니다:
Search by title: java
No results
Search by author: martin
B001그리고 다음과 같이 입력되면:
2
B001
Design Patterns
Gang of Four
978-0201633610
B002
Head First Design Patterns
Eric Freeman
978-0596007126
1
title
design출력은 다음과 같아야 합니다:
Search by title: design
B001,B002Search 메서드가 어떻게 어떤 전략과도 작동하는지 주목해 보세요. 이 메서드는 제목, 저자, ISBN 중 무엇으로 검색하는지 알지 못합니다. 이러한 다형성 접근 방식은 SearchStrategy를 구현하는 새로운 구조체를 생성하는 것만으로 새로운 검색 유형(예: 대출 가능 여부나 출판 연도별 검색)을 간단히 추가할 수 있음을 의미합니다!
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 책의 권수 읽기
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// 도서관 생성
library := NewLibrary()
// 각 도서의 상세 정보 읽기
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
book := NewBook(id, title, author, isbn)
library.AddBook(book)
}
// 검색 횟수 읽기
numSearchesStr, _ := reader.ReadString('\n')
numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))
// 각 검색 처리
for i := 0; i < numSearches; i++ {
searchType, _ := reader.ReadString('\n')
searchType = strings.TrimSpace(searchType)
query, _ := reader.ReadString('\n')
query = strings.TrimSpace(query)
// TODO: searchType에 따라 적절한 검색 전략(strategy) 선택
// searchType은 "title", "author", 또는 "isbn"이 될 수 있음
var strategy SearchStrategy
// TODO: 여기에 전략 선택 로직 구현
// TODO: library.Search(strategy, query)를 사용하여 검색 수행
// TODO: 요구된 형식으로 결과 출력
// 형식: "Search by [type]: [query]" 다음에 일치하는 ID들 또는 "No results" 출력
fmt.Printf("Search by %s: %s\n", searchType, query)
// TODO: 쉼표로 구분된 일치하는 도서 ID들을 출력하거나, 결과가 없으면 "No results" 출력
_ = strategy // 솔루션을 구현할 때 이 라인을 제거하십시오
}
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서