استفاده از الگوهای دیزاین پترن در قراردادهای هوشمند می‌تواند به خوانایی، قابلیت استفاده مجدد، و نگهداری بهتر کد کمک کند. در اینجا چند الگوی طراحی متداول و نحوه‌ی استفاده از آن‌ها در قراردادهای هوشمند ارائه می‌شود.

۱. الگوی Singleton

توضیح: این الگو تضمین می‌کند که فقط یک نمونه از یک قرارداد وجود داشته باشد و یک نقطه دسترسی جهانی به آن ارائه دهد.

استفاده: این الگو معمولاً برای توسعه قراردادهایی که باید وضعیت جهانی را مدیریت کنند، مانند قراردادهای مدیریت توکن یا قراردادهای احراز هویت، به کار می‌رود.

pragma solidity ^.8.;

contract Singleton {
    static Singleton instance;

    constructor() {
        require(instance == address(), "Contract already deployed.");
        instance = this;
    }

    function getInstance() public view returns (address) {
        return instance;
    }
}

۲. الگوی Factory

توضیح: این الگو به توسعه‌دهندگان اجازه می‌دهد تا چندین نمونه از یک قرارداد را با استفاده از یک تابع تولید کنند.

استفاده: الگوی Factory برای ایجاد قراردادهای توکن یا سایر انواع قرارداهای مشابه بسیار مفید است.

pragma solidity ^.8.;

contract Token {
    string public name;
    string public symbol;

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }
}

contract TokenFactory {
    Token[] public tokens;

    function createToken(string memory _name, string memory _symbol) public {
        Token newToken = new Token(_name, _symbol);
        tokens.push(newToken);
    }
}

آموزش سالیدیتی

۳. الگوی Proxy

توضیح: الگوی Proxy به شما این امکان را می‌دهد که یک قرارداد را به صورت جداگانه (پروکسی) تغییر دهید، در حالی که وضعیت آن قرارداد بدون تغییر باقی می‌ماند.

استفاده: این الگو بخصوص در اپلیکیشن‌های بزرگ که نیاز به ارتقاء و تغییر دارند، مفید است.

pragma solidity ^.8.;

contract Proxy {
    address public implementation;

    constructor(address _implementation) {
        implementation = _implementation;
    }

    fallback () external {
        (bool success, ) = implementation.delegatecall(msg.data);
        require(success, "Delegate call failed.");
    }
}

۴. الگوی Pausable

توضیح: این الگو به قرارداد اجازه می‌دهد تا در صورت وجود شرایط خاصی، اجرای توابع را متوقف کند (غیرفعال کند).

استفاده: برای مواردی که نیاز به توقف موقت توابع قرارداد وجود دارد، مانند امنیت در صورت بروز حملات.

pragma solidity ^.8.;

contract Pausable {
    bool public paused;

    modifier whenNotPaused() {
        require(!paused, "Contract is paused.");
        _;
    }

    function pause() public {
        paused = true;
    }

    function unpause() public {
        paused = false;
    }
}

۵. الگوی Ownable

توضیح: این الگو به یک قرارداد اجازه می‌دهد تا یک مالک مشخص داشته باشد که دسترسی ویژه‌ای به برخی توابع داشته باشد.

استفاده: مفید برای قراردادهایی که نیاز به دسترسی کنترل‌شده دارند.

pragma solidity ^.8.;

contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Caller is not the owner");
        _;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        owner = newOwner;
    }
}

نتیجه‌ گیری

استفاده از الگوهای دیزاین پترن در قراردادهای هوشمند می‌تواند به صورت قابل توجهی کیفیت کد و نگهداری قراردادها را بهبود بخشد. این الگوها به توسعه‌دهندگان این امکان را می‌دهد که به سادگی قراردادها را گسترش داده و تغییر دهند و در عین حال از ثبات و امنیت قراردادهای خود اطمینان حاصل کنند.