순환 종속성 없이 Go에 패키지 등록
Go 애플리케이션을 설계할 때 하나의 패키지가 종속되는 패키지 간의 순환 종속성을 피하는 것이 중요합니다. 다른 하나는 첫 번째에 의존합니다. 이는 여러 패키지에 걸쳐 인터페이스와 해당 구현을 정의할 때 발생할 수 있습니다.
질문:
중앙 패키지( 클라이언트 인터페이스) 및 구현을 포함하는 패키지(예: UDPClient, TCPClient)?
답변:
표준 라이브러리는 이 문제를 해결하기 위해 두 가지 주요 접근 방식을 제공합니다.
1. 중앙 레지스트리 없이
중앙 패키지에서 클라이언트 인터페이스를 정의합니다. 구현을 위해 클라이언트를 인스턴스화할 때 원하는 구현을 명시적으로 지정합니다. 예:
import ( "hash/md5" "hash/sha256" ) func main() { h1 := md5.New() h2 := sha256.New() }
2. 중앙 레지스트리를 사용하여
구현이 스스로 등록되는 레지스트리 메커니즘을 만듭니다. 이 접근 방식은 질문에서 논의된 자발적인 등록과 유사합니다. 다양한 이미지 형식 디코더(예: GIF, JPEG, PNG)가 스스로 등록되는 이미지 패키지에 사용됩니다.
3. 제안된 사용자 정의 레지스트리
클라이언트 생성을 위해 NewClient() 메서드를 제공하는 별도의 팩토리 패키지를 도입합니다. 이 패키지는 순환 종속성을 유발하지 않고 인터페이스 및 구현 패키지를 참조할 수 있습니다. 예를 들면 다음과 같습니다.
package pi // Client represents the client interface. type Client interface { ... }
package pa // UDPClient implements the Client interface. type UDPClient struct { ... }
package pb // TCPClient implements the Client interface. type TCPClient struct { ... }
package pf import ( "pi" "pa" "pb" ) // NewClient creates a client based on the implementation. func NewClient(impl string) pi.Client { switch impl { case "udp": return &pa.UDPClient{} case "tcp": return &pb.TCPClient{} default: panic("Unsupported implementation") } }
위 내용은 순환 종속성을 만들지 않고 Go 패키지 구현을 등록하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!