“Haritacı” geçerli bir tasarım deseni mı, yoksa “Fabrika” modelinin bir varyasyonu mu?


37

Gördüğüm ortak bir model , bir tür "ham" veri kaynağını (örneğin bir ADO.NET veya ) argüman olarak alan ve alanlarını haritalayan, Mappermodel olarak bilinen şeydir (karıştırılmaması DataMappergereken bir şeydir) . Bir işletme / etki alanı nesnesindeki özellikler. Örnek:DataReaderDataSet

class PersonMapper
{
    public Person Map(DataSet ds)
    {
        Person p = new Person();
        p.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString();
        // other properties...
        return p;
    }
}

Fikir, Ağ Geçidi / DAO / Depo / etc. Dönmeden önce Eşleştiriciyi arayacak, bu nedenle temel veri konteynerine karşı zengin bir iş nesnesi elde edeceksiniz.

Bununla birlikte, bunun aynı olmasa da, bir etki alanı nesnesini oluşturan ve döndüren Fabrika modeliyle (DDD parlance olarak, yine de) ilişkili olduğu görülüyor. Wikipedia şöyle diyor: DDD Fabrikası:

Fabrika: etki alanı nesneleri oluşturma yöntemleri, alternatif uygulamaların kolayca birbirleriyle değiştirilebileceği şekilde uzmanlaşmış bir Fabrika nesnesine yetki vermelidir.

Bu alıntıdan, aklıma gelebilecek tek fark, DDD tarzı Fabrika'nın “Eşleştirici” belirli bir sınıfa kilitlenirken ihtiyaç duyulduğunda (örneğin, BusinessCustomer ve ResidentialCustomer gibi) özel bir nesne türü getirebilmesi için parametrelendirilebilmesidir. ve sadece çeviri yapar.

Öyleyse bu iki model arasında bir fark var mı veya temelde farklı isimlerle aynı şey mi?


Bu ORM'den farklı mı ve öyleyse, fark nerede?
JB King

ORM'ler haritalamayı sizin için otomatik olarak tutar - bu bir ORM kullanamayacağınız bir senaryo için daha fazladır (veya kendi veri katmanınızı / ince ORM'yi yazmak zorunda kalır)
Wayne Molina

1
DataMapper'ın "tamamen başka bir şey" olduğunu görmek için gerçekten mücadele ediyorum.
pdr

Belki de yanılıyorum - Bu DataMapperşablonun veritabanının kendisine erişebildiğini düşündüm, bu "Haritacı" veritabanından çıkmıyor, bir tür sonuç sonucunu bir nesneye dönüştürüyor.
Wayne Molina

martinfowler.com/eaaCatalog/dataMapper.html Ne demek istediğinizi anlıyorum ama son paragrafı okuduğunuzda, haklısın. PEAA Kataloğuna bakın. martinfowler.com/eaaCatalog/index.html . Tanımladığınız şey kesinlikle bir Eşleştirici türüdür ve DataMapper'a diğerlerinden daha çok uyar.
pdr

Yanıtlar:


23

Mapper modelini ilk defa duyduğum halde, bana göre Fabrikadan ziyade Builder desenine benziyor.

Fabrika modelinde, birtakım ilgili sınıflardan nesneler yaratma mantığını kapsıyorsunuz. En önemli örnek, bazı parametrelere bağlı olarak, bazı soyut taban sınıflarından belirli bir alt sınıftan bir nesne yaratmanız gereken bir durum olacaktır. Böylece bir Fabrika her zaman temel sınıfa bir işaretçi ya da referans döndürür, ancak aslında verdiğiniz parametrelere dayanarak uygun türetilmiş sınıfın bir nesnesini yaratır.

Buna karşılık, bir Builder sınıfı her zaman aynı sınıfın nesnelerini oluşturur. Bir nesnenin yaratılması karmaşıksa, örneğin kurucusunun tümü anında bulunamayacak birçok argüman alırsa bunu kullanırsınız. Bu yüzden, yapıcı nesne, tümü sizin sahip olduğunuza ve "ürün" oluşturmaya hazır olana kadar yapıcı argümanlarının değerlerini depolayan bir yer olabilir veya makul varsayılan değerler sağlayabilir ve yalnızca kendi değerleri için gereken argümanları belirtmenize izin verebilir değişiklik. Builder modeli için tipik bir kullanım örneği, test kodunu tüm oluşturma mantığına karıştırmamak için birim testinde ihtiyacınız olabilecek nesneleri oluşturmak içindir.

Bana göre bir Mapper, bir Oluşturucu değişkenine benziyor, yapıcı parametreleri bir veritabanı kaydı veya başka bir "ham" veri yapısı biçiminde geliyor.


Hmm, Builder'ı duymuştum, ancak% 100 ne gerektirdiğinin farkında değildim - bu, işlerin netleşmesine yardımcı oldu! Neredeyse en büyük fark gibi sesler Fabrika, bir Oluşturucu / Eşleştirici gerçek verileri alır ve bunları (eğer varsa) mantığı olmadan özelliklere eşleştirirken, gerçekten parametrelere dayanan bir somut sınıf olan bir arayüz / soyut sınıf döndürür. ?
Wayne Molina

1
@Waine M: hemen hemen. Bir Oluşturucu'da çok fazla mantık bulunabilmesine rağmen, verilerin özelliklerle eşlenmesi hiç de basit olmayabilir. Aslında, bir oluşturucu parametreleri oluşturmak için başka inşaatçılar içerebilir. :)
Dima

5
Oluşturucu deseni, zaman içinde karmaşık (genellikle değişmez) bir nesne oluşturmak için gereken tüm bilgileri koymanıza ve ardından işlemi sonunda nesneyi başlatmanıza olanak tanır. Burada olan bu değil.
pdr

