Test ve Entegrasyon
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 83 / 87.
Görev
KolayKütüphane Yönetim Sisteminizi oluşturduğunuz için tebrikler! Şimdi her şeyi bir araya getirme ve tüm bileşenlerin entegre bir sistem olarak doğru çalıştığını doğrulama zamanı. Bu proje boyunca oluşturduğunuz tüm özellikleri çalıştıran kapsamlı bir test senaryosu oluşturacaksınız.
Tamamlanmış sisteminizdeki yedi dosyanın tamamıyla çalışacaksınız:
Book.java: isbn, title, author, isAvailable, borrowedBy alanlarını vegetDetails()dahil tüm ilgili metotları içeren Book sınıfınız.User.java: id, name, borrowedBooks listesini ve kitap ödünç alma/iade etme metotlarını içeren User sınıfınız.LibraryException.java: Temel özel istisna (exception) sınıfınız.BookNotAvailableException.java: Mevcut olmayan kitaplar için istisna sınıfınız.LibraryAdmin.java: Yönetici arayüzünüz ve AdminService uygulamanız.Library.java: Kitap ekleme/çıkarma, kullanıcı kaydetme, ödünç alma/iade etme, arama ve istisna yönetimi gibi tüm metotları içeren eksiksiz Library sınıfınız.Main.java: Tüm sistemin birlikte çalıştığını gösterecek olan entegrasyon testiniz.
Main sınıfınızda, kütüphane sisteminizin her ana özelliğini test eden bir dizi komutu işleyeceksiniz. Komutlar, şu formatlarda virgülle ayrılmış tek bir dize olarak gelir:
ADD_BOOK:isbn:title:author- AdminService aracılığıyla kitap ekleREGISTER_USER:id:name- AdminService aracılığıyla kullanıcı kaydetBORROW:userId:isbn- Kitap ödünç al (istisna yönetimi ile)RETURN:userId:isbn- Kitap iade etSEARCH_TITLE:keyword- Başlığa göre kitap araSEARCH_AUTHOR:keyword- Yazara göre kitap araREMOVE_BOOK:isbn- AdminService aracılığıyla kitap çıkar
Her komutu işleyin ve uygun çıktıyı yazdırın:
- ADD_BOOK:
Added: [title] - REGISTER_USER:
Registered: [name] - BORROW: Başarı mesajını veya
Error: [exception message]yazdırın - RETURN:
[userName] returned [bookTitle] - SEARCH_TITLE:
Search '[keyword]':yazdırın, ardından eşleşen her kitabın detaylarını veyaNo resultsyazdırın - SEARCH_AUTHOR: Başlık aramasıyla aynı format
- REMOVE_BOOK:
Removed: [isbn]veyaCannot remove: [isbn]
Tüm komutlardan sonra final özetini yazdırın:
--- Final Status ---Books: [count]Users: [count]- Her kullanıcı için şunu yazdırın:
[name]: [borrowedCount] book(s)
Bir girdi alacaksınız: virgülle ayrılmış komut dizisi.
Örneğin, ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Effective Java:Joshua Bloch,REGISTER_USER:U001:Alice,REGISTER_USER:U002:Bob,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001,SEARCH_TITLE:java,RETURN:U001:ISBN-001,REMOVE_BOOK:ISBN-001 girdisiyle çıktınız şöyle olacaktır:
Added: Clean Code
Added: Effective Java
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Search 'java':
[ISBN-002] Effective Java by Joshua Bloch
Alice returned Clean Code
Removed: ISBN-001
--- Final Status ---
Books: 1
Users: 2
Alice: 0 book(s)
Bob: 0 book(s)Bu son görev; sınıflar, arayüzler, istisnalar ve kütüphane mantığı gibi tüm bileşenlerinizin sorunsuz bir şekilde birlikte çalıştığını doğrular. Eksiksiz ve sağlam bir Kütüphane Yönetim Sistemi oluşturdunuz!
Kendin dene
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Virgülle ayrılmış komutları oku
String input = scanner.nextLine();
String[] commands = input.split(",");
// Library ve AdminService oluştur
Library library = new Library();
AdminService adminService = new AdminService(library);
// Her komutu işle
for (String command : commands) {
String[] parts = command.split(":");
String operation = parts[0];
if (operation.equals("ADD_BOOK")) {
String isbn = parts[1];
String title = parts[2];
String author = parts[3];
if (adminService.addBook(isbn, title, author)) {
System.out.println("Added: " + title);
}
} else if (operation.equals("REMOVE_BOOK")) {
String isbn = parts[1];
if (adminService.removeBook(isbn)) {
System.out.println("Removed: " + isbn);
} else {
System.out.println("Cannot remove: " + isbn);
}
} else if (operation.equals("REGISTER_USER")) {
String id = parts[1];
String name = parts[2];
if (adminService.registerUser(id, name)) {
System.out.println("Registered: " + name);
}
} else if (operation.equals("BORROW")) {
String userId = parts[1];
String isbn = parts[2];
try {
String result = library.borrowBook(userId, isbn);
System.out.println(result);
} catch (LibraryException e) {
System.out.println("Error: " + e.getMessage());
}
}
// TODO: RETURN komutu için işleme ekle
// TODO: SEARCH_TITLE komutu için işleme ekle
// TODO: SEARCH_AUTHOR komutu için işleme ekle
}
// TODO: Son durumu yazdır
// --- Son Durum ---
// Kitaplar: [count]
// Kullanıcılar: [count]
// Her kullanıcı için: [name]: [borrowedCount] kitap
System.out.println("Operations completed");
}
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama10OOP'de İstisna Yönetimi
İstisna Sınıfı HiyerarşisiÖzel İstisnalarDenetimli ve Denetimsiz HatalarTry-With-Resources YapısıÖzet - Doğrulanmış Kullanıcı13Proje: Kütüphane Yönetimi
Proje Genel Bakış ve UML TasarımıKitap ve Kullanıcı Sınıfları2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı