Хусусияти ворид кардани вобастагиҳо (Dependency Injection) чист?
sobes.tech AI
Ҷавоб аз AI
Наслиҳат дар ворид кардани вобастагиҳо (DI) дар он аст, ки эҷод ва идоракунии вобастагиҳои объект аз худи объект ба берун гузошта мешавад, одатан ба контейнери IoC (Inversion of Control). Ба ҷои он ки объект худ вобастагиҳои худро эҷод ё пайдо кунад, онҳо аз берун "внедор" карда мешаванд.
Афзалиятҳо ва хусусиятҳои асосии DI:
- Тақсимоти масъулият: Класс масъулияти эҷоди вобастагиҳои худро надорад.
- Тестшавандагӣ: Вобастагиҳоро ба осонӣ бо мокҳо ё заглушкаҳо иваз кардан мумкин аст дар вақти тестгирии модулӣ.
- Флексибилитет: Иҷрои вобастагиҳоро бе тағир додани коди истифодабарӣ осон аст.
- Камтар пайвастагӣ: Компонентҳо камтар пайваст мешаванд, ки ин ба нигоҳдории онҳо кӯмак мекунад.
Роҳҳои ворид кардан:
-
Аз тариқи конструктор (Constructor Injection): Вобастагиҳо тавассути конструктор дода мешаванд. Ин усул беҳтарин аст, зеро кафолат медиҳад, ки вобастагиҳо аз вақти эҷоди объект мавҷуданд.
// Класс бо вобастагӣ public class MyService { private MyDependency dependency; // Ворид кардан тавассути конструктор public MyService(MyDependency dependency) { this.dependency = dependency; } // Истифодаи вобастагӣ public void doSomething() { dependency.performAction(); } } // Вобастагӣ public interface MyDependency { void performAction(); } // Намунаи иҷрои вобастагӣ public class MyDependencyImpl implements MyDependency { @Override public void performAction() { System.out.println("Action performed!"); } } -
Аз тариқи сеттер (Setter Injection): Вобастагиҳо тавассути методҳои публӣ-сеттер дода мешаванд. Ин усул имкон медиҳад, ки объектҳоро бо вобастагиҳо ба хоҳиш эҷод кард, аммо барои ин ба санҷишҳои иловагӣ ва null-ро санҷиш кардан лозим аст ва кафолат намедиҳад, ки ҳамаи вобастагиҳо дар як вақт мавҷуданд.
// Класс бо вобастагӣ public class AnotherService { private AnotherDependency dependency; // Конструктори холӣ public AnotherService() { } // Ворид кардан тавассути сеттер public void setDependency(AnotherDependency dependency) { this.dependency = dependency; } // Истифодаи вобастагӣ public void doSomethingElse() { if (dependency != null) { dependency.anotherAction(); } else { System.out.println("Dependency is not set!"); } } } // Вобастагӣ public interface AnotherDependency { void anotherAction(); } // Намунаи иҷрои вобастагӣ public class AnotherDependencyImpl implements AnotherDependency { @Override public void anotherAction() { System.out.println("Another action performed!"); } } -
Аз тариқи майдони (Field Injection): Вобастагиҳо мустақиман ба майдонҳои класа тавассути аннотацияҳо ворид карда мешаванд. Ин соддатарин синтаксис аст, аммо класи вобастагиро ба фреймворки DI вобаста мекунад ва тест карданро душвор месозад.
import org.springframework.beans.factory.annotation.Autowired; // Класс бо вобастагӣ public class SomeOtherService { // Ворид кардан тавассути майдон (бо истифода аз аннотацияи Spring) @Autowired private YetAnotherDependency dependency; // Истифодаи вобастагӣ public void doYetAnotherThing() { dependency.performYetAnotherAction(); } } // Вобастагӣ public interface YetAnotherDependency { void performYetAnotherAction(); } // Намунаи иҷрои вобастагӣ public class YetAnotherDependencyImpl implements YetAnotherDependency { @Override public void performYetAnotherAction() { System.out.println("Yet another action performed!"); } }
Мувофиқсозии усулҳои ворид кардан:
| Усули ворид кардан | Фарзандӣ | Норасогӣ |
|---|---|---|
| Аз тариқи конструктор | Гарантӣ медиҳад, ки вобастагиҳо мавҷуданд, осон барои тест, номиналӣ | Мушкилот дар "параметрозависимият" дар конструктор бо шумораи зиёди вобастагиҳо |
| Аз тариқи сеттер | Вобастагиҳо метавонанд интихобӣ бошанд, имконият барои тағир додани вобастагиҳо пас аз эҷод | Таҳлилҳо барои null, кафолат намедиҳад, ки ҳолати пурраи объект пас аз эҷод таъмин аст |
| Аз тариқи майдон | Синтаксис кӯтоҳ | Баъд аз фреймворки DI, ки тест карданро душвор месозад |
DI принсипи асосӣ дар бисёр фреймворкҳои муосир (масалан, Spring, CDI) мебошад ва кӯмак мекунад, ки барномаҳо камтар пайваст ва осон барои тест бошанд.