1. İsimlendirme Kurallarının Anlaşılması

İsimlendirme kuralları, yazılım geliştirmede önemli bir rol oynar çünkü değişkenlerinizi, fonksiyonlarınızı ve diğer tanımlayıcıları tutarlı ve açıklayıcı bir şekilde isimlendirmek için bir çerçeve sunar. Go'da (genellikle Golang olarak adlandırılır), belirlenmiş isimlendirme kurallarını takip etmek, kodunuzu okunabilir ve bakımı daha kolay hale getirmekle kalmaz, aynı zamanda başkalarının (ve gelecekteki sizin) kod tabanınızda daha az sürtükle anlamalarını ve işbirliği yapmalarını sağlar.

1.1. İsimlendirmenin Neden Önemli Olduğu

Herhangi bir programlama dilinde, tanımlayıcılarınızı nasıl adlandırdığınız, kodunuzu anlama ve bakımını yapma yeteneğinizi büyük ölçüde etkileyebilir. Go'da, basitlik ve netliği vurgulayan, uygun isimlendirme daha da önemlidir. Değişken veya fonksiyonun amacını açıkça ifade eden isimler, ek açıklamaların ihtiyacını azaltır ve kodun kendi kendini belgelemesini sağlar. Bu, bir kod tabanını zamanla sürdürmek ve sorunsuz bir şekilde takım işbirliği yapmak için hayati önem taşır.

1.2. İsimlendirme İçin Genel Kurallar

Go'nun isimlendirme kuralları basit ancak güçlüdür:

  • Kısa, öz isimler kullanın: Go, özellikle küçük kapsamlı değişkenler için kısa isimleri teşvik eder. Örneğin, i döngü sayacı için kullanılabilir, ancak daha fazla açıklık gerekiyorsa index veya counter kullanılabilir.

  • Çok kelimeli isimler için CamelCase kullanın: Bir isim birden fazla kelimeden oluşuyorsa, CamelCase notasyonunu kullanın. Dışa aktarılan isimler (paket dışından erişilebilir olanlar), büyük harfle başlamalıdır (MyFunction), iç isimler ise küçük harfle başlamalıdır (myFunction).

  • Anlamlı isimler kullanın: İsimler, amaçlarını veya kullanımlarını anlatabilecek kadar açıklayıcı olmalı, ancak aşırı uzun olmamalıdır. Örneğin, CalculateNetIncome kullanılacaksa CNI'dan daha tercih edilir.

  • Alt çizgi kullanmaktan kaçının: Bazı dillerin aksine, Go'nun gelenekleri alt çizgilerin kullanılmasını önler. record_count yerine recordCount kullanırsınız.

  • Kısaltmalar tutarlı olmalıdır: İsimlerde kısaltma kullanılırken, bunları tutarlı durumda tutun. Dışa aktarılan isimler için tüm harfler büyük harfle (HTTPServer) ve iç isimler için tüm harfler küçük harfle (httpServer) kullanmak standart uygulamadır.

  • Paket isimleri basit olmalıdır: Go'daki paket isimleri basit ve küçük harfle, alt çizgi veya karışık büyük-küçük harf içermeyen bir kelime olmalıdır (net, os, json).

  • Tür bazlı değişken isimlendirmesi: Yapı örneklerini temsil eden değişkenler için genellikle değişken ismi olarak yapının adı küçük harfle kullanılır (var user User).

İşte isimlendirme seçeneklerini açıklayan yorumlar içeren Go kodu örneği:

package main

import "fmt"

type User struct {
    FirstName string
    LastName  string
    Age       int
}

func main() {
    var currentUser User // Değişken adını küçük harfle kullanmak.
    currentUser.FirstName = "John"
    currentUser.LastName = "Doe"
    currentUser.Age = 30

    fmt.Println(formatUserDetails(currentUser))
}

