Menu
Coddy logo textTech

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, fonksiyonlar, tipler vb.) görünürlüğü basit bir isimlendirme kuralı ile 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. Bunları "genel" olarak düşünebilirsin; paketini içe aktaran herkes tarafından kullanılabilirler.

// Bunlar dışa aktarılır (public)
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ıştır (özel)
var age int
func helper() string
type config struct

Bu isimlendirme kuralı, Go'nun public veya private gibi anahtar kelimelere ihtiyaç duymadan erişimi kontrol etme yöntemidir. Başka bir paketten dışa aktarılmamış bir tanımlayıcıyı kullanmaya çalıştığınızda, Go size bir derleme hatası verecektir çünkü bu tanımlayıcı kendi paketinin dışında görünür değildir.

challenge icon

Görev

Kolay

Dışa aktarılan ve dışa aktarılmayan tanımlayıcılar için adlandırma kuralını düzelterek bir Go paketindeki görünürlük sorunlarını giderin. Bazı tanımlayıcıların yanlış adlandırıldığı ve diğer paketlerden erişildiklerinde derleme hatalarına neden olduğu, simüle edilmiş çok paketli bir senaryoyla çalışacaksınız.

İki girdi alacaksınız:

  • "package_name:identifier1:type1:visibility1,identifier2:type2:visibility2|package_name:identifier1:type1:visibility1" biçiminde paket tanımlarını içeren bir dize (örneğin, "utils:helper:function:private,Calculate:function:public|main:name:variable:private,Version:variable:public")
  • "accessing_package.identifier1,accessing_package.identifier2,accessing_package.identifier3" biçiminde erişim girişimlerini içeren bir dize (örneğin, "main.helper,main.Calculate,utils.Version")

Göreviniz:

  1. Bireysel paket tanımlarını elde etmek için ilk girdiyi dikey çizgilere göre ayırın
  2. Her paket tanımı için paket adını ve tanımlayıcılarını elde etmek üzere iki nokta üst üste işaretlerine göre ayırın
  3. Her tanımlayıcı tanımı için tanımlayıcı adını, türünü ve amaçlanan görünürlüğünü elde etmek üzere iki nokta üst üste işaretlerine göre ayırın
  4. fixIdentifierName adlı, bir tanımlayıcı adı ve amaçlanan görünürlüğü alan ve düzeltilmiş adı döndüren 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]) ✓"
    • Bireysel erişim girişimlerini elde etmek için ikinci girdiyi virgüllere göre ayırın
    • Her erişim girişimi için erişen paketi ve erişilen tanımlayıcıyı elde etmek üzere noktaya göre ayırın
    • Erişim doğrulama başlığını görüntüleyin: "=== ACCESS VALIDATION ==="
    • Her erişim girişimi 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ı mevcut değilse: "[accessing_package] accessing [target_package].[identifier_name]: ✗ NOT FOUND"
    • Ö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 ayırmak için strings paketini, biçimlendirilmiş çıktı için fmt paketini ve tanımlayıcı adlarını kontrol edip değiştirmek için dize işleme işlevlerini kullanın. Bu görev, Go'nun adlandırma kuralının paket görünürlüğünü nasıl denetlediğini gösterir ve dışa aktarılan ile 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() {
	// Girişi oku
	var packageDefinitions string
	var accessAttempts string
	fmt.Scanln(&packageDefinitions)
	fmt.Scanln(&accessAttempts)

	// TODO: Kodunuzu aşağıya yazın
	
	// fixIdentifierName fonksiyonunu oluşturun
	
	// Paket tanımlarını ayrıştırın
	
	// Paket analizini görüntüleyin
	
	// Erişim denemelerini ayrıştırın
	
	// Erişim doğrulamasını görüntüleyin
	
	// Özet istatistikleri hesaplayın ve görüntüleyin
	
	// Önerileri görüntüleyin
}
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