Bu tartışmanın tekrar tekrar ortaya çıkmasının nedenlerinden biri, ihtiyacınız olan tüm verileri içeren bir nesneyi almak ve onu özdeş veya neredeyse aynı olan bir nesneye dönüştürmek gibi ciddi bir acı çekiciliği gibi görünüyor. teslim ediyorsunuz.
Doğru, bu bir PITA. Ancak bunu yapmanın birkaç nedeni vardır (yukarıda sayılanların yanı sıra).
- Etki alanı nesneleri çok ağırlaşabilir ve arama için çok fazla işe yaramaz bilgi içerebilir. Bu şişkinlik, iletilen, sıralanan / paylaşılmayan ve ayrıştırılan tüm veriler nedeniyle kullanıcı arayüzünü yavaşlatır. Bir FE'nin web servislerinize atıfta bulunan ve AJAX veya başka bir çok iş parçacıklı yaklaşımla çağrıldığı çok sayıda bağlantıya sahip olacağını düşündüğünüzde, hızlı bir şekilde kullanıcı arayüzünüzü yavaşlatacaksınız. Tüm bunlar web servislerinin genel ölçeklenebilirliğine ulaşıyor
- Güvenlik çok fazla veri ortaya çıkarılarak kolayca tehlikeye atılabilir. DTO sonucundan çıkarmazsanız, en azından kullanıcıların e-posta adreslerini ve telefon numaralarını gösterebilirsiniz.
- Pratik hususlar: 1 nesnenin kalıcı bir alan nesnesi VE DTO olarak geçit vermesi için koddan daha fazla ek açıklama içermesi gerekir. Nesnelerin katmanlardan geçerken durumunu yönetmeyle ilgili herhangi bir sorun yaşarsınız. Genel olarak bu, yönetilecek bir PITA'dan daha sonra, bir alan nesnesinden bir DTO'ya alanların kopyalanması hedisini yapıyor.
Ancak, çeviri mantığını dönüştürücü sınıflarının bir koleksiyonuna yerleştirirseniz, bunu oldukça etkili bir şekilde yönetebilirsiniz.
'Convert (domainObj, toDto)' yapabileceğiniz lambdaJ'a bir göz atın, koleksiyonlarda kullanım için bunun aşırı yüklenmesi var. İşte bunu kullanan bir denetleyici yöntemi örneği. Gördüğünüz gibi, o kadar da kötü görünmüyor.
@GET
@Path("/{id}/surveys")
public RestaurantSurveys getSurveys(@PathParam("id") Restaurant restaurant, @QueryParam("from") DateTime from, @QueryParam("to") DateTime to) {
checkDateRange(from, to);
MultiValueMap<Survey, SurveySchedule> surveysToSchedules = getSurveyScheduling(restaurant, from, to);
Collection<RestaurantSurveyDto> surveyDtos = convert(surveysToSchedules.entrySet(), SurveyToRestaurantSurveyDto.getInstance());
return new RestaurantSurveys(restaurant.getId(), from, to, surveyDtos);
}