// formatUserDetails, bir User yapısı alır ve formatlanmış bir dize döndürür.
// Fonksiyon adı küçük harfle başladığı için dışa aktarılmamıştır (özel).
func formatUserDetails(u User) string {
    return fmt.Sprintf("Ad: %s %s, Yaş: %d", u.FirstName, u.LastName, u.Age)
}

Bu isimlendirme kurallarına uyulması, Go kodunuzun okunabilirliğini ve bakımını önemli ölçüde artırır.

2. Go'da Tanımlayıcılar

Go ile başlarken, tanımlayıcıların rolünü anlamanız önemlidir. Tanımlayıcılar, değişkenler, fonksiyonlar ve sabitler gibi kodunuzdaki çeşitli unsurlara atadığınız isimlerdir. Anlamlı ve tutarlı isimler seçmek, kodunuzu daha okunabilir ve bakılabilir hale getirir.

2.1. Değişken İsimlendirme Kuralları

Go'da, değişken isimleri bir harf veya alt çizgi ile başlamalı, ardından harfler, rakamlar veya alt çizgilerin herhangi bir kombinasyonu ile devam etmelidir. Ancak, alt çizgiyle başlamak, genellikle özel kullanımlar için ayrılmış olduğu için önerilmez.

En İyi Uygulamalar:

  • Kısa, açıklayıcı isimler kullanın.
  • Paket düzeyi kapsamı için küçük harfle başlayın.
  • Çok kelimeli isimler için camelCase kullanın (örneğin, totalAmount).
  • Dışa aktarılan değişkenler (paket dışından erişilebilir) için büyük harfle başlayın.

Örnek:

var userName string // dışa aktarılmayan değişken
var UserAge int     // dışa aktarılan değişken

Kod içindeki yorumlar, dışa aktarılan ve dışa aktarılmayan değişkenler arasındaki ayrımı açıklar.

2.2. Fonksiyon Adlandırma Kuralları

Go'da fonksiyonlar, değişkenlerle benzer kurallara göre adlandırılır. İsim, fonksiyonun amacını yansıtmalıdır ve kapsamı, ilk harfin durumunu belirler.

En İyi Uygulamalar:

  • Fonksiyonun amacını yansıtan açıklayıcı isimler kullanın.
  • İç fonksiyonlar için küçük harfle başlayın.
  • Dışa aktarılan fonksiyonlar için PascalCase (büyük harfle başlama) kullanın.
  • Fonksiyon isimlerini kısa tutun ancak anlamlı olsun.

Örnek:

func calculateTotal(price int, quantity int) int { // iç fonksiyon
    return price * quantity
}

func CalculateDiscount(totalPrice int) float64 { // dışa aktarılan fonksiyon
    return totalPrice * 0.1
}

Yorumlar, fonksiyonun durumuna göre erişilebilirliğini açıklar ve amacına kısa bir bakış sunar.

2.3. Sabit Adlandırma Kuralları

Sabitler, bir kez tanımlandıktan sonra değiştirilemeyen değerlerdir. Go'da sabitler, const anahtar kelimesi kullanılarak tanımlanır ve karakter, dize, mantıksal veya sayısal değerler olabilir.

En İyi Uygulamalar:

  • Ayırma için alt çizgili büyük harf kullanın (örneğin, MAX_LIMIT).
  • Numaralandırılmış sabitler için iota numaralandırıcısını kullanın.
  • Dışa aktarılan sabitler büyük harfle başlamalıdır.

Örnek:

const MAX_RETRY_COUNT int = 3 // dışa aktarılan sabit

type ByteSize float64
const (
    _           = iota // ilk değeri atlayarak boş tanımlayıcıya atama yaparak
    KB ByteSize = 1 << (10 * iota)
    MB
    GB
    TB
)

Bu örnek, basit sabitleri ve iota kullanarak byte boyutları için bir dizi ilgili sabiti nasıl tanımlayacağınızı gösterir.

3. Türler için Adlandırma Kuralları

Bu bölüm, yapılar ve arayüzler gibi farklı türlerin adlandırılması için standartlara odaklanmaktadır.

