Sobes.tech
Middle

Ինչ կարող եք ասել SOLID-ի սկզբունքի D մասին։

sobes.tech AI

Պատասխան AI-ից

Dependency Inversion Principle (DIP) նշում է,

  • վերևի մակարդակի մոդուլները չպետք է կախված լինեն ստորին մակարդակի մոդուլներից: Երկուսն էլ պետք է կախված լինեն աբստրակցիաներից:
  • աբստրակցիաները չպետք է կախված լինեն մանրամասներից: Մանրամասները պետք է կախված լինեն աբստրակցիաներից:

SOLID-ի D նպատակն է բարձր մակարդակի քաղաքականությունների և ցածր մակարդակի իրագործման միջև decoupling (վերամեկուսացում): Փոխարենը, բարձր մակարդակի մոդուլը ուղղակիորեն կախված չէ ցածր մակարդակի մոդուլից կոնկրետ իրագործումից, երկուսն էլ կախված են ընդհանուր ինտերֆեյսից կամ աբստրակտ դասից: Սա մեծացնում է ճկունությունը, թեստավորման հեշտությունը և կոդի պահպանելիությունը:

Flutter-ում դա հաճախ արտահայտվում է աբստրակտ դասերի կամ միկսինների օգտագործմամբ պայմանագրեր սահմանելու համար, որոնք ապա իրականացնում են կոնկրետ դասերը: Օրինակ, տվյալների հետ աշխատելիս:

// Աբստրակցիա
abstract class DataService {
  Future<List<String>> getData();
}

// Ներքևի մակարդակի իրագործում (կոնկրետ մանրամասն)
class ApiDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // API-ից տվյալների ստացման լոգիկա
    return ['API Data 1', 'API Data 2'];
  }
}

// Ներքևի մակարդակի իրագործում (այլ կոնկրետ մանրամասն)
class LocalDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Տեղական պահոցից տվյալների ստացման լոգիկա
    return ['Local Data 1', 'Local Data 2'];
  }
}

// Բարձր մակարդակի մոդուլ, որը կախված է աբստրակցիայից, ոչ թե մանրամասներից
class DataManager {
  final DataService _dataService; // Կապվածություն աբստրակցիայից

  DataManager(this._dataService); // Կապվածության ներդրում (ինվերտոր)

  Future<List<String>> fetchData() {
    return _dataService.getData();
  }
}

// Օգտագործում
void main() {
  final apiService = ApiDataService();
  final localService = LocalDataService();

  final apiManager = DataManager(apiService); // Ինյեկցիա ApiDataService
  final localManager = DataManager(localService); // Ինյեկցիա LocalDataService

  // ... օգտագործում apiManager կամ localManager
}