Kitap ve Kullanıcı Modelleri
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 63 / 70.
Görev
KolayDaha zengin işlevler ekleyerek Book ve User modellerini geliştirip Library System'inizi genişletelim. Kitaplar için durum takibi, kullanıcılar için ödünç alma özellikleri ve verilerinizi güvende tutmak için uygun kapsülleme ekleyeceksiniz.
Dört dosyalı yapınızla çalışmaya devam edeceksiniz:
Book.cs: Book sınıfınızı benzersiz bir tanımlayıcı ve durum takibiyle geliştirin. Her kitabın birId(string),Title(string),Author(string) ve varsayılan değeri true olan birIsAvailable(bool) özelliği olmalıdır. Kullanılabilirlik durumunu değiştiren ve işlemin başarılı ya da başarısız olduğunu belirten bir mesaj döndürenBorrow()veReturn()metotlarını ekleyin. Birisi kullanılamayan bir kitabı ödünç almaya çalışırsa"{Title} is not available"döndürün. Kullanılabilir durumda olan bir kitabı iade etmeye çalışılırsa"{Title} was not borrowed"döndürün. Başarılı işlemler"{Title} has been borrowed"veya"{Title} has been returned"döndürmelidir.User.cs: Ödünç alınan kitapları takip edecek şekilde User sınıfınızı genişletin.Name(string),MemberId(int) ve ödünç alınan kitap kimliklerini depolamak için private bir liste ekleyin. Kullanıcının o anda sahip olduğu kitap sayısını döndüren salt okunur birBorrowedCountözelliği ekleyin. Kullanıcının ödünç aldığı kitapları yönetmek içinAddBorrowedBook(string bookId)veRemoveBorrowedBook(string bookId)metotlarını ekleyin. Ayrıca, kullanıcının belirtilen kitabı ödünç almış olması durumunda true döndüren birHasBook(string bookId)metodu ekleyin.Library.cs: Library sınıfınız kitap ve kullanıcı koleksiyonlarını yönetmelidir. Kütüphaneyi doldurmak içinAddBook(Book book)veRegisterUser(User user)metotlarını ekleyin. Bu kimliğe sahip kitabı (bulunamazsa null) döndüren birGetBookById(string id)metodu ve kullanıcılar için benzer şekilde çalışan birGetUserById(int memberId)metodu ekleyin.Program.cs: Girdiye dayalı kütüphane işlemlerini gerçekleştirerek her şeyi bir araya getirin.
Aşağıdaki girdileri alacaksınız:
- Kütüphane adı
- Eklenecek kitap sayısı
- Her kitap için:
id|title|author - Kaydedilecek kullanıcı sayısı
- Her kullanıcı için:
name|memberId - Gerçekleştirilecek işlem sayısı
- Her işlem için: action'ın
action|bookId|memberIdveyaborrowolduğureturn
Her işlem için ödünç alma veya iade işleminin sonucunu yazdırın. Tüm işlemlerden sonra, her kullanıcı için adını ve o anda ödünç aldığı kitap sayısını {Name}: {BorrowedCount} book(s) biçiminde gösteren bir özet yazdırın.
Örneğin girdiler şöyleyse:
Downtown Library
2
B001|Clean Code|Robert Martin
B002|Design Patterns|Gang of Four
2
Alice|101
Bob|102
4
borrow|B001|101
borrow|B002|101
borrow|B001|102
return|B001|101Çıktı şöyle olmalıdır:
Clean Code has been borrowed
Design Patterns has been borrowed
Clean Code is not available
Clean Code has been returned
Alice: 1 book(s)
Bob: 0 book(s)Alice'nin iki kitabı başarıyla ödünç aldığını, ancak Bob Alice'nin zaten sahip olduğu Clean Code'u ödünç almaya çalıştığında işlemin başarısız olduğunu fark edin. Alice Clean Code'u iade ettikten sonra sayısı 1'e düşer. Bu, modellerinizin kütüphane kurallarını uygulamak için birlikte nasıl çalıştığını gösterir!
Kendin dene
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Kütüphane adını oku
string libraryName = Console.ReadLine();
// Kütüphane adıyla bir Library örneği oluştur
Library library = new Library(libraryName);
// Kitap sayısını oku
int numBooks = Convert.ToInt32(Console.ReadLine());
// Kitapları oku ve ekle
for (int i = 0; i < numBooks; i++)
{
string bookInput = Console.ReadLine();
string[] bookParts = bookInput.Split('|');
string bookId = bookParts[0];
string bookTitle = bookParts[1];
string bookAuthor = bookParts[2];
Book book = new Book(bookId, bookTitle, bookAuthor);
library.AddBook(book);
}
// Kullanıcı sayısını oku
int numUsers = Convert.ToInt32(Console.ReadLine());
// Kullanıcıları oku ve kaydet
List<User> usersList = new List<User>();
for (int i = 0; i < numUsers; i++)
{
string userInput = Console.ReadLine();
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
User user = new User(userName, memberId);
library.RegisterUser(user);
usersList.Add(user);
}
// İşlem sayısını oku
int numOperations = Convert.ToInt32(Console.ReadLine());
// İşlemleri işle
for (int i = 0; i < numOperations; i++)
{
string operationInput = Console.ReadLine();
string[] opParts = operationInput.Split('|');
string action = opParts[0];
string bookId = opParts[1];
int memberId = Convert.ToInt32(opParts[2]);
Book book = library.GetBookById(bookId);
User user = library.GetUserById(memberId);
if (action == "borrow")
{
string result = book.Borrow();
Console.WriteLine(result);
if (result.Contains("has been borrowed"))
{
user.AddBorrowedBook(bookId);
}
}
else if (action == "return")
{
string result = book.Return();
Console.WriteLine(result);
if (result.Contains("has been returned"))
{
user.RemoveBorrowedBook(bookId);
}
}
}
// Her kullanıcı için özeti yazdır
foreach (User user in usersList)
{
Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
}
}
}
}Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarı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ı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları9Değişken Argümanlar
'params' Anahtar Kelimesiİsteğe Bağlı Parametrelerİsimlendirilmiş ArgümanlarMetot Aşırı Yükleme12Proje: Kütüphane Sistemi
Proje YapısıKitap ve Kullanıcı ModelleriÖdünç Alma Sistemi MantığıArama için LINQKonsol Arayüzü / Yönetici ArayüzüBirim Testi (NUnit/xUnit)Kendi başına pratik yap: Online C# derleyicisi