Menu
Coddy logo textTech

Depo Deseni

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 100 / 110.

Repository pattern, uygulamanız ile veri kaynakları arasında bir soyutlama katmanı oluşturarak veri erişim mantığını iş mantığından ayırır. Sınıflarınızın veritabanları, API'ler veya dosyalarla doğrudan etkileşim kurması yerine, tüm veri işlemlerini yöneten bir repository ile çalışırlar.

Desen, veri işlemleri için bir arayüz tanımlar ve somut uygulamalar gerçek depolama mekanizmasını yönetir. Bu, iş mantığınızı değiştirmeden veri kaynaklarını değiştirmeyi kolaylaştırır:

// Varlık (Entity)
class User {
  final int id;
  final String name;
  User(this.id, this.name);
}

// Repository arayüzü
abstract class UserRepository {
  User? getById(int id);
  List<User> getAll();
  void save(User user);
  void delete(int id);
}

// Bellek içi implementasyon
class InMemoryUserRepository implements UserRepository {
  final Map<int, User> _users = {};

  @override
  User? getById(int id) => _users[id];

  @override
  List<User> getAll() => _users.values.toList();

  @override
  void save(User user) => _users[user.id] = user;

  @override
  void delete(int id) => _users.remove(id);
}

void main() {
  UserRepository repo = InMemoryUserRepository();
  
  repo.save(User(1, 'Alice'));
  repo.save(User(2, 'Bob'));
  
  print(repo.getById(1)?.name);  // Alice
  print(repo.getAll().length);    // 2
}

İş mantığınız yalnızca UserRepository arayüzüne bağlıdır. Daha sonra aynı arayüzü uygulayan bir DatabaseUserRepository veya ApiUserRepository oluşturabilir ve depoyu kullanan hiçbir kodu değiştirmeden uygulamaları birbirleriyle değiştirebilirsiniz. Bu desen, veri kaynaklarının zamanla değişebileceği test edilebilir ve bakımı kolay uygulamalar için temeldir.

challenge icon

Görev

Kolay

Repository kalıbını kullanarak bir ürün envanter sistemi oluşturalım! Ürünlerin nasıl depolandığını nasıl kullanıldıklarından ayıran bir soyutlama katmanı oluşturacaksın; böylece iş mantığını değiştirmeden depolama uygulamalarını kolayca değiştirebileceksin.

Kodunu iki dosyaya ayıracaksın:

  • product_repository.dart: Bu dosya, varlık ve repository sınıflarını içerir. Product (int), final (String) ve id (double) için name alanlara sahip bir price sınıfıyla başla. Ardından veri işlemleri için sözleşmeyi tanımlayan bir soyut ProductRepository sınıfı oluştur: null olabilir bir getById(int id) döndüren Product, ürünlerden oluşan bir liste döndüren getAll(), bir ürünü depolamak için save(Product product) ve bir ürünü kaldırmak için delete(int id). Son olarak, depolama için InMemoryProductRepository kullanarak bu arayüzü uygulayan bir Map<int, Product> oluştur.
  • main.dart: Repository dosyanı içe aktar ve Repository kalıbını uygulamalı olarak göster. Bir InMemoryProductRepository oluştur, ancak bunu ProductRepository türünde bir değişkende sakla; bu, kodunun uygulamaya değil arayüze bağlı olduğunu gösterir. Üç ürün kaydet: Laptop (id: 1, price: 999.99), Mouse (id: 2, price: 29.99) ve Keyboard (id: 3, price: 79.99). Ardından id'si 2 olan ürünü al ve Found: [name] - $[price] biçiminde yazdır. id'si 1 olan ürünü sil. Son olarak, kalan ürünlerin sayısını Products in stock: [count] olarak yazdır.

Bu kalıbın gücü, ana kodunun yalnızca ProductRepository arayüzünü bilmesidir. Daha sonra bir DatabaseProductRepository veya ApiProductRepository oluşturabilir ve iş mantığının hiçbirini değiştirmeden bunu kullanıma alabilirsin!

Beklenen çıktı:

Found: Mouse - $29.99
Products in stock: 2

Kendin dene

import 'product_repository.dart';

void main() {
  // Depoyu oluşturun - türün uygulama değil, arayüz (interface) olduğuna dikkat edin
  // TODO: Bir InMemoryProductRepository oluşturun ve bunu bir ProductRepository değişkeninde saklayın
  
  // TODO: Üç ürün kaydedin:
  // - Laptop (id: 1, price: 999.99)
  // - Mouse (id: 2, price: 29.99)
  // - Keyboard (id: 3, price: 79.99)
  
  // TODO: id değeri 2 olan ürünü getirin ve yazdırın: "Found: [name] - $[price]"
  
  // TODO: id değeri 1 olan ürünü silin
  
  // TODO: Kalan ürünlerin sayısını yazdırın: "Products in stock: [count]"
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Dart derleyicisi