Java OOP'nin ileri konularını — inheritance, abstract class, interface, polymorphism, composition, enum — gerçekçi bir şirket bordro modelinde uygulayacaksın. Üç farklı çalışan tipinin maaşı, aynı calculateSalary() metodu ile ama tamamen farklı formüllerle hesaplanır. Süre: ~5-7 saat.
abstractsınıf veabstractmetod tanımlama (Person,Employee)- Inheritance +
super(...)ile constructor chaining - Runtime polymorphism:
calculateSalary()gerçek tipe göre çalışır interface(Payable) ve interface segregation- Composition over inheritance (
Department"has-a"Employee[]) enum+ davranış (Rankmaaş çarpanı taşır)equals/hashCodebusiness key tabanlı overrideStringBuilderile metin oluşturma
Person (abstract)
└── Employee (abstract, implements Payable)
├── Developer → maaş = (baz + deneyim*1000) * kıdem çarpanı
├── Manager → maaş = (baz + ekip*500) * kıdem çarpanı
└── Intern → maaş = 8000 (sabit, çarpan yok)
Department → Employee[] içerir (composition)
Rank (enum) → JUNIOR(1.0) MID(1.3) SENIOR(1.7) LEAD(2.2)
Payable (interface) → calculateSalary()
- Java 17+ kurulu olmalı (
java -version). - IDE: IntelliJ IDEA Community veya VS Code + Java Extension Pack.
Payable.javaveRank.javahazır verildi — onlara dokunma. Diğer dosyalardaki// TODO N:yorumlarını sırayla çöz.
- Person.java (TODO 1-2): Constructor validation — boş ad ve geçersiz yaş için
IllegalArgumentException. (Alan atamaları zaten yazılı.) - Employee.java (TODO 3-7): Constructor validation (baz maaş, rank),
describe(),equals()/hashCode()(ad + rol). - Developer.java (TODO 8-10): Deneyim validation,
getRole(),calculateSalary()formülü. - Manager.java (TODO 11-13): Ekip validation,
getRole(),calculateSalary()formülü. - Intern.java (TODO 14-15):
getRole(), sabitcalculateSalary(). - Department.java (TODO 16-22): Constructor validation,
addMember(),getTotalPayroll(),getMembers()(kopya),toString()(StringBuilder).
💡 Liskov Substitution: Her
Employeealt tipi,Employeebeklenen her yerde sorunsuz çalışmalı. Composition over inheritance:DepartmentbirEmployeeDEĞİLDİR; çalışanlara sahiptir.@Overrideannotation'ını eksiksiz yaz.enum'a metod/veri ekleyebilirsin (Rank.getMultiplier()).getMembers()iç diziyi doğrudan döndürme — kopya döndür.
Main'i çalıştırınca (sınıflar tamamlandığında) şuna benzer çıktı görürsün:
=== Şirket Çalışan Sistemi (Demo) ===
Developer Ada (SENIOR), maaş=13600.00
Manager Bora (LEAD), maaş=17600.00
Intern Cem (JUNIOR), maaş=8000.00
Departman: Engineering (3 çalışan)
Toplam bordro: 39200.00
Projede 20 JUnit testi var (tests/). Testleri çalıştırınca skorun otomatik Kaizu paneline işlenir.
1. Öğrenci numaranı gir. student_id.txt dosyasına Kaizu öğrenci numaranı yaz. (Bir kez.)
2. Testleri çalıştır.
- macOS / Linux:
./run-tests.sh• Windows:.\run-tests.ps1
İlk çalıştırmada JUnit kütüphanesi (~6 MB) lib/'e iner. Başlangıçta testler kırmızı; TODO'ları çözdükçe yeşile döner.
3. Skor otomatik gider. Tüm testler geçince (20/20) panelde yeşil tik gelir.
Skor için testleri
run-tests.shile çalıştır.
Contractor(sözleşmeli) sınıfı ekle —Employee'den türemeden sadecePayableimplement etsin (interface segregation).Department.highestPaidMember()— çalışanları döngüyle gezip en yüksek maaşlıyı döndür.Rank'egetDisplayName()ekle (örn. LEAD → "Takım Lideri").
Takılırsan proje sayfasındaki "Çözümü Göster" butonunu kullan (proje verildikten 3 gün sonra açılır). Önce en az 1 saat kendin uğraş — tests/ hata mesajları iyi bir rehber.