Chcę przekonwertować/odwzorować niektóre obiekty klasy "dane" na podobne obiekty klasy "danych". Na przykład klasy formularza internetowego do klas dla rekordów bazy danych.Lepszy sposób zamapowania obiektów danych Kotlin na obiekty danych
data class PersonForm(
val firstName: String,
val lastName: String,
val age: Int,
// maybe many fields exist here like address, card number, etc.
val tel: String
)
// maps to ...
data class PersonRecord(
val name: String, // "${firstName} ${lastName}"
val age: Int, // copy of age
// maybe many fields exist here like address, card number, etc.
val tel: String // copy of tel
)
używam ModelMapper dla takich prac w Javie, ale nie może być stosowane, ponieważ klas danych są ostateczne (ModelMapper tworzy proxy CGLib czytać definicje mapowania). Możemy użyć ModelMapper gdy otworzymy te klasy/pola, ale musimy ręcznie zaimplementować funkcje klasy "data". (porównaj przykłady ModelMapper: https://github.com/jhalterman/modelmapper/blob/master/examples/src/main/java/org/modelmapper/gettingstarted/GettingStartedExample.java)
Jak zmapować takie obiekty "danych" w Kotlin?
Aktualizacja: ModelMapper automatycznie mapuje pola o tej samej nazwie (np. Tel -> tel) bez deklaracji odwzorowań. Chcę to zrobić z klasą danych Kotlin.
Aktualizacja: Cel każdej klasy zależy od rodzaju aplikacji, ale są one prawdopodobnie umieszczone w różnych warstwach aplikacji.
Na przykład:
- dane z bazy danych (Entity Database) do danych formularza HTML (Model/Widok Model)
- REST API wynik do danych dla bazy
Klasy te są podobne, ale nie są takie same.
chcę uniknąć normalne funkcjonowanie wymaga tych powodów:
- To zależy od kolejności argumentów. Funkcja dla klasy z wieloma polami, które mają ten sam typ (np. String), będzie łatwo zepsuta.
- Wiele deklaracji jest obowiązkowych, chociaż większość odwzorowań można rozwiązać za pomocą konwencji nazewnictwa.
Oczywiście biblioteka o podobnej funkcji jest przeznaczona, ale informacje o funkcji Kotlin również są mile widziane (jak rozpowszechnianie w ECMAScript).
Proszę opisać, w jaki sposób mają być używane odwzorowane klasy. Jaki jest cel posiadania dwóch oddzielnych formatów danych? – voddan
Nigdy nie słyszałem o powielaniu modelu danych (z wyjątkiem przypadków starego kodu). Zwykle dane, z którymi pracujesz (View Model) ** to ** dane, które umieszczasz w bazie danych. – voddan
Jednym z przypadków użycia @voddana byłoby ujawnienie tylko części modelu domeny różnym użytkownikom API. Posiadanie oddzielnego DTO na _view_ modelu domeny jest znacznie czystsze niż użycie np. [JsonView] (http://fasterxml.github.io/jackson-annotations/javadoc/2.1.1/com/fasterxml/jackson/annotation/JsonView.html) IMHO – miensol