معرفی الگوی Repository در برنامهنویسی شیء گرا
چرا از الگوی Repository استفاده میکنیم ؟
وقتی برنامههای بزرگ مینویسیم، مدیریت دسترسی به دادهها (مثل اطلاعات دیتابیس) میتواند به سرعت پیچیده و پراکنده شود. الگوی Repository مانند یک «کتابدار حرفهای» عمل میکند که تمام عملیات مربوط به دادهها (ذخیره، بازیابی، حذف و...) را در یک لایه مجزا سازماندهی میکند.
این کار مزایای زیر را به دنبال دارد:
- کد شما تمیزتر میشود.
- تغییر دیتابیس (مثلاً از MySQL به PostgreSQL) سادهتر خواهد بود.
- تست کردن بخشهای مختلف برنامه آسانتر میشود.
اجزای اصلی الگوی Repository
- Repository Interface
قراردادهایی که عملیات دادهای را تعریف میکنند. - Concrete Repository
پیادهسازی واقعی این عملیات (مثلاً برای MySQL). - Domain Models
شیءهای کسبوکار شما (مثلاً کلاس User).
پیادهسازی گام به گام در PHP
۱- تعریف مدل (Domain Model)
فرض کنید یک مدل User داریم:
1 2 3 4 5 6 7 |
class User { private int $id; private string $name; private string $email; // جزئیات بیشتر کلاس کاربر... } |
۲- ایجاد Repository Interface
این اینترفیس روشهای استاندارد برای تعامل با دادهها را مشخص میکند:
1 2 3 4 5 6 |
interface UserRepositoryInterface { public function find(int $id); public function save(User $user); public function delete(int $id); public function findAll(); } |
۳- پیادهسازی Concrete Repository
در مثال زیر با استفاده از MySQL یک نمونه پیادهسازی را مشاهده میکنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class MySQLUserRepository implements UserRepositoryInterface { private PDO $db; public function __construct(PDO $db) { $this->db = $db; } public function find(int $id) { $stmt = $this->db->prepare( "SELECT * FROM users WHERE id = :id" ); $stmt->execute( [ 'id' => $id ] ); $data = $stmt->fetch( PDO::FETCH_ASSOC ); return $data ? new User( $data[ 'id' ], $data[ 'name' ], $data[ 'email' ] ) : null; } // بقیه متدها و توابع ... } |
۴- استفاده در سرویسهای برنامه
حالا میتوانید بدون وابستگی به پایگاه داده، از Repository در بخشهای دیگر برنامه استفاده کنید:
1 2 3 4 5 6 7 8 9 10 11 12 |
class UserService { private UserRepositoryInterface $userRepository; public function __construct( UserRepositoryInterface $userRepository ) { $this->userRepository = $userRepository; } public function getUserEmail( int $userId ) { $user = $this->userRepository->find( $userId ); return $user->getEmail(); } } |
مزایای اصلی الگوی Repository
این الگو مزایای مختلفی دارد که مهمترین آنها عبارتند از:
- جداسازی نگرانیها
منطق کسبوکار (Business Logic) از جزئیات ذخیرهسازی دادهها مجزا میشود. - تستپذیری بیشتر
میتوانید یک Repository جعلی (Mock) برای تست واحد (Unit Testing) ایجاد کنید. - افزایش انعطافپذیری
تغییر پایگاه داده فقط نیازمند ایجاد یک Repository جدید امکانپذیر است و نیازی به تغییر سرویسها وجود ندارد. - امکان مدیریت کش و بهینهسازی
با استفاده از ریپازیتوری میتوانیم به آسانی قابلیت Cache و بهینهسازی دسترسی به دادهها را پیادهسازی کنیم.
چه زمانی از Repository استفاده نکنیم؟
استفاده از این الگو همیشه به صرفه نیست و در بعضی کاربردها بهتر است از آن استفاده نشود.