3.1. Yapılar için Adlandırma Kılavuzları

Genel Bakış: Go'daki yapılar, değişkenleri gruplayan bileşik veri tiplerini temsil eder. Yapılar adlandırılırken, büyük harfle başlayan özgün isimler kullanın.

  • İyi Uygulama: Yapıları, neyi temsil ettiğini açıkça belirten isimlerle PascalCase kullanarak adlandırın. Örneğin:
// İyi
type Employee struct {
    ID        int
    FirstName string
    LastName  string
    Position  string
}
  • Kaçının: Belirsiz veya genel amaçlı isimler kullanmaktan kaçının, yapıların amacını iletmeyen.
// Kaçının
type Data struct {
    ID        int
    FirstName string
    LastName  string
    Position  string
}

3.2. Arayüzler için Adlandırma Kılavuzları

Genel Bakış: Go'daki arayüzler, yöntem setlerini belirtir ve anlam ifade ediyorsa 'er' ekini kullanarak açıklayıcı isimlerle adlandırılır.

  • İyi Uygulama: Arayüzleri, soyutladıkları davranışa göre adlandırın. Genellikle, bir arayüz yalnızca bir yöntem içeriyorsa, isim o yöntemin eylemini ve bir '-er' eki eklenerek yansıtmalıdır.
// İyi
type Reader interface {
    Read(p []byte) (n int, err error)
}
  • Davranışların Toplanması için İsimlendirme: Bir arayüz, davranış koleksiyonunu temsil ediyorsa, 'er' eki olmadan amaçlarını doğru bir şekilde yansıtan bir isim seçin.
// Davranış koleksiyonu örneği
type Filesystem interface {
    ReadFile(path string) ([]byte, error)
    WriteFile(path string, data []byte) error
}

4. Büyük Küçük Harf Duyarlılığı ve Dışa Aktarılan Tanımlayıcılar

4.1. Dışa Aktarılan vs Dışa Aktarılmayan İsimler

Go'da, bir tanımlayıcının kendi paketi dışındaki erişilebilirliği, ilk harfin durumuna göre belirlenir. Büyük harfle başlayan bir tanımlayıcı 'dışa aktarılmış' olarak kabul edilir, yani diğer paketlerden erişilebilir. Bu, diğer programlama dillerindeki genel kapsama benzer. Diğer yandan, küçük harfle başlayan tanımlayıcılar 'dışa aktarılmamış' veya özel olarak kabul edilir ve yalnızca kendi paketleri içinde erişilebilirler.

Örnek:

package geometry

// Dışa aktarılan tanımlayıcı
type Rectangle struct {
    Length, Width float64
}

// Dışa aktarılmayan tanımlayıcı
type point struct {
    x, y float64
}

Bu örnekte, Rectangle büyük harfle başladığı için dışa aktarılan bir tiptir ve geometry paketini içe aktaran diğer paketler tarafından kullanılabilir. Buna karşılık, point tipi dışa aktarılmamıştır ve yalnızca geometry paketi içinde kullanılabilir.

4.2. İhrac Edilen Kimlikler için En İyi Uygulamalar

İhrac edilen kimlikleri adlandırırken, kodunuzu diğer kişiler tarafından okunabilir ve anlaşılabilir hale getirmek için bazı en iyi uygulamaları takip etmek önemlidir:

  • Kısalık Yerine Netlik: Kısa ve şifreli olanlar yerine net ve açıklayıcı isimler seçmek önemlidir. Örneğin, CalculateArea kullanmak CalcA kullanmaktan daha tercih edilir.
  • Tutarlılık: Kod tabanınızda isimlendirme kurallarına tutarlı olun. Benzer varlıklara belirli desenlerle isim verirken bu desenlere bağlı kalın.
  • Gereksiz Tekrarı Önlemek: Kimlik adları içerisinde paket isimlerini tekrarlamayın. Örneğin, geometry.GeometryRectangle yerine geometry.Rectangle kullanın.
  • Bağlamı Düşünün: Kimlik adları, kullanıldıkları bağlamda anlamlı olmalıdır. Yanıltıcı veya belirsiz olabilecek isimlerden kaçının.
  • Belgeleme Yorumları: İhrac edilen kimlikleri belgelemek için yorumları kullanın, ne işe yaradıklarını ve nasıl kullanılması gerektiğini açıklayın.

