• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Dependency Injection چیه؟
#1
سلام
این اواخر (3 4 ماهی میشه) توی بیشتر مقالات و سایتها با مفهومی به نام Dependency Injection برخورد میکنم.
یه تحقیق کوچیک داشتم در موردش فکر میکنم در مورد تحوه تست کدهای نوشته شده باشه.

ممنون میشم یه توضیحی در موردش بدید.

موفق باشید
  پاسخ
تشکر شده توسط : phpgangster
#2
تزریق نیازمندی به طور خلاصه یک ابزاری هست که شما به یک هسته نیازمندی های کلاسهاتون رو تزریق می کنید و بعد ایجاد آبجکت از کلاس با توجه به نیازمندی ها رو به عهده اون DI میزارید.
ZF2 از این ویژگی پشتیبانی می کنه. من مثالهای از اون رو میارم.
فرض کن ما کلاسهای زیر رو داریم

کد پی‌اچ‌پی:
namespace MyLibrary
{
    class 
DbAdapter
    
{
        protected 
$username null;
        protected 
$password null;
        public function 
__construct($username$password)
        {
            
$this->username $username;
            
$this->password $password;
        }
    }
}

namespace 
MyMovieApp
{
    class 
MovieFinder
    
{
        protected 
$dbAdapter null;
        public function 
__construct(\MyLibrary\DbAdapter $dbAdapter)
        {
            
$this->dbAdapter $dbAdapter;
        }
    }

    class 
MovieLister
    
{
        protected 
$movieFinder null;
        public function 
__construct(MovieFinder $movieFinder)
        {
            
$this->movieFinder $movieFinder;
        }
    }


ما می خواییم یک آبجکت از MovieLister ایجاد کنیم. خب برای اینکار باید قبلش یه آبجکت از MovieFinder و برای MovieFinder باید قبلش یک آبجکت از DbAdapter ایجاد کنیم. یعنی به این صورت

کد پی‌اچ‌پی:
// $config object is assumed

$dbAdapter = new MyLibrary\DbAdapter($config->username$config->password);
$movieFinder = new MyMovieApp\MovieFinder($dbAdapter);
$movieLister = new MyMovieApp\MovieLister($movieFinder);
foreach (
$movieLister as $movie) {
    
// iterate and display $movie


شما هر بار بخوایین این کار رو کنین باید این عملیات رو انجام بدین. اینجاست که DI به کمکتون میاد. کد بالا در DI ZF2 به این صورت نوشته میشه
کد پی‌اچ‌پی:
// inside a bootstrap somewhere
    
$di = new Zend\Di\Di();
    
$di->instanceManager()->setParameters('MyLibrary\DbAdapter', array(
        
'username' => $config->username,
        
'password' => $config->password
    
));

    
// inside each controller
    
$movieLister $di->get('MyMovieApp\MovieLister');
    foreach (
$movieLister as $movie) {
        
// iterate and display $movie
    


و یا

کد پی‌اچ‌پی:
// inside each controller
    
$di = new Zend\Di\Di();
    
$movieLister $di->get('MyMovieApp\MovieLister', array(
        
'username' => $config->username,
        
'password' => $config->password
    
));
    foreach (
$movieLister as $movie) {
        
// iterate and display $movie
    


حالا جزئیات بیشتر هم هر کدوم از DI ها برای خودشوون دارن که من اطلاعاتم در مورد ZF2 هست که اگر داکیومنتش رو مطالعه کردی و به نتیجه نرسیدی می تونم توضیحات بیشتر رو بدم
  پاسخ
تشکر شده توسط : ali786 hamid_80386 Mr.Moqadam Y.P.Y hidensoft
#3
ممنون
اما چه لزومی داره به این صورت عمل کنیم؟ به نظرم خیلی خوانایی کد ها کم میشه.
نمیشه یه مثال دیگه غیر از زند بزنید؟ زیاد نمیتونم با زند ارتباط برقرار کنم ...
  پاسخ
تشکر شده توسط :
#4
استفادش برای این هست که سرعت در توصعه و احتمال خطا رو کاهش بدیم. این تنها یک مثال کوچیک بود شما ممکنه نیازمندی هاتون بیشتر از این باشه. شما تنها با تعریف اونهایی که پارامتر ورودی دارن به راحتی در ابتدا تعریف و هر وقت خواستین استفاده کنین فقط کافیه get کنین.
این روش خوانایی کد رو بیشتر هم می کنه.
سمفونی ۲ هم این ویژگی رو داره. سرچ بکنید به نتیجه می رسید.
  پاسخ
تشکر شده توسط :
#5
(۱۳۹۱ مرداد ۱۱, ۰۴:۳۹ ب.ظ)admin نوشته: استفادش برای این هست که سرعت در توصعه و احتمال خطا رو کاهش بدیم. این تنها یک مثال کوچیک بود شما ممکنه نیازمندی هاتون بیشتر از این باشه. شما تنها با تعریف اونهایی که پارامتر ورودی دارن به راحتی در ابتدا تعریف و هر وقت خواستین استفاده کنین فقط کافیه get کنین.
این روش خوانایی کد رو بیشتر هم می کنه.
سمفونی ۲ هم این ویژگی رو داره. سرچ بکنید به نتیجه می رسید.

سلام شخدمت آقای سهرابلو ، من یه سوال دارم ، نمیدونم سوام تکراری هست یا نه ، از کجا باید Zend 2 را یاد بگیرم ، من مثلا این این تابع های getConfig dیا getmanager که توی فایل module هست را درک نمیکنم ، برای درکش بایدچیکار کرد ؟
  پاسخ
تشکر شده توسط :
#6
در داکیومنت زند همش رو توضیح داده
  پاسخ
تشکر شده توسط :
#7
یه مثال ساده و خوب + مقاله از di: Angel
http://gonzalo123.com/2012/07/09/buildin...-with-php/

http://fabien.potencier.org/article/11/w...-injection

simple MVC with dependency injection
http://dmyers2004.github.com/myersd-minimvc/


همچنین بهتره که قبل از یادگیری DI، این Service Container (یا ObjectContainer) رو یاد بگیری
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان