Sobes.tech
Junior

V čom spočíva podstata abstrakcie?

sobes.tech AI

Odpoveď od AI

Abstrakcia vo Flutteri, ako aj v programovaní všeobecne, sa zameri na zakrytie zložitej implementácie a poskytnutie zjednodušeného rozhrania na interakciu. Toho sa dosahuje vytvorením vysokorozmerných zobrazení, ktoré zakrývajú nižšie vrstvy a umožňujú pracovať s konceptmi, nie s konkrétnou implementáciou.

Hlavné myšlienky:

  • Zakrytie detailov: Zložitá logika alebo štruktúra dát je zakrytá za jednoduchým rozhraním.
  • Zjednodušenie použitia: Vývojár komunikuje s abstraktným zobrazením, nezapájajúc sa do detailov implementácie.
  • Zvýšenie flexibility: Zmena vnútornej implementácie neovplyvňuje kód, ktorý používa abstrakciu, pokiaľ rozhranie zostáva rovnaké.
  • Zvýšenie opakovanej použiteľnosti: Abstraktné komponenty môžu byť použité v rôznych častiach aplikácie.

Príklady vo Flutteri:

  • Widgety: Widgety sú abstrakcie nad prvkami používateľského rozhrania. Používame Container, Row, Column a ďalšie, nepoznajúc ich vnútornú implementáciu.
  • Asynchrónne programovanie: Future a Stream abstrahujú prácu s asynchrónnymi operáciami, zakrývajúc detaily práce s tokmi a udalosťami.
  • Architektonické vzory: Použitie vzorov ako BLoC, Provider alebo Riverpod, predstavuje formu abstrakcie, rozdeľujúcu UI a biznis logiku.

Príklad kódu s použitím abstrakcie:

// Abstraktná trieda pre zdroj dát
abstract class DataSource {
  Future<String> fetchData();
}

// Implementácia využívajúca HTTP
class HttpDataSource implements DataSource {
  @override
  Future<String> fetchData() async {
    // Tu zložitá logika práce s HTTP požiadavkou
    return "Dáta z HTTP";
  }
}

// Implementácia využívajúca lokálne úložisko
class LocalDataSource implements DataSource {
  @override
  Future<String> fetchData() async {
    // Tu zložitá logika práce s lokálnym úložiskom
    return "Dáta z lokálneho úložiska";
  }
}

// Trieda využívajúca abstrakciu DataSource
class Repository {
  final DataSource dataSource;

  Repository(this.dataSource);

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

V tomto príklade Repository komunikuje iba s abstrakciou DataSource, nezaujíma sa o to, odkiaľ presne prichádzajú dáta (HTTP, lokálne úložisko atď.). To umožňuje ľahko meniť zdroj dát, bez zmeny kódu Repository.