I miei pensieri:
Una "Barra", come rappresentato nel tuo dominio, ha tutte le cose che possono essere necessarie in entrambi i posti: nome, indirizzo, URL, logo, slogan e "distanza" (sto indovinando dal luogo del richiedente ). Pertanto, nel tuo dominio, dovrebbe esserci una classe "Bar" che è la fonte autorevole di dati per una barra, indipendentemente da dove verranno utilizzati successivamente i dati. Questa classe dovrebbe essere mutabile, in modo che le modifiche ai dati della barra possano essere apportate e salvate quando necessario.
Tuttavia, ci sono due punti in cui i dati di questo oggetto Bar sono necessari, ed entrambi hanno bisogno solo di un sottoinsieme (e non vuoi che i dati vengano modificati). La solita risposta è un "oggetto di trasferimento dati" o DTO; un POJO (semplice oggetto 'Java') contenente i getter di proprietà immutabili. Questi DTO possono essere prodotti chiamando un metodo sull'oggetto del dominio Bar principale: "toScenario1DTO ()" e "toScenario2DTO ()"; i risultati sono un DTO idratato (il che significa che è necessario utilizzare il costruttore lungo e complicato in un unico punto).
Se hai mai avuto bisogno di inviare i dati alla classe del dominio principale (per aggiornarlo, qual è il punto dei dati se non puoi cambiarlo se necessario per riflettere lo stato attuale del mondo reale?), potresti costruire uno dei DTO o utilizzare un nuovo DTO mutabile e restituirlo alla classe Bar utilizzando un metodo "updateFromDto ()".
EDIT: per fornire un esempio:
public class Bar {
private String name;
private Address address;
private Distance distance;
private Url url;
private Image logo;
private string Slogan;
public OnlineBarDto ToOnlineDto()
{
return new OnlineBarDto(name, address, url, logo);
}
public PhysicalBarDto ToPhysicalDto()
{
return new PhysicalBarDto(name, address, distance, slogan);
}
public void UpdateFromDto(PhysicalBarDto dto)
{
//validation logic here, or mixed into assignments
name = dto.Name;
address = dto.Address;
distance = dto.Distance;
slogan = dto.Slogan;
}
public void UpdateFromDto(OnlineBarDto dto)
{
//Validate DTO fields before performing assignments
name = dto.Name;
address = dto.Address;
url= dto.Url;
logo = dto.Logo;
}
// getters/setters - As necessary within the model and data access layers;
// other classes can update the model using DTOs, forcing validation.
}
public class PhysicalBarDto
{
public final String Name;
public final Address Address;
public final Distance Distance;
public final String Slogan;
public PhysicalBarDto(string Name, Address address, Distance distance, string slogan)
{ //set instance fields using parameter fields; you know the drill }
}
public class OnlineBarDto
{
public final String Name;
public final Address Address;
public final Image Logo;
public final Url Url;
public OnlineBarDto(string Name, Address address, Url url, Image logo)
{ //ditto }
}
Le classi Indirizzo, Distanza e Url dovrebbero essere immutabili o se utilizzate nel DTO dovrebbero essere sostituite con controparti immutabili.