Shamim Shams
Shamim Shams
Published on

উদাহরণসহ সহজ বাংলায় সলিড(SOLID) প্রিন্সিপালস(PART-1)

Authors

একটা ভালো সফটওয়্যার তৈরি করা খুব সহজ কাজ নয়।  সৌভাগ্যক্রমে, আমাদের পূর্বসূরি অনেক সফটওয়্যার ইঞ্জিনিয়ার একসেট প্রিন্সিপালস এবং নিয়মনীতি তৈরী করে গিয়েছেন , যার উপরে নির্ভর করে আমরা সহজে অনেক বড়ো সাইজের, সহজপাঠ্য অবজেক্ট ওরিয়েন্টেড কোড লিখতে পারি ।

সলিড(SOLID) হচ্ছে অবজেক্ট ওরিয়েন্টেড ডিজাইন প্রিন্সিপালস এর সংক্ষিপ্ত রূপ।  রবার্ট সি. মার্টিন (যিনি আঙ্কেল বব নামেও পরিচিত)  সলিড প্রিন্সিপালস এর প্রণেতা।   এর উদ্দেশ্য হচ্ছে সফটওয়্যার এর একটি অংশের ওপর আরেকটি অংশের নির্ভিরতা হ্ৰাস করা , অভিযোজন ক্ষমতা বাড়ানো, সফটওয়্যার কে আরো মেইন্টান্যাবল করা এবং সফটওয়্যার ডেভেলপমেন্ট এর জটিলতা হ্রাস করা।

পাঁচটি বেসিক প্রিন্সিপ্যালস নিয়ে সলিড গঠিত।  এগুলি হলো -

১.) S: Single Responsibility Principle (SRP)

২.) O: Open/Closed Principle (OCP)

৩.) L: Liskov Substitution Principle (LSP)

৪.) I: Interface Segregation Principle (ISP)

৫.) D: Dependency Inversion Principle (DIP)

১.) S: Single Responsibility Principle (SRP)

সিঙ্গেল রেস্পন্সিবিলিটি প্রিন্সিপল(SRP) দিয়ে শুরু করা যাক।  এই নীতি অনুযায়ী একটি ক্লাস এর শুধু মাত্র একটু দায়িত্ব(Responsibility) থাকবে। এক্ষেত্রে কোড এর টেস্টেবিলিটি বাড়বে , কম  কাপলিং(coupling) হবে এবং কোড অনেক সাজানো গোছানো হবে।

কোড SRP ছাড়া :

<?php 
class UserSettings
{
    private $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function changeSettings(array $settings): void
    {
        if ($this->verifyCredentials()) {
            // ...
        }
    }

    private function verifyCredentials(): bool
    {
        // ...
    }
}

কোড SRP সহ :

<?php
class UserAuth
{
    private $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function verifyCredentials(): bool
    {
        // ...
    }
}

class UserSettings
{
    private $user;

    private $auth;

    public function __construct(User $user)
    {
        $this->user = $user;
        $this->auth = new UserAuth($user);
    }

    public function changeSettings(array $settings): void
    {
        if ($this->auth->verifyCredentials()) {
            // ...
        }
    }
}

২.) Open/Closed Principle (OCP)

সফটওয়্যার বিভিন্ন সত্তা (entities) যেমন: ক্লাস, মডিউলস, ফাংশনস এমন হবে যেন এটাকে  মূল কোড চেঞ্জ না করে পরিবর্ধন করতে পারে এবং কোড পরিবর্তন এর জন্য  বন্ধ (Closed ) থাকবে 

কোড OCP ছাড়া :

<?php
abstract class Adapter
{
    protected $name;

    public function getName(): string
    {
        return $this->name;
    }
}

class AjaxAdapter extends Adapter
{
    public function __construct()
    {
        parent::__construct();

        $this->name = 'ajaxAdapter';
    }
}

class NodeAdapter extends Adapter
{
    public function __construct()
    {
        parent::__construct();

        $this->name = 'nodeAdapter';
    }
}

class HttpRequester
{
    private $adapter;

    public function __construct(Adapter $adapter)
    {
        $this->adapter = $adapter;
    }

    public function fetch(string $url): Promise
    {
        $adapterName = $this->adapter->getName();

        if ($adapterName === 'ajaxAdapter') {
            return $this->makeAjaxCall($url);
        } elseif ($adapterName === 'httpNodeAdapter') {
            return $this->makeHttpCall($url);
        }
    }

    private function makeAjaxCall(string $url): Promise
    {
        // request and return promise
    }

    private function makeHttpCall(string $url): Promise
    {
        // request and return promise
    }
}

কোড OCP সহ :

<?php
interface Adapter
{
    public function request(string $url): Promise;
}

class AjaxAdapter implements Adapter
{
    public function request(string $url): Promise
    {
        // request and return promise
    }
}

class NodeAdapter implements Adapter
{
    public function request(string $url): Promise
    {
        // request and return promise
    }
}

class HttpRequester
{
    private $adapter;

    public function __construct(Adapter $adapter)
    {
        $this->adapter = $adapter;
    }

    public function fetch(string $url): Promise
    {
        return $this->adapter->request($url);
    }
}