AutoMapper gibi bir şeye ihtiyaç duymanın zayıf tasarımın bir göstergesi olduğunu düşünmekte yanlış mıyım?


35

Otomatikleştirici , .NET için bir "nesne-nesne eşleyicisi" dir; bu, nesneleri bir sınıftan aynı şeyi temsil eden başka bir sınıfa kopyalamak anlamına gelir.

Bu neden hiç faydalı değil? Sınıfların tekrarı faydalı / iyi tasarım mı?


Küçük bir referans: devtrends.co.uk/blog/… Özellikle "neden otomatikleştiriciyi kullanamıyoruz?" Bölümünü okuyun.
Jani Hyytiäinen

Yanıtlar:


28

Hızlı bir google araması bu örneği ortaya çıkardı:

http://www.codeproject.com/Articles/61629/AutoMapper

AutoMapper'ın tamamen geçerli bir kullanımını gösteren, kesinlikle kötü bir tasarıma örnek değildir. Katmanlı bir uygulamada, verilerinizde veya iş katmanınızda nesneler olabilir ve bazen bu veri nesnelerinin özniteliklerinin yalnızca bir alt kümesine veya UI katmanınızda bunlara bir tür görünüme ihtiyacınız olabilir. Böylece, kullanıcı arayüzünüzde tam olarak ihtiyaç duyduğunuz özelliklere sahip nesneleri içeren bir görünüm modeli oluşturmazsınız ve bu nesnelerin içeriğini daha az parça kodu ile sağlamak için AutoMapper'ı kullanırsınız.

Böyle bir durumda, "nesneleri görüntüleme" orijinal sınıfın bir kopyası değildir. Farklı yöntemlere ve belki de birkaç kopya özelliğe sahiptirler. Ancak, bu görüntüleme nesnelerini yalnızca UI görüntüleme amaçları için kullandığınız ve bunları veri işleme veya ticari işlemler için yanlış kullanmaya başlamadığınız sürece sorun yok.

Bunu daha iyi anlamak için okuyabileceğiniz diğer bir konu, CRUD’nın aksine Fowlers Komutanlığı Sorgu Sorumluluğu Ayrıştırma modelini ifade etmektir. Verileri sorgulamak ve bunları bir veritabanında güncellemek için farklı nesne modellerinin anlam ifade ettiği durumları gösterir. Burada, bir nesne modelinden diğerine haritalama da AutoMapper gibi bir araçla yapılabilir.


1
İlk örneğinizle ilgili olarak: çoğaltmak yerine nesneleri oluşturamaz mıydınız? Bu durumda, UI nesnelerinizin orijinal veri nesnelerinize bir referansı olur ve yalnızca gerekli öğeleri gösterir. Bu mantıklı olmaz mıydı?
static_rtti

1
Teoride @static_rtti evet, ama mutlaka asıl sınıfınızın genel ve / veya bir meclise maruz
kalmasını istemeyebilirsiniz

2
@static_rtti: evet, bu tamamen geçerli, farklı bir yaklaşım. Bu iki tasarım arasındaki temel fark, verilerin / niteliklerin ömrüdür. Kopyaların kullanılması size orijinal verileri referans veren özellikleri kullanma özelliği sayesinde verilerin bir anlık görüntüsünü sunar. Her iki yaklaşımın da avantajları ve dezavantajları vardır, ancak IMHO genel olarak “daha ​​iyi veya daha kötü” değildir. Ek olarak, ne kullanılacağına karar verebilecek veya etkilemeyebilecek performans değerlendirmeleri olabilir.
Doktor Brown,

3
Mümkün olduğunca dekuplaj yapmak her zaman iyi bir fikirdir. Küçük projeler için bile özellikle faydalı olduğu için değil, projeler büyüdüğü için.
Tamás Szelei

6
@fish: Çoğunlukla katılıyorum, dekuplaj çoğu zaman iyi bir fikirdir, ancak IMHO işleri basit tutmanın çok katlı dekuplaj için ayrılma yaklaşımına göre daha ağır basar. İşin zor kısmı, projenin büyümesi sırasındaki refactoring işlemine başlaması gereken noktayı kaçırmamak.
Doktor Brown

45

Sınıfların tekrarı faydalı / iyi tasarım mı?

Veri katmanında kullanılan aynı sınıfı kullanmak yerine, UI katmanında kullanılmak üzere ayrı bir görünüm modeli sınıfına sahip olmak iyi bir uygulamadır. UI / web sayfanızın, kesinlikle veri varlığıyla ilgili olmayan diğer bilgileri görüntülemesi gerekebilir. Bu ekstra sınıfı oluşturarak, gereksinimler zaman içinde değiştikçe UI'nızı kolayca değiştirmek için kendinize bir özgürlük veriyorsunuz.

AutoMapper'ı kullanmaya başladığımda, 3 nedenden dolayı bizzat kendimden kaçınıyorum:

Sessiz arızalar daha yaygın

AutoMapper, özellikler arasında otomatik olarak eşlendiğinden, bir sınıfta özellik adını değiştirmek, diğerini değil, Özellik eşlemesinin atlanmasına neden olur. Derleyici bilmeyecek. Automapper umursamaz.

Statik analiz eksikliği

Bu yüzden size başa çıkmak için geniş bir kod tabanı verildi. Milyon mülkün olduğu bir milyon sınıf var. Çok kullanılmamış ya da kopyalanmış gibi görünüyorsun. Visual Studio'daki "Tüm referansları bul" aracı, özelliklerin nerede kullanıldığını görmenize ve uygulamanın nasıl bir araya geldiğine dair bir harita oluşturmanıza yardımcı olacaktır. Ancak bekleyin, Automapper kullanıldığından, özelliklerin yarısına açık bir referans yok. İşim şimdi çok daha zor.

Karmaşıklığı artıran geç gereksinimler

Yapmak istediğiniz tek şey değerleri ONE sınıfından diğerine kopyalamak olduğunda (genellikle geliştirme START'ında olduğu gibi), Automapper iyidir ve zordur, ancak zaman içinde değişen gereksinimleri hatırlıyor musunuz? Şimdi uygulamanızın diğer bölümlerinden, belki de giriş yapmış olan kullanıcıya veya başka bir bağlamsal duruma özel değerler almanız gerekiyorsa?

AutoMapper'ın uygulama başlangıcında bire bir sınıf eşlemeleri oluşturma modeli, bu tür bağlama özgü değişikliklere kendisini iyi borç vermez. Evet, muhtemelen çalışmasını sağlamanın yolları vardır, ancak mantığı kendim yazmak için genellikle daha temiz, daha basit ve daha anlamlı buluyorum.

Özetle, Automapper'a bir sınıfı diğerine manuel olarak eşlemek için 30 saniyelik bir süre tasarruf etmeden önce, bunu düşünün.

Programlama, bir başkasına, bilgisayarın ne yapmak istediğini söyleme sanatıdır. - Donald Knuth

Bunu akılda tutarak, kendinize sorun "bugün AutoMapper yardımcı oluyor mu ve yarın olacak mı?"


[trendy web dev kullanıyorsanız] Peki, bir REST web hizmeti yazıyorsanız, JavaScript nesne modelinizin .NET nesne modelinizle tutarlı olduğundan emin olmak için her bir özelliği her zaman kontrol etmeye meyilli misiniz?
Den

3
@Den - evet. Ve tüm özellikleri doğru aldığınızdan emin olmak için testler yazıyorsunuz (yani testiniz, 1
basamakta eklediğiniz

@gbjbaanb Muhtemelen bu doğrulamayı genel bir şekilde yapmak için yansıma kullanırdım. Belki biraz doğrulama eklemek için AutoMapper'ı genişletme olasılığını araştırın. Kesinlikle çok sayıda manuel ödevden kaçınılmalıdır .
Den

Tamamen Sizinle Kabul Edin ve sadece çok basit uygulamaların otomatikleştiriciyi kullanabileceğini düşünün, ancak işler daha karmaşık hale geldiğinde, otomatikleştirici için yeni bir yapılandırma yazmamız gerekir, o zaman neden bunları elle bir eşleme yardımcısına veya hizmetine yazmıyoruz.
ahmedsafan86

21

Tecrübelerime göre, birisi 'çok fazla kazan plakası' hakkında şikayet ettiğinde ve AutoMapper'ı kullanmak istediğinde, aşağıdakilerden biri olmuştur:

  1. Aynı kodu tekrar tekrar yazmayı rahatsız edici buluyorlar.
  2. Tembeller ve Ax = Bx kodunu yazmak istemiyorlar
  3. Ax = Bx yazıp yazmanın iyi bir fikir olup olmadığını ve ardından görev için iyi bir kod yazıp yazamayacaklarını düşünmek için çok fazla baskı altındalar.

Ancak:

  1. Gerçekten tekrarlamadan kaçınmakla ilgiliyse, soyutlamak için bir nesne veya yöntem oluşturabilirsiniz. AutoMapper'a ihtiyacınız yok.
  2. Eğer tembelseniz, tembel olacaksınız ve AutoMapper'ın nasıl çalıştığını öğrenmeyeceksiniz. Bunun yerine, 'tesadüfe göre programlama' modelini benimseyeceksiniz ve bir AutoMapper profilinde iş mantığını doldurduğunuzda korkunç bir kod yazacaksınız. Bu durumda, programlama yönündeki tutumunuzu değiştirmeli veya meslek olarak yapacak başka bir şey bulmalısınız. AutoMapper'a ihtiyacınız yok.
  3. Çok fazla zaman baskısı altındaysanız, probleminizin programlamanın kendisi ile ilgisi yoktur. AutoMapper'a ihtiyacınız yok.

Statik olarak yazılmış bir dil seçtiyseniz, dilden yararlanın. AutoMapper gibi yansıma ve sihirli API'lerin aşırı kullanımı nedeniyle hataları önlemeye yardımcı olan dilde kontrolleri atmaya çalışıyorsanız, bu sadece ihtiyaçlarınız için tatmin edici olmayan bir dil seçtiğiniz anlamına gelir.

Ayrıca, Microsoft'un C # özelliklerinin eklenmesi, her durumda adil bir oyun oldukları veya en iyi uygulamayı destekledikleri anlamına gelmez. Örneğin, yansıma ve 'dinamik' anahtar sözcüğü, ihtiyaç duymadan istediklerinizi başaramadığınız durumlarda kullanmanız gerekir. AutoMapper, onsuz çözülemeyen herhangi bir kullanım durumu için bir çözüm değildir.

Yani sınıfların kopyalanması kötü tasarım mıdır? Şart değil.

AutoMapper kötü bir fikir mi? Evet kesinlikle.

AutoMapper kullanımı, projedeki sistemik eksiklikleri gösterir. İhtiyacınız olan bir şey bulursanız, durun ve tasarımınızı düşünün. Her zaman daha iyi, daha okunaklı, daha fazla bakım gerektirebilir ve daha fazla hatasız tasarım bulacaksınız.


1
Peki, özellikle 2 demişti.
Mardoxx

2
Bunun çok eski bir konu olduğunu biliyorum, ancak 1 ile aynı fikirde olmam gerekiyor. Soyut haritalama için bir yöntem yapamazsınız. 1 sınıf için yapabilirsiniz, ancak 2 varsa, 2 yöntem gerekir. 3 - 3 yöntemleri. AM ile bu 1 kod satırıdır - haritalamanın tanımı. Ayrıca, gerçekten 10 alt tip DTO içeren bir Listede <BaseType> bulunan bir senaryo ile mücadele ettim. Bunu haritalamak istediğinizde, alan değerlerini kopyalamak için bir AND tipi ve bir metod açmanız gerekir. Peki ya alanlardan birinin ayrı ayrı haritalanması gerekiyorsa? Cevabınız sadece birkaç basit sınıfınız varsa iyidir. AutoMapper daha karmaşık senaryolarda eller aşağı kazanıyor.
kullanıcı3512524

1
(char limit) AM'nin tek sıkıntısı, diğer sınıfta değil, bir sınıftaki mülkün adını değiştirme olasılığı. Ama gerçekten, tasarım yapıldıktan sonra bunu ne sıklıkla yapıyorsunuz? Ve yansıma kullanan ve özellik adlarını karşılaştıran genel bir test yöntemi yazabilirsiniz. Tüm araçlar gibi, AM de doğru kullanılmalıdır - kör değil, her durumda değil, aynı fikirdeyim. Ama "kullanmamalısın" demek sadece yanlıştır.
kullanıcı3512524

7

Burada daha derin bir sorun var: C # ve Java'nın çoğu / tüm tiplerde ısrar etmesi gerçeği yapıdan ziyade isimle ayırt edilebilir olmalıdır: örn. class MyPoint2DVe class YourPoint2Daynı tanımları olsa bile ayrı tipler. İstediğiniz tür "bir xalan ve bir yalanla birlikte adsız bir şey " (örneğin bir kayıt ) olduğunda, şansınız kalmaz. Bir çevirmek istediğinizde Yani YourPoint2Dbir içine MyPoint2D, üç seçeneğiniz vardır:

  1. Satırları boyunca bazı sıkıcı, tekrarlayan, sıradan bir kazan yaz this.x = that.x; this.y = that.y
  2. Bir şekilde kodu üret.
  3. Yansıma kullanın.

Seçim 1 küçük dozlarda yeterince kolaydır ancak haritalandırmanız gereken tür sayısı büyük olduğunda hızlıca bir angarya haline gelir.

Seçim 2 arzu edilenden daha azdır, çünkü şimdi kodu oluşturmak için oluşturma işleminize fazladan bir adım eklemeniz gerekir ve tüm ekibin notu aldığından emin olun. En kötü durumda, kendi kod üreticinizi veya şablon sisteminizi de döndürmeniz gerekir.

Bu seni yansıma bırakıyor. Kendin yapabilirsin ya da AutoMapper'ı kullanabilirsin.


2

Automapper, imparatorun kelimenin tam anlamıyla popo etrafında dolaştığı kütüphanelerden / araçlardan biridir. Glitzy logosunu geçtiğinizde, daha iyi sonuçlarla manuel olarak yapamayacağınız bir şey yapmadığını fark edersiniz.

Otomatik eşleme üyelerini nasıl ima ettiğinden tam olarak emin olmasam da, büyük olasılıkla ek çalışma zamanı mantığı ve olası yansıma içerir. Bu, zaman tasarrufu karşılığında önemli bir performans cezası olabilir. Manuel haritalama, diğer taraftan, ipucu derleme zamanından önce iyi yürütülür.

AutoMapper'ın hiçbir ipucunun olmadığı durumlarda, haritalamayı kod ve ayar bayrakları ile yapılandırmanız gerekir. Tüm kurulum ve kod işlerini yapmakta zorluk çekiyorsanız, manuel haritalama üzerinde ne kadar tasarruf sağladığını sorgulamanız gerekir.

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.