Тәуелділіктерди киргизүүнүн (Dependency Injection) өзгөчөлүгү эмнеде?
AIден жооп
sobes.tech 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 аркылуу (Setter Injection): Көз карандылыктар публичдуу методдор аркылуу өткөрүлөт. Бул объекттерди керектүү көз карандылыктар менен түзүүгө мүмкүндүк берет, бирок null текшерүүлөрдү талап кылат жана бардык көз карандылыктарды бир учурда камсыз кылбайт.
// Класс көз карандылыктары менен public class AnotherService { private AnotherDependency dependency; // Бос конструктор public AnotherService() { } // Setter аркылуу киргизүү 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!"); } }
Тендөө жолдору:
| Жолдуулоо | Артыкчылыктары | Кемчиликтери |
|---|---|---|
| Конструктор аркылуу | Керек болгон көз карандылыктарды камсыз кылат, тест оңой, өзгөрүлбөс | "Параметрдик көз карандылык" пайда болушу мүмкүн, көп көз карандылыктар менен |
| Setter аркылуу | Опционалдуу көз карандылыктар, өзгөртүү мүмкүнчүлүгү | Null текшерүүлөрдү талап кылат, объекттин толук абалын кепилдебейт |
| Майдан аркылуу | Кыска синтаксис | DI-фреймворккө көз каранды, тестирлөөнү кыйындатат |
DI — бул көпчүлүк заманбап фреймворктардын (мисалы, Spring, CDI) негизги принциби жана ал алсыз байланыштуу жана оңой тесттелүүчү колдонмолорду түзүүгө жардам берет.