Sobes.tech
Junior

У чему се састоји суштина апстракције?

sobes.tech АИ

Одговор од АИ

Apstrakcija u Flutteru, kao i u programiranju uopšte, svodi se na skrivanje složene implementacije i pružanje pojednostavljenog interfejsa za interakciju. To se postiže kreiranjem visokorazinskih prikaza koji skrivaju niže slojeve i omogućavaju rad sa konceptima, a ne sa konkretnom implementacijom.

Osnovne ideje:

  • Skrivanje detalja: Složena logika ili struktura podataka se skrivaju iza jednostavnog interfejsa.
  • Pojednostavljenje korišćenja: Programer komunicira sa apstraktnim prikazom, ne ulazeći u detalje implementacije.
  • Povećanje fleksibilnosti: Promena unutrašnje implementacije ne utiče na kod koji koristi apstrakciju, dok god interfejs ostaje isti.
  • Povećanje ponovne upotrebljivosti: Apstraktni komponenti mogu biti korišćeni u različitim delovima aplikacije.

Primeri u Flutteru:

  • Widgeti: Widgeti su apstrakcije nad elementima korisničkog interfejsa. Koristimo Container, Row, Column i druge, ne poznavajući njihovu unutrašnju implementaciju.
  • Asinhrono programiranje: Future i Stream apstrahuju rad sa asinhronim operacijama, skrivajući detalje rada sa tokovima i događajima.
  • Arhitektonski obrasci: Korišćenje obrazaca kao što su BLoC, Provider ili Riverpod, predstavlja oblik apstrakcije, razdvajajući UI i poslovnu logiku.

Primer koda sa korišćenjem apstrakcije:

// Apstraktna klasa za izvor podataka
abstract class DataSource {
  Future<String> fetchData();
}

// Implementacija koja koristi HTTP
class HttpDataSource implements DataSource {
  @override
  Future<String> fetchData() async {
    // Ovde složena logika rada sa HTTP zahtevom
    return "Podaci iz HTTP";
  }
}

// Implementacija koja koristi lokalno skladište
class LocalDataSource implements DataSource {
  @override
  Future<String> fetchData() async {
    // Ovde složena logika rada sa lokalnim skladištem
    return "Podaci iz lokalnog skladišta";
  }
}

// Klasa koja koristi apstrakciju DataSource
class Repository {
  final DataSource dataSource;

  Repository(this.dataSource);

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

U ovom primeru, Repository komunicira samo sa apstrakcijom DataSource, ne brinući se odakle tačno dolaze podaci (HTTP, lokalno skladište itd.). Ovo omogućava lako menjanje izvora podataka, bez promene koda Repository.