Konstruktory budujace obiekty z innych obiektów dobre praktyki

0

Zastanawiałem sie czy dobrą praktyką jest tworzenie takiego kodu. Czyli mamy np
klasa USER z polami

  • firsName
  • lastName

i przykładowo pożyczkę LOAN w której posiadam

  • userfirstName
  • userLastName

czy dobrą praktyką jest tworzenie konstruktora w klasie LOAN np.

class LOAN {

 public LOAN(USER user){
    setUserFirstName(user.getLastName);
    setUserLastName(user.getLastName);
 }

}

jeżeli nie może ktoś zna ładny sposób aby to zamienić(może jakiś design pattern)?

Pozdr.

0

Klasy piszesz w notacji pascal case. To raz. Dwa, że w tym wypadku te dwie klasy są źle zaprojektowane. Duplikujesz dane i nie możesz zapewnić że przy zmianie imienia klasy USER zmieni się tez w klasie LOAN. Czyli dla tego przypadku nie ma poprawnego wzorca.

0

A nie lepiej po prostu zastosować kompozycję i trzymać usera w loan?

W konstruktorze raczej nie mam logiki. Tworzę puste listy, mapy, przypisuję pola.
Ja często wydzielam logikę tworzenia obiektu na podstawie innego do osobnej klasy tzw. "buildera". W twoim przypadku wyglądałoby to tak

public loan build(User user){
//wypelniam pola
}

0

Ten konkretny przypadek to zło, bo jak pisze @krzysiek050 powinieneś mieć pole owner:User w klasie Loan. W bardziej generalnym przypadku, gdy korzystasz tylko z części danych przekazanego obiektu to też nie powinno przekazywać się "głównego" obiektu.
Przykładowo, jeżeli chcesz wykorzystać tylko dwa pola z User w Loan, a reszta cię nie interesuje, albo nie możesz stworzyć takiego połączenia z jakiegoś powodu to należy utworzyć konstruktor Loan(firstName, lastName). Jeżeli w konstruktorze będzie więcej pól i nie wszystkie będą obowiązkowe, to należy utworzyć sobie buildera/factory.

0

jeżeli chcesz wykorzystać tylko dwa pola z User w Loan, a reszta cię nie interesuje

... to moim zdaniem powinieneś wyseparować interesujący Cię interfejs z obiektu User i go tu używać

0

@Świetny Mleczarz, w zwykłych encjach to będzie przerost formy nad treścią z interfejsem. Z drugiej strony:

class User{

   private Name name;
   
   private Age age;

   private Address address;

// gettery, settery i inne
}

czyli silnie typujemy wszystko co można i gdzie można.

0

ech...oczwiście że przypadek jest zły....chodziło mi tylko o samą idee tworzenia konstruktorów w ten sposób....
dzieki za rozjaśnienie sytuacji...wykorzystałem opcję z podziałem na tabeli :o
myśląłem o biulderze...ale z bazy wywnioskowałem że można śmiał pewną grupę pól wyekstrachować do oddzielnej tabelki

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