Модели книг и пользователей
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 63 из 70.
Задание
ЛегкоДавайте расширим вашу библиотечную систему, наполнив модели Book и User более богатой функциональностью. Вы добавите отслеживание статуса для книг, возможности заимствования для пользователей и надлежащую инкапсуляцию для обеспечения безопасности ваших данных.
Вы продолжите работу с четырехфайловой структурой:
Book.cs: Улучшите свой класс Book, добавив уникальный идентификатор и отслеживание статуса. Каждая книга должна иметьId(string),Title(string),Author(string) иIsAvailable(bool, по умолчанию true). Добавьте методыBorrow()иReturn(), которые изменяют статус доступности и возвращают сообщение, указывающее на успех или неудачу. Если кто-то пытается взять недоступную книгу, верните"{Title} is not available". Если они пытаются вернуть уже доступную книгу, верните"{Title} was not borrowed". Успешные операции должны возвращать"{Title} has been borrowed"или"{Title} has been returned".User.cs: Расширьте свой класс User для отслеживания взятых книг. ВключитеName(string),MemberId(int) и приватный список для хранения идентификаторов взятых книг. Добавьте свойство только для чтенияBorrowedCount, которое возвращает количество книг, которые в данный момент находятся у пользователя. Включите методыAddBorrowedBook(string bookId)иRemoveBorrowedBook(string bookId)для управления взятыми книгами пользователя. Также добавьте методHasBook(string bookId), который возвращает true, если пользователь взял именно эту книгу.Library.cs: Ваш класс Library должен содержать коллекции книг и пользователей. Включите методыAddBook(Book book)иRegisterUser(User user)для заполнения библиотеки. Добавьте методGetBookById(string id), который возвращает книгу с этим ID (или null, если она не найдена), иGetUserById(int memberId), который работает аналогично для пользователей.Program.cs: Объедините все вместе, обрабатывая библиотечные операции на основе входных данных.
Вы получите следующие входные данные:
- Название библиотеки
- Количество книг для добавления
- Для каждой книги:
id|title|author - Количество пользователей для регистрации
- Для каждого пользователя:
name|memberId - Количество операций для выполнения
- Для каждой операции:
action|bookId|memberId, где action — это либоborrow, либоreturn
Для каждой операции выведите результат действия заимствования или возврата. После всех операций выведите сводку для каждого пользователя, показывающую его имя и количество книг, которые он в данный момент взял, в формате {Name}: {BorrowedCount} book(s).
Например, если входные данные следующие:
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Вывод должен быть таким:
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)Обратите внимание, как Элис успешно берет две книги, но когда Боб пытается взять Clean Code (которая уже есть у Элис), операция не удается. После того как Элис возвращает Clean Code, ее счетчик уменьшается до 1. Это демонстрирует, как ваши модели работают вместе для обеспечения соблюдения библиотечных правил!
Попробуйте сами
using System;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Чтение входных данных
string libraryName = Console.ReadLine();
string bookInput = Console.ReadLine();
string userInput = Console.ReadLine();
// Разбор данных о книге (формат: title|author)
string[] bookParts = bookInput.Split('|');
string bookTitle = bookParts[0];
string bookAuthor = bookParts[1];
// Разбор данных о пользователе (формат: name|memberId)
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
// Создание экземпляра Library с названием библиотеки
Library library = new Library(libraryName);
// Создание экземпляра Book с названием и автором
Book book = new Book(bookTitle, bookAuthor);
// Создание экземпляра User с именем и ID участника
User user = new User(userName, memberId);
// Вывод информации о библиотеке с помощью GetInfo()
Console.WriteLine(library.GetInfo());
// Вывод информации о книге в формате: Book: {Title} by {Author} - Available: {IsAvailable}
Console.WriteLine($"Book: {book.Title} by {book.Author} - Available: {book.IsAvailable}");
// Вывод информации о пользователе в формате: User: {Name} (ID: {MemberId})
Console.WriteLine($"User: {user.Name} (ID: {user.MemberId})");
}
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов12Проект: Система библиотеки
Структура проектаМодели книг и пользователей