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ü (Admin Interface) ile genişletelim! Gerçek bir kütüphanenin idari yeteneklere ihtiyacı vardır; koleksiyona yeni kitaplar eklemek, güncelliğini yitirmiş olanları çıkarmak ve yeni üyeler kaydetmek. Bu idari işlemleri tanımlayan bir arayüz oluşturacak ve bunları özel bir yönetici sınıfında uygulayacaksınız.
Mevcut kodunuzu beş dosya üzerinde oluşturmaya devam edeceksiniz:
Book.java: Book sınıfınızı tüm mevcut 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, borrowBook(), returnBook(), getBorrowedCount() ve toString() ile değiştirmeden koruyun.Library.java: Library sınıfınızı tüm mevcut metotlarıyla koruyun. Koleksiyondan ISBN numarasına göre bir kitabı bulan ve silen yeni birremoveBook(String isbn)metodu ekleyin. Metot, kitap bulunup silindiysetrue, aksi takdirdefalsedöndürmelidir. Bir kitap yalnızca şu anda mevcutsa (ödünç alınmamışsa) silinebilir.LibraryAdmin.java: İdari işlemler için sözleşmeyi tanımlayanLibraryAdminadında bir arayüz (interface) oluşturun. Arayüzünüz üç metot bildirmelidir:addBook(String isbn, String title, String author)- başarısını belirten bir boolean döndürürremoveBook(String isbn)- başarısını belirten bir boolean döndürürregisterUser(String id, String name)- başarısını belirten bir boolean döndürür
Ardından bu arayüzü uygulayan
AdminServiceadında bir sınıf oluşturun. AdminService, bir Library referansı tutmalı (constructor aracılığıyla iletilir) ve uygun geri bildirimleri eklerken işlemleri Library sınıfına devrederek (delegating) üç metodu da 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 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 şu formatlardan 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 yoksa 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:yazdırın ve ardından her kitabın ayrıntılarını ve kullanılabilirlik durumunu[details] - [Available/Borrowed]formatında yazdırın.
Bir girdi alacaksınız: virgülle ayrılmış komutlar dizisi.
Ö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 olacaktır:
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 idari işlemler için nasıl temiz bir sözleşme sağladığına, AdminService uygulamasının ise asıl mantığı nasıl yönettiğine dikkat edin. Sistem, ödünç alınan bir kitabın silinmesini doğru bir şekilde engellerken, mevcut olanların silinmesine izin verir. Arayüz ve uygulamanın bu şekilde ayrılması, kodunuzu daha bakımı kolay ve test edilebilir kılan temel bir OOP prensibidir!
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 bir 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);
}
}
// Kütüphane durumunu yazdır
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ı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ı