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ı?
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ı?
Yanıtlar:
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.
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ı?"
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:
Ancak:
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.
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 MyPoint2D
Ve class YourPoint2D
aynı tanımları olsa bile ayrı tipler. İstediğiniz tür "bir x
alan ve bir y
alanla birlikte adsız bir şey " (örneğin bir kayıt ) olduğunda, şansınız kalmaz. Bir çevirmek istediğinizde Yani YourPoint2D
bir içine MyPoint2D
, üç seçeneğiniz vardır:
this.x = that.x; this.y = that.y
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.
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.