Menu
CoddyTech

Depo Deseni

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

Repository kalıbı, 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ıyla, API'lerle veya dosyalarla doğrudan etkileşim kurması yerine, tüm veri işlemlerini gerçekleştiren bir repository ile çalışırlar.

Bu kalıp, veri işlemleri için bir arayüz tanımlar; somut uygulamalar ise gerçek depolama mekanizmasını yönetir. Böylece iş mantığını değiştirmeden veri kaynaklarını kolayca değiştirebilirsin:

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

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

// Bellek içi uygulama
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ı değiştirebilirsiniz. Bu kalıp, veri kaynaklarının zaman içinde değişebileceği test edilebilir ve sürdürülebilir uygulamalar için gereklidir.

challenge icon

Görev

Kolay

Repository kalıbını kullanarak bir ürün envanter sistemi oluşturalım! Ürünlerin nasıl saklandığı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 dosyada düzenleyeceksin:

  • product_repository.dart: Bu dosya, varlık ve depo sınıflarını içerir. id (int), name (String) ve price (double) için final alanları olan bir Product sınıfıyla başla. Ardından, veri işlemlerinin sözleşmesini tanımlayan soyut bir ProductRepository sınıfı tanımla: nullable bir Product döndüren getById(int id), ürünlerden oluşan bir liste döndüren getAll(), bir ürünü saklayan save(Product product) ve bir ürünü kaldıran delete(int id). Son olarak, depolama için bir Map<int, Product> kullanarak bu arayüzü uygulayan bir InMemoryProductRepository oluştur.
  • main.dart: Depo dosyanı içe aktar ve Repository kalıbının işleyişini 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şturup iş mantığının hiçbirini değiştirmeden onunla değiştirebilirsin!

Beklenen çıktı:

Found: Mouse - $29.99
Products in stock: 2

Kendin dene

import 'product_repository.dart';

void main() {
  // Depoyu oluştur - türün uygulama değil, arayüz olduğuna dikkat et
  // TODO: Bir InMemoryProductRepository oluştur ve bunu bir ProductRepository değişkeninde sakla
  
  // TODO: Üç ürünü kaydet:
  // - 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ü getir ve şunu yazdır: "Found: [name] - $[price]"
  
  // TODO: id değeri 1 olan ürünü sil
  
  // TODO: Kalan ürünlerin sayısını yazdır: "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