Skip to main content

Desktop Application Project: Building a Simple Library Management System in C#

 Let's create a simple library management system using the concepts we've covered throughout this series. The system will manage books, users, and borrow records. The project will include classes, inheritance, interfaces, events, delegates, generics, collections, LINQ, and exception handling.

using System;
using System.Collections.Generic;
using System.Linq;

// Chapter 2.1: Understanding classes, objects, and inheritance
public class User {
  // Chapter 2.4: Understanding properties and indexers
  public int Id {
    get;
    set;
  }
  public string Name {
    get;
    set;
  }
  public DateTime JoinDate {
    get;
    set;
  }

  // Chapter 2.2: Understanding constructors and destructors
  public User(int id, string name) {
    Id = id;
    Name = name;
    JoinDate = DateTime.Now;
  }

  // Chapter 2.3: Understanding access modifiers (public, private, protected, internal)
  protected void PrintUserDetails() {
    Console.WriteLine($"ID: {Id}, Name: {Name}, Joined: {JoinDate}");
  }
}

public class Book {
  public int Id {
    get;
    set;
  }
  public string Title {
    get;
    set;
  }
  public string Author {
    get;
    set;
  }
  public bool IsAvailable {
    get;
    set;
  }

  public Book(int id, string title, string author) {
    Id = id;
    Title = title;
    Author = author;
    IsAvailable = true;
  }
}

// Chapter 3.1: Understanding interfaces, delegates, and events
public interface IBorrowable {
  event EventHandler < BookBorrowedEventArgs > BookBorrowed;

  void BorrowBook(Book book);
}

public class BookBorrowedEventArgs: EventArgs {
  public User User {
    get;
    set;
  }
  public Book Book {
    get;
    set;
  }
  public DateTime BorrowedAt {
    get;
    set;
  }
}

public class LibraryMember: User, IBorrowable {
  // Chapter 6.2: Understanding System.Collections.Generic
  private List < Book > borrowedBooks = new List < Book > ();

  public LibraryMember(int id, string name): base(id, name) {}

  // Chapter 3.1: Events and event handlers
  public event EventHandler < BookBorrowedEventArgs > BookBorrowed;

  public void BorrowBook(Book book) {
    if (book.IsAvailable) {
      book.IsAvailable = false;
      borrowedBooks.Add(book);
      OnBookBorrowed(new BookBorrowedEventArgs {
        User = this, Book = book, BorrowedAt = DateTime.Now
      });
    } else {
      throw new InvalidOperationException("Book is not available");
    }
  }

  protected virtual void OnBookBorrowed(BookBorrowedEventArgs e) {
    BookBorrowed?.Invoke(this, e);
  }
}

class Program {
  static void Main(string[] args) {
    // Chapter 6.4: Understanding System.Linq
    List < Book > books = new List < Book > {
      new Book(1, "The Catcher in the Rye", "J.D. Salinger"),
      new Book(2, "To Kill a Mockingbird", "Harper Lee"),
      new Book(3, "The Great Gatsby", "F. Scott Fitzgerald")
    };

    LibraryMember member = new LibraryMember(1, "John Doe");

    // Chapter 3.1: Event subscription
    member.BookBorrowed += Member_BookBorrowed;

    try {
      member.BorrowBook(books.First(book => book.Id == 1));
    } catch (InvalidOperationException ex) {
      Console.WriteLine($"Error: {ex.Message}");
    }
    try {
      member.BorrowBook(books.First(book => book.Id == 2));
      member.BorrowBook(books.First(book => book.Id == 2)); // Attempt to borrow the same book again
    } catch (InvalidOperationException ex) {
      Console.WriteLine($"Error: {ex.Message}");
    }
  }

  private static void Member_BookBorrowed(object sender, BookBorrowedEventArgs e) {
    Console.WriteLine($"Book Borrowed Event: {e.User.Name} borrowed \"{e.Book.Title}\" by {e.Book.Author} on {e.BorrowedAt}");
  }
}


In this example, we created a simple library management system that allows library members to borrow books. The `User` class demonstrates properties, constructors, and access modifiers. The `LibraryMember` class inherits from `User` and implements the `IBorrowable` interface, showcasing inheritance and interfaces. The `BookBorrowed` event and event handlers are used to notify when a book is borrowed.

We also used generics and collections with the `List<Book>` and `List<User>` objects. The System.Linq namespace was used to find books by their IDs. Lastly, exception handling is demonstrated when attempting to borrow an unavailable book.

The code is structured in a way that is easy to read and understand, while also showcasing the skills of an experienced C# programmer.

Comments

Some of My Bests

ডাটা স্ট্রাকচার- স্ট্যাক (Stack)

