Yönetici Arayüzü
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 81 / 87.
Görev
KolayKütüphane Yönetim Sisteminizi bir Yönetici Arayüzü ile genişletelim! Gerçek bir kütüphanenin yönetim özelliklerine ihtiyacı vardır: koleksiyona yeni kitaplar eklemek, güncelliğini yitirmiş kitapları kaldırmak ve yeni üyeleri kaydetmek. Bu yönetim işlemlerini tanımlayan bir arayüz oluşturacak ve bunları özel bir yönetici sınıfında uygulayacaksınız.
Mevcut kodunuzu beş dosya üzerinden geliştirmeye devam edeceksiniz:
Book.java: Mevcut tüm işlevleriyle Book sınıfınızı koruyun: isbn, title, author, isAvailable, borrowedBy, getDetails() ve uygun getter/setter metotları.User.java: id, name, borrowedBooks ArrayList'i, borrowBook(), returnBook(), getBorrowedCount() ve toString() ile User sınıfınızı değiştirmeden koruyun.Library.java: Mevcut tüm metotlarıyla Library sınıfınızı koruyun. Koleksiyondan ISBN değerine göre bir kitabı bulan ve kaldıran yeni birremoveBook(String isbn)metodu ekleyin. Kitap bulunup kaldırıldıysa metottrue, aksi takdirdefalsedöndürmelidir. Bir kitap yalnızca o anda mevcutsa (ödünç alınmamışsa) kaldırılabilir.LibraryAdmin.java: Yönetim işlemleri için sözleşmeyi tanımlayanLibraryAdminadlı bir arayüz oluşturun. Arayüzünüz üç metot bildirmelidir:addBook(String isbn, String title, String author)- başarıyı belirten bir boolean döndürürremoveBook(String isbn)- başarıyı belirten bir boolean döndürürregisterUser(String id, String name)- başarıyı belirten bir boolean döndürür
Ardından bu arayüzü uygulayan
AdminServiceadlı bir sınıf oluşturun. AdminService, bir Library referansı tutmalı (yapıcısı aracılığıyla iletilir) ve uygun geri bildirimler eklerken üç metodun tümünü Library'ye yönlendirerek uygulamalıdır. Bir kitap eklerken yeni bir Book oluşturun ve kütüphaneye ekleyin. Bir kullanıcı kaydederken yeni bir User oluşturun ve onu kaydedin.Main.java: Yönetici sisteminizi gösterin! Tek bir virgülle ayrılmış dize olarak bir dizi yönetici komutu alacaksınız. Her komut aşağıdaki biçimlerden birini izler:ADD_BOOK:isbn:title:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW:userId:isbn
Bir Library ve bir AdminService oluşturun. Her komutu işleyin ve sonucu yazdırın:
- ADD_BOOK için: başarı durumunda
Added: [title]yazdırın - REMOVE_BOOK için: başarı durumunda
Removed: [isbn], kitap mevcut değilse veya ödünç alınmışsaCannot remove: [isbn]yazdırın - REGISTER_USER için:
Registered: [name]yazdırın - BORROW için: mevcut kütüphane ödünç alma işlevini kullanın
Tüm komutları işledikten sonra
Library status:ifadesini ve ardından her kitabın ayrıntılarını ve bulunabilirlik durumunu[details] - [Available/Borrowed]biçiminde yazdırın.
Bir girdi alacaksınız: virgülle ayrılmış bir komut dizesi.
Örneğin, REGISTER_USER:U001:Alice,ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Design Patterns:Gang of Four,BORROW:U001:ISBN-001,REMOVE_BOOK:ISBN-001,REMOVE_BOOK:ISBN-002 girdisiyle çıktınız şöyle olur:
Registered: Alice
Added: Clean Code
Added: Design Patterns
Alice borrowed Clean Code
Cannot remove: ISBN-001
Removed: ISBN-002
Library status:
[ISBN-001] Clean Code by Robert Martin - BorrowedYönetici arayüzünün yönetim işlemleri için temiz bir sözleşme sağlarken AdminService uygulamasının gerçek mantığı ele aldığına dikkat edin. Sistem, ödünç alınmış bir kitabın kaldırılmasını doğru şekilde engellerken mevcut kitapların kaldırılmasına izin verir. Arayüz ile uygulamanın bu şekilde ayrılması, kodunuzu daha sürdürülebilir ve test edilebilir hâle getiren temel bir OOP ilkesidir!
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];
library.borrowBook(userId, isbn);
}
}
// Print library status
System.out.println("Library status:");
ArrayList<Book> allBooks = library.getAllBooks();
for (Book book : allBooks) {
String status = book.isAvailable() ? "Available" : "Borrowed";
System.out.println(book.getDetails() + " - " + status);
}
}
}
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