Vedi il codice qui sotto:
public class Person
{
public DateTime DateOfBirth;
public List<Offer> Offers = new List<Offer>();
public Person(DateTime DateOfBirth)
{
int age = DateTime.Now.Year-candidate.Year;
if (DateTime.Now < candidate.AddYears(age)) age--;
if (age < 18 || age > 99)
throw new ArgumentException("Age must be greater than 18.", "DateOfBirth");
_dateOfBirth=dateOfBirth;
}
public void GetOffers(IOfferCalculator offerCalculator)
{
return offerCalculator.GetOffers(this);
}
public void AssignOffers(List<Offer> offers)
{
//Assign offers to Person.Offers here.
}
}
Si noti che io passo l'intero oggetto Person a Person.GetOffers (). La ragione per cui lo faccio è perché la persona deve essere oltre 21 per tutte le offerte e questa viene verificata (validata) nel costruttore Persona. È una buona ragione per passare l'Inquiry come oggetto a: offerCalculator.GetOffers? Il motivo per cui lo chiedo è che t3chb0t ha descritto questo come un odore di codice nella mia domanda qui: link
In alternativa, potrei semplicemente passare DateOfBirth in questo modo: return offerCalculator.GetOffers (DateOfBirth). Tuttavia, ciò significherebbe che dovrei convalidare DateOfBirth in ogni offerta.
Sto cercando di seguire il principio del minimo stupore in questi giorni e mi ritrovo a pensare troppo. Le mie due domande sono:
1) È un buon appraoch passare l'oggetto Person a offerCalculator.GetOffers come Persona ha già convalidato la data di nascita?
2) Devo controllare la data di nascita di ogni offerta, anche se ogni offerta richiede che la persona abbia più di 21 anni? Non penso che questo cambierà il cambiamento, cioè la persona dovrà sempre avere più di 21 anni.