Programming is all about data manipulation. Data structure is way of storing data for further manipulation. ডাটা স্ট্রাকচার আমাদেরকে বিভিন্ন ডাটা সাজিয়ে রাখার ব্যবস্থা করে দেয়। ডাটা সাজিয়ে রাখার অনেক গুলো "তরিকা" আছে। কোনকিছু আমরা কেন সাজিয়ে রাখি? যেন পরে নির্দিষ্ট একটা ডাটা সহজে খুঁজে পেতে পারি। "তরিকা" গুলোর নাম Array, Stack, Queue, Linked List, Tree, Graph. এগুলা শ খানেক ডাটা স্ট্রাকচারের মধ্যে কিছুর নাম, যেগুলো অনেক বেশি ব্যবহার হয়। এই পোস্টটা স্ট্যাক বুঝানোর জন্য। স্ট্যাক খুবই ইন্টেরেস্টিং একটা ডাটা স্ট্রাকচার। অনেক কারনেই এটা ব্যাবহার হয়। আগে স্ট্যাক কনসেপ্টটা নিয়ে আলোচনা করা যাক। স্ট্যাক বলতে বোঝায় একটার উপর একটা সাজায়ে রাখা। বিয়ের বাড়িতে আগে মেলামাইনের গ্লাস দেখা যেত একটার ভেতর আরেকটা ঢুকায়ে লম্বা একটা পাইল তৈরি করে একসাথে ক্যারি করা হচ্ছে। এটা একটা স্ট্যাক। প্রোগ্রামিং এর ভাষায় স্ট্যাক এক্সাক্টলি সেইম জিনিসই। তবে একটু ঘষামাজা আছে। আরেকটা উদাহরণ দেয়া যেতে পারে। বয়ামের ভেতর একটার পর আরেকটা বিস্কিট ঢুকিয়ে রাখা হয়। হ্যা, এইটা পারফেক্ট উদাহরণ হয়েছে। এই

ডাটা স্ট্রাকচার- কিউ (Queue)

Programming is all about data manipulation. Data structure is way of storing data for further manipulation. ডাটা স্ট্রাকচার আমাদেরকে বিভিন্ন ডাটা সাজিয়ে রাখার ব্যবস্থা করে দেয়। ডাটা সাজিয়ে রাখার অনেক গুলো "তরিকা" আছে। কোনকিছু আমরা কেন সাজিয়ে রাখি? যেন পরে নির্দিষ্ট একটা ডাটা সহজে খুঁজে পেতে পারি। "তরিকা" গুলোর নাম Array, Stack, Queue, Linked List, Tree, Graph. এগুলা শ খানেক ডাটা স্ট্রাকচারের মধ্যে কিছুর নাম, যেগুলো অনেক বেশি ব্যবহার হয়। এই পোস্টটা কিউ বুঝানোর জন্য। কিউ জিনিসটার সাথে আমরা সবাই পরিচিত। জীবনে আমরা সবাই কখনো না কখনো লাইনে দাঁড়ায়ছি। কিউ এর বেসিক ক্যারেক্টারিস্টিকসের সাথে মিলিয়েই প্রোগ্রামিং এ কিউ এর কনসেপ্ট। বাস্তব জীবনে একটা কিউ তে কি হয়? সবাই লাইন ধরে দাঁড়ায় কিছু একটা কারনে। যে সবার আগে দাঁড়ায় সেই সবার আগে কার্জসিদ্ধি করে। সবার পরের জন সবার পরে। স্ট্যাকের ক্ষেত্রে আমরা পড়েছিলাম Last In First Out (LIFO) or First In Last Out (FILO)। কেমন আনফেয়ার শোনায় না? সবার পরে আসবে, আবার সবার আগে চলে যাবে। অ্যাটলিস্ট আমার আনফেয়ার লেগেছিলো যখন স্ট্যাক শিখছিল

কম্পিউটার বচন

কম্পিউটারের সাথে আমার পরিচয় খুব ছোট বয়সে না। অন্তত চেনাপরিচিত বন্ধুমহলের অনেকের তুলনায় আমি বাচ্চাই বলা চলে। ক্লাস ২ বা ৩ তে পড়ি যখন ফুফাতো ভাই প্রথম কম্পিউটার কেনে। ফুফুর বাসা কাছেই হওয়ায় মাঝে মাঝেই সেটা দেখার সৌভাগ্য হতো। কিন্তু ছুয়ে দেখার সাহস তখনও হয়নি। সেই বছর থেকে আমাদের রেওয়াজ, ঈদের দিন নামাজ পড়েই সোজা ভাইয়ার রুমে। ভাইয়া নতুন একটা গেম ইন্সটল করে রাখতো আর আমরা কাজিনেরা লাইন দিয়ে সেটা খেলতাম (যদিও আমার ভাগে কমই পড়তো :p )  ক্লাস সিক্সে নতুন স্কুলে ভর্তি হলাম। এ এক আজব জায়গা। সবাই বড়লোকের পোলাপাইন। কতজন গাড়িতে করে আসে। তাদের তো কথাই নাই। যাদের গাড়ি নাই তাদেরও রোজকার বাজেট বিশাল। ইচ্ছামত উড়ায়। আর আমি মধ্যবিত্তের ছেলে। যাওয়া আসার ভাড়া বাদে কোনো টাকা পেতামনা। টিফিন বাসা থেকে বানায়ে দিতো। এই যখন আমার অবস্থা তখন ক্লাসমেটরা নিত্যনতুন গ্যাজেটের সাথে শুধু পরিচয়ই না, পকেটে নিয়ে ঘুরে (যদিও স্কুলে নিষিদ্ধ ছিলো )। সবাই এসব নিয়ে কত গল্প চালায় যায়। আর আমার মত বোকা কিছু পাবলিক হা করে এদের গল্প শুনি। কম্পিউটারের কত বচন, কত আড্ডা। এসব আড্ডায় ঢুকতে কত ইচ্ছা করতো, কিন্তু ঢুকবো কি করে? আমার কম্পিউটা