Örnek:

package geometry

// CalculateArea bir dikdörtgenin alanını döndürür.
func (r Rectangle) CalculateArea() float64 {
    return r.Length * r.Width
}

Bu örnekte, CalculateArea, amacını açıklayan açıklayıcı bir isme sahip olan bir ihrac edilen bir fonksiyondur.

5. Uygulamada İsimlendirme Kuralları

Bu bölümde, Go isimlendirme kurallarının gerçek dünya senaryolarında nasıl uygulandığına odaklanacağız. Bu kurallara anlayışla ve bağlı kalma önemlidir çünkü kodunuzun idiyomatik, okunabilir ve sürdürülebilir olmasını sağlar.

5.1. Yaygın Hatalar ve Bunlardan Kaçınma Yolları

Değişkenler, fonksiyonlar ve diğer kimliklerin isimlendirilmesi genellikle önemsenmemektedir. Yaygın hatalar şunları içerir:

  • Jenerik isimler kullanmak: Veri veya bilgi gibi isimler açıklayıcı değildir ve karışıklığa neden olabilir.
  • Aşırı uzun isimler: Açıklayıcı isimler iyi olsa da, aşırı uzun isimler sıkıcı olabilir. Bir denge bulun.
  • Çoklu kelime içeren kimliklerde alt çizgi kullanımı: Go, değişken isimleri için camelCase'i ve ihrac edilen fonksiyonlar ve tipler için PascalCase'i tercih eder.
  • Tutarlı olmayan isimlendirme desenleri: İsimlendirme kurallarındaki tutarlılık, kod yapısını hızlıca anlamada yardımcı olur.

Bu hatalardan kaçınmak için ipuçları:

  • Özgün ve açıklayıcı isimler kullanın. Örneğin, veri yerine, içerisinde kullanıcı bilgileri bulunduran bir değişkense kullaniciBilgisi kullanın.
  • Go'nun kısaltmalar için kuralına uygun isimlendirme yapın; kısaltmaları büyük harfle tutun, örneğin HttpServer yerine HttpServer kullanın.
  • İhrac edilmeyen paket düzeyi değişkenler ve sabitler için isimleri kısa tutun çünkü bunların kapsamı sınırlıdır.

5.2. Daha İyi İsimler için Yeniden Adlandırma

Kimlik isimlerini geliştirmek için kodu yeniden adlandırmak, kodun okunabilirliğini önemli ölçüde artırabilir. Bunun için aşağıdaki adımları takip edebilirsiniz:

  1. Açıklayıcı isimler kullanın: Isimlerin neyi temsil ettiğini veya yaptığını açık bir şekilde belirtmek için yeniden adlandırın. Örneğin, eğer bir fonksiyon Islem yapıyorsa, KullaniciGirisiIslemi olarak yeniden adlandırın.
  2. Araçlardan yararlanın: gorename gibi araçları kullanarak, metinsel olarak değil, Go kodunu anlamsal olarak analiz ederek güvenli bir şekilde adlandırma yapın.
  3. Eşitlerle gözden geçirin: Bazı şeyler sizin için mantıklı görünebilir fakat başkaları için net olmayabilir. Eşitlerle gözden geçirmek, belirsiz isimleri belirlemekte yardımcı olabilir.
  4. Geribildirim üzerinden iterasyon yapın: Değişiklikler yaptıktan sonra, kod tabanı kullanıcılarından geribildirim toplayın ve gerekirse isimlendirmeyi iyileştirin.

Bu teknikleri takip ederek, Go kod tabanınızın temiz, anlaşılır ve sürdürülebilir kalmasını sağlayabilirsiniz.