Menu
CoddyTech

Dışa Aktarılan ve Aktarılmayanlar

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 52 / 68.

Go'da tanımlayıcıların (değişkenler, işlevler, türler vb.) görünürlüğü basit bir adlandırma kuralıyla kontrol edilir. Bu, diğer paketlerdeki kodların tanımlayıcılarınıza erişip erişemeyeceğini belirler.

Dışa aktarılan tanımlayıcılar büyük harfle başlar ve diğer paketlerden erişilebilir. Onları "public" olarak düşünebilirsin — paketini içe aktaran herkes tarafından kullanılabilirler.

// Bunlar dışa aktarılmıştır (herkese açık)
var Name string
func Calculate() int
type Person struct

Dışa aktarılmamış tanımlayıcılar küçük harfle başlar ve yalnızca aynı paket içinde erişilebilir. Bunlar paketiniz için "özel"dir.

// Bunlar dışa aktarılmamış (özel)
var age int
func helper() string
type config struct

Bu adlandırma kuralı, public veya private gibi anahtar sözcüklere ihtiyaç duymadan erişimi denetlemenin Go'ya özgü yoludur. Başka bir paketten dışa aktarılmamış bir tanımlayıcıyı kullanmaya çalıştığında Go, bu tanımlayıcı paketin dışında görünür olmadığı için derleme hatası verir.

challenge icon

Görev

Kolay

Go paketindeki görünürlük sorunlarını, dışa aktarılan ve dışa aktarılmayan tanımlayıcılar için adlandırma kuralını düzelterek giderin. Bazı tanımlayıcıların yanlış adlandırıldığı ve başka paketlerden erişildiğinde derleme hatalarına neden olduğu, birden fazla paketin yer aldığı benzetimli bir senaryoda çalışacaksınız.

İki girdi alacaksınız:

  • Paket tanımlarını "package_name:identifier1:type1:visibility1,identifier2:type2:visibility2|package_name:identifier1:type1:visibility1" biçiminde içeren bir dize (ör. "utils:helper:function:private,Calculate:function:public|main:name:variable:private,Version:variable:public")
  • Erişim denemelerini "accessing_package.identifier1,accessing_package.identifier2,accessing_package.identifier3" biçiminde içeren bir dize (ör. "main.helper,main.Calculate,utils.Version")

Göreviniz:

  1. Tek tek paket tanımlarını elde etmek için ilk girdiyi dikey çizgilerden bölerek ayrıştırın
  2. Her paket tanımını, paket adını ve tanımlayıcılarını elde etmek için iki nokta üst üste işaretlerinden bölün
  3. Her tanımlayıcı tanımını, tanımlayıcı adını, türünü ve amaçlanan görünürlüğünü elde etmek için iki nokta üst üste işaretlerinden bölün
  4. Bir tanımlayıcı adını ve amaçlanan görünürlüğü alan, düzeltilmiş adı döndüren fixIdentifierName adlı bir işlev oluşturun:
    • Görünürlük "public" ise tanımlayıcının büyük harfle başladığından emin olun
    • Görünürlük "private" ise tanımlayıcının küçük harfle başladığından emin olun
  5. Paket analizi başlığını görüntüleyin: "=== PACKAGE VISIBILITY ANALYSIS ==="
  6. Her paket için paket bilgilerini görüntüleyin:
    • "Package: [package_name]"
    • Paketteki her tanımlayıcı için:
      • Tanımlayıcı adının düzeltilmesi gerekiyorsa: "- [original_name] ([type]) -> [corrected_name] (visibility: [visibility])"
      • Tanımlayıcı adı doğruysa: "- [identifier_name] ([type]) (visibility: [visibility]) ✓"
    • Tek tek erişim denemelerini elde etmek için ikinci girdiyi virgüllerden bölerek ayrıştırın
    • Her erişim denemesini, erişen paketi ve erişilen tanımlayıcıyı elde etmek için noktalar üzerinden bölün
    • Erişim doğrulama başlığını görüntüleyin: "=== ACCESS VALIDATION ==="
    • Her erişim denemesi için erişimin geçerli olup olmadığını belirleyin:
      • Tanımlayıcıyı içeren paketi bulun
      • Düzeltilmiş tanımlayıcı adının büyük harfle başlayıp başlamadığını kontrol edin (dışa aktarılmış)
      • Tanımlayıcı dışa aktarılmışsa: "[accessing_package] accessing [target_package].[corrected_identifier_name]: ✓ ALLOWED (exported)"
      • Tanımlayıcı dışa aktarılmamışsa: "[accessing_package] accessing [target_package].[corrected_identifier_name]: ✗ DENIED (unexported)"
      • Tanımlayıcı yoksa: "[accessing_package] accessing unknown.[identifier_name]: ✗ NOT FOUND" (paket olarak unknown sözcüğünü yazdırın; bu deneme reddedilmiş erişim sayılır)
    • Özet istatistiklerini sayın ve görüntüleyin:
      • "=== SUMMARY ==="
      • "Total packages analyzed: [number_of_packages]"
      • "Total identifiers processed: [total_number_of_identifiers]"
      • "Identifiers requiring fixes: [number_of_identifiers_that_needed_fixing]"
      • "Access attempts: [number_of_access_attempts]"
      • "Allowed accesses: [number_of_allowed_accesses]"
      • "Denied accesses: [number_of_denied_accesses]"
    • Son önerileri görüntüleyin:
      • Düzeltilmesi gereken tanımlayıcılar varsa: "Recommendation: Fix identifier naming to follow Go conventions"
      • Tüm tanımlayıcılar doğruysa: "All identifiers follow proper Go naming conventions"

Girdi dizelerini bölmek için strings paketini, biçimlendirilmiş çıktı için fmt paketini, tanımlayıcı adlarını kontrol edip değiştirmek için de dize işleme işlevlerini kullanın. Bu alıştırma, Go'nun adlandırma kuralının paket görünürlüğünü nasıl kontrol ettiğini gösterir ve dışa aktarılan ve dışa aktarılmayan tanımlayıcılar arasındaki farkı anlamanıza yardımcı olur.

Kendin dene

package main

import (
	"fmt"
	"strings"
)

func main() {
	// Girdiyi oku
	var packageDefinitions string
	var accessAttempts string
	fmt.Scanln(&packageDefinitions)
	fmt.Scanln(&accessAttempts)

	// TODO: Kodunu aşağıya yaz
	
	// fixIdentifierName fonksiyonunu oluştur
	
	// Paket tanımlarını ayrıştır
	
	// Paket analizini göster
	
	// Erişim denemelerini ayrıştır
	
	// Erişim doğrulamasını göster
	
	// Özet istatistikleri hesapla ve göster
	
	// Önerileri göster
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi