Java Collections (List, Set, Map, TreeSet) ile SOLID prensiplerini bir arada uygulayacaksın. Kitap/üye/yazar modelini ayrı sorumluluk sınıflarına (repository + service) bölerek temiz, genişletilebilir bir tasarım kuracaksın. Süre: ~5-7 saat.
List<Book>,Set<Member>,Map<Writer, List<Book>>bir arada kullanımıTreeSet<Book>+Comparableile yayın yılına göre sıralı koleksiyonequals/hashCodebusiness key üzerinden (Book: ISBN, Member: id, Writer: ad)- SOLID — SRP: her sınıf tek sorumluluk (
BookRepository,MemberRepository,BorrowServiceayrı) - SOLID — DIP:
Repository<T>interface'ine bağımlılık, somut sınıfa değil - Generic interface (
Repository<T>) - Servis katmanının repository'leri orkestra etmesi
Repository<T> (interface — DIP)
├── BookRepository implements Repository<Book> → kitap CRUD + booksOf(writer) + booksSortedByYear()
└── MemberRepository implements Repository<Member> → üye CRUD + findById + contains
BorrowService → borrow / returnBook / borrowedBy / isBorrowed (repository'leri kullanır)
Library → tüm parçaları birleştiren facade
Book (Comparable, yıla göre) | Member | Writer → POJO entity'ler
- Java 17+ kurulu (
java -version). - IDE: IntelliJ IDEA Community veya VS Code + Java Extension Pack.
src/altındaki dosyalardaki// TODO N:yorumlarını sırayla çöz.Main.javademo amaçlı hazır.
- Entity'ler (
Book,Member,Writer):equals/hashCodebusiness key üzerinden;BookayrıcaComparable(yayın yılı). - Repository interface: generic CRUD sözleşmesi.
- BookRepository / MemberRepository:
Repository<T>implement et; özel sorgular (findByIsbn,booksOf,booksSortedByYear,findById). - BorrowService: ödünç alma/iade mantığı — bir kitap aynı anda tek üyede olabilir.
- Library: repository + service'i birleştiren üst seviye API.
TODO numaraları her dosyanın içinde sırasıyla açıklanmıştır.
- SRP: "Repository veriyi saklar, Service iş kuralını uygular" — borrow mantığını repository'ye koyma.
- DIP:
LibrarysomutBookRepository'ye değil, mümkünseRepository<Book>soyutlamasına bağlansın. - Program to interface:
List<Book> x = new ArrayList<>(). TreeSet'tecompareTo0 dönerse eleman atlanır — yıl eşitliğinde ISBN ile ikincil ayrım düşün.equals/hashCodeçiftini birlikte override et.
- Aynı ISBN'li kitabı iki kez ekle → tekil kalmalı.
- Bir kitabı ödünç al →
isBorrowedtrue, başka üye aynı kitabı alamamalı. - İade et → tekrar ödünç alınabilir olmalı.
booksSortedByYear()→ yayın yılına göre sıralı dönmeli.- Bir yazarın kitaplarını sorgula → sadece o yazarın kitapları gelmeli.
Projede 22 JUnit testi var (tests/LibrarySystemTest.java). 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 (22/22) panelde yeşil tik gelir.
- Üyenin aynı anda en fazla 3 kitap alabilmesi kuralı (
BorrowService). overdueBooks()— son iade tarihi geçmiş kitaplar (tarih alanı ekle).
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ş.