2016-08-10 3 views
1

내가 golang의 클라이언트/서버 응용 프로그램을 개발하고 있어요, 그리고 클라이언트와 서버 (목록이 제한됩니다) 모두에 존재하는 특정 논리적 개체가분할 클라이언트/서버 코드

내가 어떤 코드를 확인하고 싶은

이 엔티티는 서버 부분에만 포함되지만 클라이언트에는 포함되지 않습니다 (반대의 경우도 좋지만 중요하지는 않음).

순진한 생각은 죽은 코드 제거에 의존하는 것이지만 내 간단한 연구에서 작업을 처리하는 신뢰할 수있는 방법은 아닙니다. go build은 사용되었을 수있는 사실로부터 데드 코드를 제거하지 않습니다. 리플렉션을 통해 (아무도 신경 쓰지 않고 이것을 조정할 옵션이 없음)

다른 솔리드 방식은 다른 패키지에서 코드를 분리하고 적절히 가져 오는 것 같습니다.이 코드는 신뢰할 만하지만 코드를 복잡하게 만듭니다. 물리적으로 다른 패키지간에 특정 엔티티를 분할하고 지속적으로 염두에두고 ...

그리고 마지막으로 여러 개를 가질 수있는 빌드 태그가 있습니다. 특정 암호화 루틴이 있습니다 : 같은 패키지에서 파일

태그를 구축하여와 동기는 내가 어떤 합성 실체를

사용 사례를 도입하지 않고 가능한 한 깨끗한 코드를 유지하려는 것입니다

는 클라이언트와 서버에 대한 조건부 구축 클라이언트는 공개 키로 작동하고 서버는 비공개로 작동합니다 ... 코드는 논리적으로 동일한 엔티티에 속합니다

어떤 옵션을 선택하겠습니까? 그 이유는 무엇입니까?

답변

2

이 "dead code elimination"은 이미 go 도구로 부분적으로 수행됩니다. go 도구에는 가져온 패키지의 모든 항목이 포함되어 있지 않고 필요한 것 (또는 더 정확하게는 도달 할 수없는 항목 제외) 만 포함됩니다. 비교 예이 응용 프로그램 (윈도우 AMD64에서) 거의 3백킬로바이트 작은 실행 가능한 바이너리에서

package main; import _ "fmt"; func main() {} 

결과를

다음

package main; import "fmt"; func main() {fmt.Println()} 

배제 가지 기능 유형을 포함하고도 안 export 및 수출 변수. 리플렉션을 사용하더라도 이름을 string 값으로 사용하여 함수를 호출하거나 유형을 "인스턴스화"하거나 패키지 변수를 참조 할 수 없기 때문에 가능합니다. 어쩌면 그렇게 걱정하지 않아도됩니다.

편집 : 읽기 블로그 게시물 : 발표 이동 1.7, 그것은 더 나은입니다 그래서 Smaller Go 1.7 binaries

당신이 당신의 종류와 기능을 디자인 할 경우, 당신은 당신이 열거 "거대한"레지스트리를 작성하지 않습니다 (명시 적으로 그것들에 대한 참조를 생성하고 결과적으로 그것들을 uncludeable하게 만든다), 컴파일 된 바이너리는 가져온 패키지에서 실제로 사용되는 것을 포함 할 것이다.

이런 종류의 문제에 대해 빌드 태그를 사용하지 않는 것이 좋습니다. 그것들을 사용하면 go/tool에 의해 직접 수행되는 package/file 의존성을 스스로 유지할 책임이 있습니다.

출력 실행 파일을 더 작게 만들기 위해 코드를 패키지로 디자인하고 분리해서는 안됩니다. 논리를 기반으로 코드를 설계하고 분리해야합니다.

패키지가 실제로 필요할 때 패키지로 분리하고 적절하게 가져올 것입니다. 이것이 실제로 당신이 원하는 것이기 때문에 : 클라이언트만을위한 코드, 서버를위한 코드. 설계 및 코딩 단계에서 조금 더 생각해야 할 수도 있지만, 적어도 결과를 볼 수 있습니다 (실제적으로 속한/클라이언트와 서버로 컴파일되는 내용).