2014-10-07 11 views
11

Bir dosyanın çok sayıda Structs, Interfaces ve Variables işlevleri ile aynı işlevleri içerdiği bir kod tabanım var ve bunu ayrı ayrı ayırmam gerekmediğinden emin değilim. dosya adı ekleyen dosyalar. Örneğin, accounts.go, sırasıyla sırasıyla accounts_struct.go ve accounts_interface.go olacaktır.Golang - Yapıları, değişkenleri ve arabirimleri olan kod organizasyonu

Yapılar, Değişkenler ve Arabirimler için kod tabanı büyüdüğünüzde dosya organizasyonu için iyi bir yaklaşım ne olurdu? http://golang.org/src/pkg/

Bu yaklaşım (yapı, arayüzü gibi dil öğelere dayalı ayırma, ...) hiç kullanılmamış olduğunu göreceksiniz:

+1

Bunun çok geniş olduğunu hissediyorum ... ama tavsiyem, kodunuzun hangi bilgiyle ilgili olduğunu düşünür ve daha az bilgiye sahip daha küçük parçalara ayırabileceğinizi düşünür. Tüm yapıları tek bir dosyaya koymaya rasgele karar vermeyin, bu garip. –

+1

Şimdiye kadar neredeyse tüm durumlarda (gerçekten, web uygulamalarının çok ön tarafı hariç) kodumun çoğunu kendinden geçmiş, yeniden kullanılabilir paketlere ayırabildim. Kodunuzda bunun mümkün olup olmadığını görmelisiniz. –

cevap

10

kontrol etmek İyi bir modelin Go kendisinin kaynak kodudur.

Tüm dosyalar özelliklere dayanmaktadır ve aynı dosyada kullandığınız şeyin tanımını bulabileceğiniz yakınlık ilkesi yaklaşımını kullanmak en iyisidir.
Genellikle bu özellikler tek bir pakette çok dosyalarından oluşmaktadır büyük olanlar, (net, net/http)

Kaynağı (xxx.go) ayırmak, bir şey ayırmak istiyorsanız den hariç paket başına tek bir dosyada toplanmıştır tests/benchmarks (xxx_test.go)

+0

Harika! Yapılar üstte veya doğrudan func'in üstüne koymak en iyisidir? –

+0

@PassionateDeveloper Özellikle de (büyük harfle) public türü ise, kullandığım çeşitli türde (struct, func, aliases, ...) türlerini tanımlarım. Ama iç özel tip (küçük harf) için bunları kullanmadan hemen önce kodun ortasında tanımlarım. – VonC

+0

@PassionateDeveloper her durumda, golint (https://github.com/golang/lint) ve veteriner arkadaşlarınızdır. https://blog.splice.com/going-extra-mile-golint-go-vet/ – VonC

8

İşte bir paket tasarlamak için zihinsel modelim.

a. Bir paket bir fikri veya konsepti kapsamalıdır. http bir kavramdır, http istemcisi veya http mesajı değildir.

b. Bir paketteki bir dosya, bir dizi ilişkili türü kapsamalıdır, iki dosya aynı ithalat kümesini paylaşırsa, bunları birleştirirse iyi bir kuraldır. Önceki örnekten yararlanarak, , http/server.go iyi bir tanecik düzeyi

c'dir. Tür başına bir dosya yapmayın, bu deyimsel Go değil.

+0

+1. Katılıyorum. Bu bana http://stackoverflow.com/a/14870666/6309 adresinde bulduğum bazı önerileri hatırlatıyor. – VonC