+1 Bunun, DTO nesneleri ve etki alanı modeli nesneleri arasında bir aracı olarak görev yapmak üzere ayrı bir 'eşleyici' sınıfına sahip olduğunu kabul eden bir yaklaşım olduğu kabul edildi. Etki alanı modeli nesnelerinin oluşturulurken bazı özel durumlara getirilmesi gerektiğinde de kullanışlıdır (örn. .NET ISupportInitialize arabirimi).
MattDavey

Pdr, bir Eşleştiricinin tam olarak bir inşaatçı gibi olmadığını kabul ediyorum, çünkü tüm veriler bir kerede mevcut. Fakat çok benzer, çünkü sadece bir nesne türü yaratıyor.
Dima

8

Mapper, Builder ve Factory ile ilgili yaygın olan tek şey, "yapılandırılmış ürün" - ve bir türün nesne örneğini sunmalarıdır. Herhangi bir karışıklığı önlemek için, kendi tanımları için aşağıdaki tartışmalara atıfta bulunuyorum.

  1. Eşleştiricisi - burada açıklananlara yakın: http://www.codeproject.com/KB/library/AutoMapper.aspx . Bu tam olarak yukarıdaki gibi değil - ama mapper hakkında bulduğum en yakın şey.

  2. Oluşturucu - burada tanımlandığı gibi: http://www.oodesign.com/builder-pattern.html

  3. Fabrika - burada tanımlanmıştır: http://www.oodesign.com/factory-pattern.html

Eşleştirici esasen içte bir yapıcıdır. Eğer bir eşleştiriciniz yoksa bir süre için varsayalım - Yine de birçok parametreye ihtiyaç duyduğunuzda hepsi yapıcıdaki argümanlardır. Artık işler geliştikçe, bazı uygulamalar birinin onu hesapladığı ya da varsayılanını kullandığı yapıcıya girmesi gereken ek özelliklerin farkında değildir. Kritik olan şey, haritacının sizin için yapabileceği - ve bunun inşaat için böyle bir algoritmaya karar vermek için harici nesnelerle bağlantısı olması daha faydalı olacaktır.

Oluşturucu, eşleştiriciden çok farklı. Bir oluşturucu, tam bir nesne, nesnenin birçok bölümünü kullanarak oluşturulduğunda esastır. Nesneleri birçok parçaya birleştirerek bir araya getirme türüdür. Tek tek parça nesnelerinin başlatılması bile diğer parçaların varlığı ile ilgilidir.

Fabrika kalıpları başlangıçta çok basit görünüyor. Yeni oluşturulmuş nesneleri döndürür. Herhangi bir sıradan kurucu bana new () gibi bir operatör kullanarak tamamen işlevsel bir örnek verebilir mi? neden bana aynı sonuçları veren bir fabrikaya ihtiyacım olsun ki?

Bununla birlikte, fabrika modelinin kullanımı tipik olarak çok spesifiktir; en sık, bunun uygulandığı literatürde gösterilmez. Genellikle bir uygulama, yürütme sırasında bu tür ürün nesneleri yaratması gereken çeşitli nesnelerle paylaşılan bir fabrika oluşturur. Bu tür birçok ürün oluşturulduğunda, Factory yöntemi örneğin belirli politikaya dayalı nesnelerin oluşturulmasına izin verir , biri tüm nesneler oluşturulduğunda fabrika yöntemi tarafından kullanılan belirli bir şablonu zorlayabilir. Bu, bir kurucu yöntem gibi değildir; Burada ürün sadece bir (ve bağımsız). Bu aynı zamanda mapper'a benzemez; Burada istemci başına nesne oluşturmak için dış veri aslında asgari düzeydedir. Fabrika modeli gerçekten (adından da anlaşılacağı gibi) sürekli olarak benzer bir ürün nesnesi sağlıyor!

Dipan.



4

Cevapları incelerken cevap verenlerin hepsinin anlamsal olarak yanlış cevaplar verdiğini görüyorum. Sanırım bunun nedeni, haritacının fabrika veya inşaatçı ile nasıl ilişkili olduğuna odaklanan bir soruya çok odaklandığınızdır.

Aslında Mapper fabrikaya ya da üreticiye benzemiyorsa. Eşleştirici en çok adaptör modeline benzer (GoF parlance kullanılarak). Bağdaştırıcı deseni, bir gösterimi diğerine dönüştürme işlevi sağlar. OP, ADO.NET'teki DataSet ve DataReader'a atıfta bulundu - peki SqlDataAdapter? Cevap adına. Eşleştiricisi, eski programcıların uzun süredir bildiği bir şey için yeni bir addır: adaptörler.

Eşleştirici, bir gösterimi diğerine dönüştürür - bağdaştırıcı deseninin tanımı.


1

Burada yaptığınız şey aslında bir tür dönüşümdür (ham verilerinizi bir iş nesnesine dönüştürürsünüz). Fabrika Desenini tam olarak bunu yapmak için kullanabilirsiniz (yani, dönüşümleri yazın), yani evet, bir şekilde sınıfınız bir fabrikadır (bunun için Statik Fabrika kullanırdım).


0

İnşaatçılar, bir nesne oluşturmak için karmaşık iş mantığını kapsüller. Eşleştirici ise diğer taraftan alanları birinden diğerine kopyalamalıdır.

Örnek için harita Alan Çalışan nesnesi 'Veritabanı Çalışan Nesne dan, harita Müşteri Sözleşmesi Domain Çalışan Nesne dan.

Diğer taraftan, inşaatçılar, bir nesne oluşturmak için birden fazla iş kararına ev sahipliği yapar . Tek Sorumluluk bakış açısına göre, bu mantıklı geliyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.