Sobes.tech
Junior
168

Тәуелділіктерди киргизүүнүн (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) негизги принциби жана ал алсыз байланыштуу жана оңой тесттелүүчү колдонмолорду түзүүгө жардам берет.