Я бы отметил, что int Age
, вероятно, не лучший способ сохранить это значение.
( Почему DateTime является свойством, а не методом
)
class Person : IBorn
{
public DateTime Birth {get; set;}
}
interface IBorn
{
DateTime Birth {get; set;}
}
interface IDateTimeFactory
{
DateTime Now();
}
class DefaultDateTimeFactory : IDateTimeFactory
{
public DateTime Now()
{
return DateTime.Now;
}
}
public static class IBornExtensions
{
public TimeSpan AgeFromNow(this IBorn birthed, IDateTimeFactory dtf)
{
return dtf.Now() - birthed.Birth;
}
public TimeSpan AgeFrom(this IBorn birthed, DateTime from)
{
return from - birthed.Birth;
}
}
class Computer
{
public void checkAge(IBorn birthed)
{
var age = birthed.Age((new DefaultDateTimeFactory()).Now());
}
}
Я уверен, что кто-то там думает, "это много кода для этого ответа, конечно, кажется возмутительным". Так же, как DateTime.Now
должен был быть методом (потому что методы возвращают значения, которые могут меняться за вызов, а свойство обычно не должно изменять значения за вызов , см. Ссылку выше), Возраст изменяется за вызов, поэтому Собственность должна быть, вероятно, рождения. Затем я инкапсулировал метод определения возраста как метод расширения, потому что все, что может быть IBorn
, безусловно, может иметь возраст (игнорируйте философский вопрос о том, что что-то мертво, есть ли у него возраст: P). И наконец, создал объект IDateTimeFactory
, чтобы можно было модульно протестировать метод Age, чтобы определить, правильно ли он вычисляет возраст (в противном случае жесткое кодирование DateTime.Now
означает, что вы не можете сказать, сколько лет что-то говорит по сравнению с чем-то другим, например, старый мой брат по сравнению с моей сестрой).