CodeBlanks Logo Icon CodeBlanks

Repository

Repository pattern öğrenirsin.

Repository

Repository pattern, veri erişimini soyutlar. Alan katmanı bir Repository arayüzü tanımlar; veri katmanı bunu uygular. Alan, verinin API'den mi veritabanından mı geldiğini bilmez.

Örnek: abstract class ProductRepository { Product fetch(String id); }. Somut sınıflar: ApiProductRepository, DbProductRepository, MockProductRepository — hepsi aynı arayüzü uygular.

Avantaj: testte MockProductRepository kullanılır; gerçek API'ye bağlanmadan alan mantığı sınanır. Veri kaynağı değişince sadece somut sınıf değişir.

Çoklu veri kaynakları

Aynı arayüzü birden çok sınıf uygulayabilir: ApiRepo (uzak API), DbRepo (yerel veritabanı), CacheRepo (önbellek). Uygulama, hangisini kullanacağına yapılandırma ile karar verir.

Önbellek stratejisi: CacheRepo önce önbelleğe bakar; miss olursa ApiRepo'ya düşer ve sonuçu önbelleğe yazar. Bu desen dekoratör (decorator) olarak bilinir.

Repository arayüzü değişmeden, iç uygulama istenildiği gibi değiştirilebilir. Bu, kodun bakımını ve genişletilmesini kolaylaştırır.

Uygulama ProductRepository ve Mock tanımla

Bir Product sınıfı tanımla: final String id; final String name; Product(this.id, this.name);. Bir abstract class ProductRepository tanımla: Product fetch(String id);. Bir class MockProductRepository implements ProductRepository tanımla: @override Product fetch(String id) => Product(id, 'Kitap');. main içinde final repo = MockProductRepository(); yarat; final product = repo.fetch('1'); ve print(product.name); ekle.

Başlangıç kodu

main.dart
void main() {
  // Product sınıfını tanımla (id, name alanları)
  // abstract ProductRepository tanımla (fetch metodu)
  // MockProductRepository tanımla (arayüzü uygular)
  // bir mock repo yarat; fetch çağır; name yazdır
}

Örnek çözüm

main.dart
class Product {
  final String id;
  final String name;
  Product(this.id, this.name);
}

abstract class ProductRepository {
  Product fetch(String id);
}

class MockProductRepository implements ProductRepository {
  @override
  Product fetch(String id) => Product(id, 'Kitap');
}

void main() {
  final repo = MockProductRepository();
  final product = repo.fetch('1');
  print(product.name);
}

Beklenen çıktı

Kitap

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Repository parçalarını eşleştir

Kavram Anlamı
Repository Sözleşme
RepositoryImpl Uygulama
fetch(id) Okuma metodu
save(entity) Yazma metodu

2 Repository pattern neyi soyutlar?

  • Arayüz çizimini
  • Veri erişimini Doğru cevap
  • Test çalıştırmayı
  • Dosya okumayı

Açıklama: Repository veri erişimini soyutlar; kaynak gizli kalır.

3 Repository uygulaması

Soru
class ApiUserRepository ____ UserRepository { }
Cevap
class ApiUserRepository implements UserRepository { }

Açıklama: implements ile arayüz uygulanır.

Uzman bölümündeki tüm dersler