What Is Dependency Injection In Java ?

პოსტში განხილულია ის თუ რა არის Dependency Injection-ი ჯავაში. მაქსიმალურად შევეცადე გასაგებად დამეწერა და ყველა ტერმინი მეთარგმნა, თუმცა არის ისეთი რაღაცებიც რასაც უბრალოდ ვერ გადათარგმნი ისე, რომ აზრი გასაგები იყოს. იმედია ყველაფერი ისეა ახსნილი, რომ წარმოდგენა შეგექმნებათ რა არის Dependency Injection-ი.

Dependency Injection არის ობიექტის კონფიგურაციის ისეთი სტილი, როდესაც ობიექტს ველები (fields) ენიჭება გარე entity-ების მიერ. სხვა სიტყვებით რომ ვთქვათ, ობიექტი კონფიგურირდება გარე entity-ის მიერ. Dependency Injection არის ალტერნატივა იმისი, რომ გქონდეს ობიექტის კონფიგურაცია თავად. მეტი სიცხადისთვის ვნახოთ მაგალითი:

1

DAO (Database Access Object) კლასს, MyDao-ს, სჭირდება javax.sql.DataSource ობიექტი (Instance) იმისთვის, რომ მიიღოს მონაცემთა ბაზასთან კავშირი. მონაცემთა ბაზასთან კავშირი გამოიყენება ინფორმაციის ბაზაში ჩასაწერად და ბაზიდან წასაკითხად, მაგალითად Person ობიექტებისა.

შესამჩნევია თუ როგორ წარმოადგენს ობიექტის სახით (instantiate) MyDao კლასი DataSourceImpl ობიექტს (instance), რადგან(როგორც) მისთვის საჭიროა DataSource. ის ფაქტი, რომ MyDao-ს სჭირდება DataSource-ს იმპლემენტაცია ნიშნავს, რომ MyDao დამოკიდებულია „Depends” DataSource-ზე. მას არ შეუძლია განახორციელოს რაიმე სამუშაო DataSource-ს იმპლემენტაციის გარეშე. ამიტომ, MyDao-ს აქვს “Dependency” DataSource ინტერფეისზე და მის რომელიმე იმპლემენტაციაზე.

MyDao კლასი თავად intantiate-ს უკეთებს DataSourceImpl-ს როგორც მისი DataSource იმპლემენტაცია. ამიტომ, MyDao კლასი აცხადებს : „satisfy its own dependencies” (დააკმაყოფილოს თავისი დამოკიდებულებები). როცა კლასი   satisfy its own dependencies, ის ავტომატურად დამოკიდებულია კლასებზე, რომლებიც satisfy its own dependencies. ამ შემთხვევაში MyDao ასევე დამოკიდებულია DataSourceImpl-ზე და ოთხ hardcode-დ string-ზე, რომლებიც პარამეტრად აქვს გადაცემული DataSourceImpl კონსტრუქტორს. ჩვენ არ შეგვიძლია გამოვიყენოთ ამ string-ების განსხვავებული მნიშვნელობები და არც DataSource ინტერფეისის განსხვავებული იმპლემენტაცია კოდის ცვლილების გარეშე.

როგორც ვნახეთ, როცა კლასი satisfy its own dependencies ის ხდება საკმაოდ მოუქნელი. ეს , რა თქმა უნდა, არის ცუდი. ეს ნიშნავს იმას, რომ თუ ჩვენ გვჭირდება, რომ შევცვალოთ dependency-ები, ჩვენ უნდა შევცვალოთ კოდი. ამ მაგალთში, თუ ჩვენ მოგვინდება სხვა მონაცემთა ბაზის გამოყენება, ჩვენ უნდა შევცვალოთ MyDao კლასი. თუ ჩვენგ ვაქვს ბევრი DAO კლასი, რომლებიც იმპლემენტირებულები არიან MyDao-ს მსგავსად, ჩვენ უნდა შევცვალოთ ყველა მათგანი. ასევე, ჩვენ ვერ ჩავატარებთ unit test-ს საცდელი DataSource იმპლემენტაციით. ჩვენ შეგვიძლია მხოლოდ DataSourceImpl-ს გამოყენება. მემგონი არ სჭირდება განსაკუთრებული აზროვნება და ფიქრი იმის მიხვედრას, რომ ეს არის ცუდი იდეა.

მოდით ცოტათი შევცვალოთ დიზაინი:

1

DataSourceImpl-ს წარმოდგენა (intantiation) გადავიდა კონსტრუქტორში. კონსტრუქტორი იღებს ოთხ პარამეტრს, რომელიც სჭირდება DataSOurceImpl-ს.  მიუხედავად იმისა, რომ MyDaoკლასი კვლავ დამოკიდებულია ამ ოთხ მნიშვნელობაზე,  ის აღარ satisfy its own dependencies. ისინი უკვე გათვალისწინებულია ნებისმიერი კლასის შექმნისთვის, მაგალითად როგორიცაა MyDao. მნიშვნელობები გამოცხადებულნი არიან როგორც „Injected” MyDao-ს კონსტრუქტორში. აქედან ტერმინი „Dependency Injection”. ახლა უკვე შესაძლებელია შევცვალოთ database driver-ი, url-ი, user name-ი და password-ი , რომელსაც იყენებს MyDao კლასი, ამავე კლასის ცვლილების გარეშე.

Dependency Injection-ი არ არის შეზღუდული კონსტრუქტორებზე. ჩვენ ასევე შეგვიძლია inject dependency-ები setter მეთოდებზე და პირდაპირ public ველებზე.

MyDao კლასი შეგვიძლია გავხადოთ კიდევ უფრო დამოუკიდებელი. ის კვლავ დამოკიდებულია ორივე, DataSource და DataSOurceImpl ინტერფეისებზე. არ არის საჭიროება იმისა, რომ MyDao დამოკიდებული იყოს DataSource-ს გარდა რომელიმე ინტერფეისზე. ეს მიიღწევა DataSource-ს injection-ით კონსტრუქტორში , ნაცვლად ოთხი string-ისა. ვნახოთ ამ დროს როგორ გამოიყურება კოდი:

1

ახლა MyDao არ არის დამოკიდებული DataSourceImpl კლასზე ან ოთხ string-ზე რომელიც სჭირდება DataSourceImpl კონსტრუქტორს. ახლა უკვე შეგვიძლია გავაკეთოთ inject-ი ნებისმიერი DataSource იმპლემენტაციისა MyDao კონსტრუქტორში.

Leave a Reply / უპასუხე

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / შეცვლა )

Twitter picture

You are commenting using your Twitter account. Log Out / შეცვლა )

Facebook photo

You are commenting using your Facebook account. Log Out / შეცვლა )

Google+ photo

You are commenting using your Google+ account. Log Out / შეცვლა )

Connecting to %s