Repository Deseni
- İngilizcesi
- Repository Pattern
- Okunuşu
- ripozıtori petırn
Kısaca
Repository deseni, veri erişimini koleksiyon benzeri bir arayüzün arkasına gizler; iş kodu nesnelerin nerede saklandığını bilmeden yükleyip kaydedebilir.
Repository deseni nedir?
Repository, gerçekte bir veritabanından, API'den ya da dosyalardan okuyup yazarken kullanıcılar veya siparişler gibi alan nesnelerinin bellek içi bir koleksiyonu gibi davranan bir nesnedir. İş kodu findById, save ve findOverdueInvoices gibi metotları çağırır; SQL'i, ORM çağrılarını ya da HTTP isteklerini perde arkasında repository yönetir. Desen, Martin Fowler tarafından 2000'lerin başında tanımlanmış ve domain-driven design'ın temel yapı taşlarından biri olmuştur.
Genellikle repository'yi iş katmanında bir arayüz olarak tanımlar ve bir ya da daha fazla uygulama yazarsınız: üretim için SQL veya ORM tabanlı olan ve hızlı testler için bellek içi olan. Metotlar veritabanının değil, alanın diliyle adlandırılır ve domain-driven design'da genellikle her tablo için değil, birlikte kaydedilen bir nesne kümesi olan her aggregate için bir repository bulunur. Clean ve hexagonal architecture'da repository arayüzü bir port, veritabanı uygulaması ise bir adaptördür.
Kütüphanenin danışma masası bir benzetmedir: bir kitabı adıyla istersiniz ve görevli, nerede saklandığını bilmenize gerek kalmadan onu raflardan, arşivden ya da başka bir şubeden getirir. Repository'ler, servislere sahte bir repository verilebildiği için kodu test etmeyi kolaylaştırır ve veritabanı ayrıntılarının iş mantığına yayılmasını önler.
Repository deseni sıklıkla DAO (data access object) ve ORM ile karıştırılır. DAO genellikle veritabanını yansıtır; her tablo için bir sınıf ve genel oluşturma, okuma, güncelleme ve silme metotları vardır. Repository ise alanın diliyle konuşur ve birkaç tabloyu birleştirebilir. ORM nesneleri tablolara eşler ve repository onu sarabilir, ancak birçok ORM zaten repository benzeri API'ler sunar; bu yüzden kendi katmanınızı eklemek ancak testi basitleştirdiğinde ya da gerçek karmaşıklığı gizlediğinde değerlidir. Ortak ada rağmen bir Git repository'siyle de hiçbir ilgisi yoktur.
Önemli noktalar
- Repository, iş koduna nesneleri yüklemek ve kaydetmek için koleksiyon benzeri bir arayüz verir.
- Metotları veritabanı terimleriyle değil,
findOverdueInvoicesgibi alan diliyle adlandırılır. - Üretim kodu bir veritabanı uygulaması kullanabilir, testler ise bellek içi bir uygulama.
- Clean ve hexagonal architecture'da repository arayüzü bir porttur.
- DAO genellikle tabloları yansıtır; repository alana göre şekillenir.
Örnek
interface User { id: string; email: string }
// The business layer depends only on this interface
interface UserRepository {
findById(id: string): Promise<User | null>;
save(user: User): Promise<void>;
}
// An in-memory implementation for tests (production would use SQL or an ORM)
class InMemoryUserRepository implements UserRepository {
private users = new Map<string, User>();
async findById(id: string) { return this.users.get(id) ?? null; }
async save(user: User) { this.users.set(user.id, user); }
}Sık sorulan sorular
Repository ile DAO arasındaki fark nedir?
DAO genellikle veritabanı yapısına bağlıdır; çoğunlukla her tablo için genel CRUD metotlarına sahip bir sınıftır. Repository ise alana bağlıdır: iş ihtiyaçlarına uyan metotlar sunar ve birkaç tablodaki veriyi tek bir nesnede birleştirebilir.
ORM kullanıyorsam repository desenine ihtiyacım var mı?
Her zaman değil. Birçok ORM zaten repository benzeri metotlar sunar ve bunları yeniden sarmak şablon kod ekleyebilir. Özel bir repository en çok alana özgü sorguları tek bir yerde toplamak, kolay test yedekleri (test double) kullanmak ya da veri kaynağını sonradan değiştirebilme özgürlüğü istediğinizde yararlıdır.
Repository ile servis arasındaki fark nedir?
Repository yalnızca nesneleri saklamaktan ve geri getirmekten sorumludur. Servis ise sipariş vermek gibi iş mantığını içerir ve üzerinde çalıştığı veriyi yüklemek ve kaydetmek için bir ya da daha fazla repository kullanır.
İlgili sayfalar
- ORMVeritabanları, s. 24ORM, veritabanı tablolarını programlama dilinizdeki nesnelere eşleyen ve ham SQL yerine kodla veri okuyup yazmanızı sağlayan bir kütüphanedir.
- Domain-Driven DesignYazılım Mimarisi, s. 12Domain-driven design, kodu iş alanına yakından modelleyen ve alan uzmanlarıyla aynı dili kullanan bir yazılım geliştirme yaklaşımıdır.
- Hexagonal ArchitectureYazılım Mimarisi, s. 18Hexagonal architecture, çekirdek iş mantığının dış dünyayla yalnızca portlar ve değiştirilebilir adaptörlerle konuştuğu bir yazılım yapılandırma yöntemidir.
- Clean ArchitectureYazılım Mimarisi, s. 5Clean architecture, temel iş kuralları framework'e, veritabanına ya da kullanıcı arayüzüne asla bağımlı olmasın diye yazılımı katmanlara ayırma yöntemidir.
- MockingTest ve Kalite, s. 16Mocking, kodu yalıtılmış biçimde test etmek için veritabanı ya da API gibi gerçek bir bağımlılığı kontrol ettiğiniz bir sahteyle değiştiren test tekniğidir.
- Katmanlı MimariYazılım Mimarisi, s. 21Katmanlı mimari, uygulamayı sunum, iş mantığı ve veri erişimi gibi yatay katmanlara böler ve her katman yalnızca altındaki katmanı çağırır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin