Sobes.tech
Junior

Mis on abstraktsiooni olemus?

sobes.tech AI

Vastus AI-lt

Flutteris abstraktsioon, nagu ka üldiselt programmeerimises, on seotud keerulise teostuse varjamise ja lihtsustatud liidese pakkumisega suhtlemiseks. Seda saavutatakse kõrgetasemeliste vaadete loomisega, mis varjavad allolevaid detaile ja võimaldavad töötada kontseptsioonidega, mitte konkreetse teostusega.

Põhiteooriad:

  • Detailide varjamine: Keeruline loogika või andmestruktuur varjatakse lihtsa liidese taha.
  • Kasutamise lihtsustamine: Arendaja suhtleb abstraktse vaatega, mitte süvenedes teostuse detailidesse.
  • Paindlikkuse suurendamine: Sise-implementatsiooni muutmine ei mõjuta koodi, mis kasutab abstraktsiooni, kuni liides jääb samaks.
  • Taaskasutusvõimaluse suurendamine: Abstraktsed komponendid võivad olla kasutusel erinevates rakenduse osades.

Näited Flutteris:

  • Vidinad: Vidinad on kasutajaliidese elementide abstraktsioonid. Kasutame Container, Row, Column ja teisi, teadmata nende sisemist teostust.
  • Asünkroonne programmeerimine: Future ja Stream abstraktsioonid varjavad asünkroonsete operatsioonide tööd, varjates voogude ja sündmuste üksikasju.
  • Arhitektuurimudelid: Kasutatakse mustreid nagu BLoC, Provider või Riverpod, mis on abstraktsiooni vorm, eraldades UI ja äriloogika.

Näide abstraktsiooni kasutamisest:

// Andmeallika abstraktne klass
abstract class DataSource {
  Future<String> fetchData();
}

// HTTP kasutav teostus
class HttpDataSource implements DataSource {
  @override
  Future<String> fetchData() async {
    // Siin keeruline loogika HTTP-päringutega
    return "Andmed HTTP-st";
  }
}

// Kohaliku salvestuse kasutav teostus
class LocalDataSource implements DataSource {
  @override
  Future<String> fetchData() async {
    // Siin keeruline loogika kohaliku salvestusega
    return "Andmed kohalikust salvestusest";
  }
}

// Klass, mis kasutab DataSource abstraktsiooni
class Repository {
  final DataSource dataSource;

  Repository(this.dataSource);

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

Selles näites suhtleb Repository ainult DataSource abstraktsiooniga, muretsemata selle pärast, kust andmed täpselt tulevad (HTTP, kohalik salvestus jne). See võimaldab andmeallikat hõlpsasti muuta, muutmata Repository koodi.