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 getirmenin ve tüm bileşenlerin entegre bir sistem olarak doğru çalıştığını doğrulamanın zamanı geldi. Bu proje boyunca oluşturduğunuz tüm özellikleri çalıştıran kapsamlı bir test senaryosu oluşturacaksınız.
Tamamladığınız sistemdeki yedi dosyanın tamamıyla çalışacaksınız:
Book.java: isbn, title, author, isAvailable, borrowedBy alanlarına vegetDetails()dahil tüm ilgili metotlara sahip Book sınıfınız.User.java: id, name, borrowedBooks listesine ve kitap ödünç alma/iadeye yönelik metotlara sahip User sınıfınız.LibraryException.java: Temel özel istisna sınıfınız.BookNotAvailableException.java: Kullanılamayan kitaplar için istisnanı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, arama ve istisna yönetimi dahil tüm metotlara sahip eksiksiz Library sınıfınız.Main.java: Tüm sistemin birlikte çalışmasını gösterecek entegrasyon testiniz.
Main sınıfınızda, kütüphane sisteminizin tüm önemli özelliklerini test eden bir dizi komutu işleyeceksiniz. Komutlar, şu biçimlerde tek bir virgülle ayrılmış dize olarak gelir:
ADD_BOOK:isbn:title:author- AdminService aracılığıyla kitap eklemeREGISTER_USER:id:name- AdminService aracılığıyla kullanıcı kaydetmeBORROW:userId:isbn- Kitap ödünç alma (istisna yönetimiyle)RETURN:userId:isbn- Kitap iade etmeSEARCH_TITLE:keyword- Kitapları başlığa göre aramaSEARCH_AUTHOR:keyword- Kitapları yazara göre aramaREMOVE_BOOK:isbn- AdminService aracılığıyla kitap çıkarma
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]':ifadesini ve ardından eşleşen her kitabın ayrıntılarını yazdırın veyaNo resultsyazdırın - SEARCH_AUTHOR: Başlık aramasıyla aynı biçim
- REMOVE_BOOK:
Removed: [isbn]veyaCannot remove: [isbn]
Tüm komutlardan sonra son bir özet yazdırın:
--- Final Status ---Books: [count]Users: [count]- Her kullanıcı için
[name]: [borrowedCount] book(s)yazdırın
Bir girdi alacaksınız: virgülle ayrılmış komut dizesi.
Ö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 şu olurdu:
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, tüm bileşenlerinizin, sınıflarınızın, arayüzlerinizin, istisnalarınızın ve kütüphane mantığınızın 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
// --- Final Status ---
// 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ıÖdünç Alma SistemiArama İşlevselliğiYönetici ArayüzüException Handling EntegrasyonuTest ve Entegrasyon2Eriş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ıKendi başına pratik yap: Online Java derleyicisi