Özet - Çalışan Hiyerarşisi
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 40 / 107.
Görev
KolayBir şirketin gerçek dünya organizasyon yapılarını kompozisyonun (composition) nasıl zarif bir şekilde modellediğini gösteren bir çalışan hiyerarşisi sistemi kuralım. Özel rollerin kendi benzersiz davranışlarıyla genişletebileceği temel bir çalışan türü oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
employee.go:ID,NameveBaseSalary(float64) alanlarını içeren birEmployeeyapısı (struct) ile temeli oluşturun. Ona iki metot ekleyin:[ID] [Name]döndürenInfo() string- Temel maaşın %10'unu döndüren
CalculateBonus() float64
roles.go:Employeeyapısını gömen (embed) iki özel çalışan türü oluşturun:TeamSizealanına (int) sahipManager— yöneticiler daha yüksek bir bonus alır: temel maaşın %20'si artı ekip üyesi başına 100$. Bunu uygulamak içinCalculateBonusmetodunu gölgeleyin (shadow).Languagealanına (string) sahipDeveloper— geliştiriciler standart bonusu korur ancak programlama dillerini eklemek içinInfometodunu gölgelerler:[ID] [Name] ([Language])
main.go: Girdiden çalışan ayrıntılarını okuyun, bir Manager ve bir Developer oluşturun, ardından her çalışanın bilgisini ve hesaplanan bonusunu görüntüleyin.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Manager ID
- Satır 2: Manager name
- Satır 3: Manager base salary (float64)
- Satır 4: Manager team size (integer)
- Satır 5: Developer ID
- Satır 6: Developer name
- Satır 7: Developer base salary (float64)
- Satır 8: Developer programming language
Her çalışan için, bilgilerini ve ardından bir sonraki satırda bonuslarını yazdırın. Bonusları iki ondalık basamakla formatlayın.
Örneğin, M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000 ve Go verildiğinde, çıktınız şöyle olmalıdır:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00Yöneticinin bonus hesaplamasının (80000'in %20'si + 5×100 = 16500) Geliştiricinin standart %10 bonusundan nasıl farklılaştığına ve Geliştiricinin bilgilerinin nasıl görüntülendiğini nasıl özelleştirdiğine dikkat edin. Her iki tür de gömülü Employee alanlarına erişmeye devam eder ve gerektiğinde orijinal metotları çağırabilir.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Manager detaylarını oku
managerID, _ := reader.ReadString('\n')
managerID = strings.TrimSpace(managerID)
managerName, _ := reader.ReadString('\n')
managerName = strings.TrimSpace(managerName)
managerSalaryStr, _ := reader.ReadString('\n')
managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)
teamSizeStr, _ := reader.ReadString('\n')
teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))
// Developer detaylarını oku
devID, _ := reader.ReadString('\n')
devID = strings.TrimSpace(devID)
devName, _ := reader.ReadString('\n')
devName = strings.TrimSpace(devName)
devSalaryStr, _ := reader.ReadString('\n')
devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)
devLanguage, _ := reader.ReadString('\n')
devLanguage = strings.TrimSpace(devLanguage)
// TODO: Okunan değerleri kullanarak bir Manager oluşturun
// Hint: Kompozisyon kullanın - Manager, Employee yapısını gömer
// TODO: Okunan değerleri kullanarak bir Developer oluşturun
// Hint: Kompozisyon kullanın - Developer, Employee yapısını gömer
// TODO: Manager bilgilerini ve bonusunu yazdırın (bonus 2 ondalık basamakla formatlanmış olmalı)
// Formatlama için "%.2f" ile fmt.Printf kullanın
// TODO: Developer bilgilerini ve bonusunu yazdırın (bonus 2 ondalık basamakla formatlanmış olmalı)
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool