Mapowanie obiektow - jak podejsc do tematu

0

Mam do Was pytanie, w jaki spsob podeszli byscie do mapowania jezeli do zrobienia bylo by cos takiego jak nizej - jakis mapstract czy inne narzedzie. Wiadomo mozna zrobic tak ale
to wyglada bardzo slabo.

// dostaje taki obiekt
String login = getUser().getSequence().get(0).getFormats().get(0).getPublications().get(0).getIdent().getLogin();

// i potrzebuje zeby ten login znalazl sie tu
user.getPublication().getTools().getDepartment().setLogin(login);

6

Nie bardzo rozumiem twoje pytanie. Nie powinieneś w ogóle pracować na jakichś gołych DTO tylko na obiektach domenowych. Wtedy robisz po prostu getUser().getLogin(), a juz obiekt User niech się martwi skąd to wziąć. Analogicznie w drugim przypadku.

0

To moze tak masz jakiegos wielkiego xmla z ktorego musisz wydlubac jednego stringa ale zeby to zrobic musisz przejsc dluga droge np taka:

getUser().getSequence().get(0).getFormats().get(0).getPublications().get(0).getIdent().getLogin()

ja to rozumiem tak ze zeby miec mozliwosc zrobienia getUser().getLogin() musialbym w obiekcie User zrobic metode getLogin()

public getLogin(){
return this.getSequence().get(0).getFormats().get(0).getPublications().get(0).getIdent().getLogin()
}

o to Ci chodzilo ?

0

xD Nie. W obiekcie domenowym User miałbyś metodę getLogin() która robi jakieś getCośtam().getLogin() co najwyzej :)
Niemniej w ogóle takie wydłubywanie wartości z obiektów jest słabe.

1

Ogólnie problem zaczyna się już na etapie struktury XMLa - jak nie masz możliwości zmiany tej struktury, to ładnego kodu nie będzie.

0

Nie mam moliwosci zmiany, musze dzialac na tym co jest, dlatego pytam jakie jest najlepsze podejscie wg Was do wydlubania pola np price z xml. Czy trzeba uzywac get.get,get czy moze jest jakis fajnieszy spsob

<catalog>
   <book id="bk101">
     <author>Gambardella, Matthew</author>
     <book id="bk102">
          <description>A former architect </description>
          <book id="bk103">
                 <price>5.95</price>
          </book>       
      </book> 
   </book>
</catalog>
1

Oczywiście to zależy :) Jeśli to jest jedyne pole którego potrzebujesz to może nie warto się przejmować, że to słabo wygląda. Oddziel tylko mechanizm odpowiedzialny za wyciąganie pola z XMLa od swojej domeny.

Czyli tak jak @Shalom napisał w domenie miałbyś swoją klasę User z polem login, a gdzieś w warstwie infrastruktury klocek odpowiedzialny za to, żeby XMLa przerobić na tego Usera. I gdyby tam miał się znaleźć ten ciąg wywołań .getSequence().get(0)... to nie będzie Cię jakoś specjalnie bolało.

0

Kiedyś pracowałem przy takich god objectach z XMLa (jeszcze za czasów JDK1.6) i rozumiem ból.

Ogólnie - możesz sobie tworzyć wrappery, które będą te gety/sety ogarniać:

public class UserWrapper {
    private final UserDto userDto;

    private UserWrapper(final UserDto userDto) {
        this.userDto = userDto;
    }

    public Optional<String> getSequenceFormatPublicationLogin() {
        return Optional.ofNullable(userDto)
                .map(UserDto::getSequence)
                .map(e -> e.get(0))
                .map(UserSequence::getFormats)
                .map(e -> e.get(0))
                .map(UserFormat::getPublications)
                .map(e -> e.get(0))
                .map(UserPublication::getIdent)
                .map(UserIdentitiy::getLogin);
    }

    public void setPublicationToolsDepartmentLogin(final String login) {
        UserPublication userPublication = userDto.getPublication();
        if (Objects.isNull(userPublication)) {
            userPublication = new UserPublication();
            userDto.setPublication(userPublication);
        }

        UserTools userTools = userPublication.getTools();
        if (Objects.isNull(userTools)) {
            userTools = new UserTools();
            userPublication.setTools(userTools);
        }

        Department department = userTools.getDepartment();
        if (Objects.isNull(department)) {
            department = new Department();
            userTools.setDepartment(userTools);
        }

        department.setLogin(login);
    }

    public static UserWrapper of(final UserDto userDto) {
        return new UserWrapper(userDto);
    }
}

Dzięki temu ukryjesz te brzydkie wyciąganie danych do oddzielnej warstwy i nie będziesz się musiał martwić, że w obiekcie brakuje jakiegoś pola. Z czasem porobiły się wrappery per pewna grupa use-case'ów (tj. miałeś kilka UC korzystało z jednego wrappera, inne z drugiego - ale się nie mieszały) przez co w końcu dało się żyć.

0

Ja bym użył regexpa, aby wydłubać pole

1 użytkowników online, w tym zalogowanych: 0, gości: 1