Ödünç Alma Sistemi
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 79 / 87.
Görev
KolayKitap ve kullanıcı koleksiyonunu yöneten bir Library sınıfı ile düzgün bir ödünç alma sistemi oluşturarak Kütüphane Yönetim Sistemi'ni oluşturmaya devam edelim. Burası, sisteminizin gerçek bir kütüphane gibi hissettirmeye başladığı yerdir; kimde ne olduğunu takip eder ve ödünç alma kurallarını uygular!
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Book.java: Önceki challenge'daki Book sınıfınızı tüm işlevleriyle (isbn, title, author, isAvailable, borrowedBy, getDetails() ve uygun getter/setter metotları) koruyun.User.java: User sınıfınızı id, name, borrowedBooks ArrayList'i, borrowBook(), returnBook(), getBorrowedCount() ve toString() metotlarıyla koruyun.Library.java: Her şeyi yöneten merkeziLibrarysınıfını oluşturun. Kütüphaneniz iki ArrayList tutmalıdır; biriBooknesneleri için, diğeriUsernesneleri için. Şu metotları ekleyin:addBook(Book book)- kütüphanenin koleksiyonuna bir kitap ekler.registerUser(User user)- kütüphanenin kayıtlı kullanıcılarına bir kullanıcı ekler.findBookByIsbn(String isbn)- kitaplar arasında arama yapar ve eşleşen ISBN'ye sahip Book nesnesini döndürür, bulunamazsanulldöndürür.findUserById(String id)- kullanıcılar arasında arama yapar ve eşleşen ID'ye sahip User nesnesini döndürür, bulunamazsanulldöndürür.borrowBook(String userId, String isbn)- kullanıcıyı ve kitabı bulur, eğer her ikisi de mevcutsa ve kitap müsaitse, kullanıcının kitabı ödünç almasını sağlar ve[userName] borrowed [bookTitle]yazdırır. Kitap müsait değilse,Book not availableyazdırır. Kullanıcı veya kitap bulunamazsa,Invalid user or bookyazdırır.returnBook(String userId, String isbn)- kullanıcıyı ve kitabı bulur, ardından kullanıcının kitabı iade etmesini sağlar ve[userName] returned [bookTitle]yazdırır. Kullanıcı veya kitap bulunamazsa,Invalid user or bookyazdırır.Main.java: Kütüphane sisteminizi bir araya getirin! İki kitap (her biri için ISBN, başlık, yazar), bir kullanıcı (ID, isim) ve ardından bir dizi işlem için girdiler alacaksınız.Bir Library oluşturun, her iki kitabı da ekleyin ve kullanıcıyı kaydedin. Ardından işlemleri işleyin; her işlemin
borrow:userId:isbnveyareturn:userId:isbnşeklinde formatlandığı virgülle ayrılmış bir dize alacaksınız.Tüm işlemleri işledikten sonra, her kitabın durumunu
[isbn]: [Available/Borrowed]formatında gösteren bir özet yazdırın.
Girdileri şu sırayla alacaksınız: book1 ISBN, book1 title, book1 author, book2 ISBN, book2 title, book2 author, user ID, user name ve son olarak işlemler dizesi.
Örneğin, ISBN-001, Clean Code, Robert Martin, ISBN-002, Design Patterns, Gang of Four, U001, Alice girdileri ve borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001 işlem dizesi ile çıktınız şöyle olacaktır:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: BorrowedBu challenge, uyumlu bir sistem oluşturmak için kompozisyon, kapsülleme (encapsulation) ve metot tasarımını bir araya getirir. Library sınıfı, genel koleksiyonu yönetirken asıl ödünç alma mantığını User ve Book sınıflarına devreden bir koordinatör görevi görür!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Kitap 1 bilgilerini oku
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Kitap 2 bilgilerini oku
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Kullanıcı bilgilerini oku
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// İşlem dizisini oku (virgülle ayrılmış, format: borrow:userId:isbn veya return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: book1 ve book2 için Book nesneleri oluştur
// TODO: Bir User nesnesi oluştur
// TODO: Bir Library oluştur, her iki kitabı ekle ve kullanıcıyı kaydet
// TODO: operationsStr'yi "," ile ayır ve her bir işlemi işle
// Her işlem için, action, userId, isbn bilgilerini almak için ":" ile ayır
// Duruma göre library.borrowBook() veya library.returnBook() çağır
// TODO: Her kitap için "[isbn]: [Available/Borrowed]" formatında özet yazdır
}
}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ı