python-basic

⌘K
  1. Home
  2. python-basic
  3. OOP
  4. SOLID প্রিন্সিপাল অনুসরণ করে OOP প্রজেক্ট তৈরি করা

SOLID প্রিন্সিপাল অনুসরণ করে OOP প্রজেক্ট তৈরি করা

উদাহরণ: SOLID প্রিন্সিপাল অনুসরণ করে OOP প্রজেক্ট তৈরি করা

আমরা একটি ছোট প্রকল্প তৈরি করব যেখানে SOLID প্রিন্সিপাল অনুসরণ করে একটি লাইব্রেরি ম্যানেজমেন্ট সিস্টেম তৈরি করা হবে। এই সিস্টেমে বই যোগ করা, বই তালিকা দেখা এবং বই ধার দেওয়া কাজ হবে। আমরা Python ভাষা ব্যবহার করব।

১. Single Responsibility Principle (SRP)

SRP অনুযায়ী, প্রতিটি ক্লাসের একটি নির্দিষ্ট দায়িত্ব থাকা উচিত। আমাদের প্রকল্পে, আমরা তিনটি ক্লাস তৈরি করব: Book, Library, এবং LibraryManager

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author


class Library:
    def __init__(self):
        self.books = []

    def add_book(self, book):
        self.books.append(book)

    def list_books(self):
        return [f"{book.title} by {book.author}" for book in self.books]


class LibraryManager:
    def __init__(self, library):
        self.library = library

    def borrow_book(self, title):
        for book in self.library.books:
            if book.title == title:
                self.library.books.remove(book)
                return f"You borrowed '{title}'"
        return f"'{title}' is not available."

২. Open/Closed Principle (OCP)

OCP অনুযায়ী, ক্লাসগুলোকে সম্প্রসারিত করা উচিত কিন্তু পরিবর্তন করা উচিত নয়। নতুন বইয়ের প্রকার যোগ করতে চাইলে, আমরা Book ক্লাসটি পরিবর্তন না করে নতুন ক্লাস তৈরি করব।

class EBook(Book):
    def __init__(self, title, author, file_size):
        super().__init__(title, author)
        self.file_size = file_size

৩. Liskov Substitution Principle (LSP)

LSP অনুযায়ী, সাবক্লাসগুলোকে সুপারক্লাসের পরিবর্তে ব্যবহার করা উচিত এবং তাদের আচরণ একই থাকতে হবে। এখানে, EBook ক্লাসটি Book ক্লাসের সকল বৈশিষ্ট্য ধারণ করে।

৪. Interface Segregation Principle (ISP)

ISP অনুযায়ী, ক্লাসগুলোকে বড় ইন্টারফেসের পরিবর্তে ছোট ছোট ইন্টারফেস ব্যবহার করতে হবে। আমাদের প্রকল্পে, Library ক্লাসে বইয়ের কাজের জন্য আলাদা ইন্টারফেস তৈরি করবো।

class BookOperations:
    def add_book(self, book):
        pass

    def list_books(self):
        pass


class Library(BookOperations):
    def __init__(self):
        self.books = []

    def add_book(self, book):
        self.books.append(book)

    def list_books(self):
        return [f"{book.title} by {book.author}" for book in self.books]

৫. Dependency Inversion Principle (DIP)

DIP অনুযায়ী, উচ্চ স্তরের মডিউলগুলোকে নিম্ন স্তরের মডিউলগুলোর উপর নির্ভর না করে, উভয়কেই একটি অভ্যন্তরীণ ইন্টারফেসের মাধ্যমে সংযুক্ত করা উচিত। আমাদের LibraryManager ক্লাসটি Library ইন্টারফেসের উপর নির্ভর করবে।

class LibraryManager:
    def __init__(self, library: BookOperations):
        self.library = library

    def borrow_book(self, title):
        for book in self.library.books:
            if book.title == title:
                self.library.books.remove(book)
                return f"You borrowed '{title}'"
        return f"'{title}' is not available."

সম্পূর্ণ কোড

# Book class
class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

# EBook class (subclass of Book)
class EBook(Book):
    def __init__(self, title, author, file_size):
        super().__init__(title, author)
        self.file_size = file_size

# Interface for Book operations
class BookOperations:
    def add_book(self, book):
        pass

    def list_books(self):
        pass

# Library class implementing BookOperations
class Library(BookOperations):
    def __init__(self):
        self.books = []

    def add_book(self, book):
        self.books.append(book)

    def list_books(self):
        return [f"{book.title} by {book.author}" for book in self.books]

# LibraryManager class using Library interface
class LibraryManager:
    def __init__(self, library: BookOperations):
        self.library = library

    def borrow_book(self, title):
        for book in self.library.books:
            if book.title == title:
                self.library.books.remove(book)
                return f"You borrowed '{title}'"
        return f"'{title}' is not available."


# Usage example
library = Library()
manager = LibraryManager(library)

# Adding books
book1 = Book("The Great Gatsby", "F. Scott Fitzgerald")
book2 = EBook("1984", "George Orwell", "1.5MB")

library.add_book(book1)
library.add_book(book2)

# Listing books
print(library.list_books())

# Borrowing a book
print(manager.borrow_book("1984"))
print(library.list_books())

How can we help?