Что пройти? Ссылочный объект или тип значения? - PullRequest
10 голосов
/ 15 февраля 2010

Ребята, у меня есть "вопрос передового опыта". Например, у меня есть следующие классы:

class Person
{
   public int age {get; set;}
}

class Computer
{
   public void checkAge(Person p)  // Which one is recommended   THIS
   {
       // Do smthg with the AGE
   }

   public void checkAge(int p)     // OR THIS
   {
       //Do smthg with the age.
   }
}

Что рекомендуется пройти? Только то, что мне нужно (тип int-value) или весь объект (тип ссылки)

Я спрашиваю об этом, потому что я использую LINQ в приложении, которое я создаю, и я создал много сущностей, где я должен передать идентификаторы (внешние ключи), но я передаю объекты.

Каков наилучший подход?

Ответы [ 6 ]

16 голосов
/ 15 февраля 2010

Функция checkAge должна принимать только минимальное количество информации, необходимой для выполнения своей работы. Добавление чего-либо еще просто создает искусственную зависимость. Если нужен только int, то это решение, которое я должен принять.

12 голосов
/ 15 февраля 2010

Я бы сказал, что в этом случае ответ, вероятно, нет. Либо «Age» будет выделен в свой собственный класс, либо, если операция зависит от контекста Person, он будет найден внутри самого класса Person.

3 голосов
/ 15 февраля 2010

с предоставленной информацией, ни одно из решений не является хорошим

первое решение требует, чтобы класс Computer знал о Person.Age без видимой причины

второй присоединяет метод к классу Computer, который не имеет ничего общего со свойствами объекта Computer

некоторый контекст был бы полезен - если это проверка, тогда CheckAge принадлежит классу Person (возможно, со свойством IsAgeAcceptable)

Почему компьютер проверяет возраст человека? Ответ на этот вопрос определяет, что имеет смысл ...

2 голосов
/ 15 февраля 2010

Следуйте закону деметры для функций. В основном закон гласит, что субъекты должны быть слабо связаны. Задайте себе следующий вопрос: должен ли компьютерный объект знать об объекте человека? В этом случае, возможно, все, что вы делаете внутри checkAge, проверяет значение int. Если это так, то что заставляет вас думать, что необходимо передать весь объект? Просто укажите возраст человека и в этом случае укажите его как int.

Так предпочитаю

public void checkAge(int n)
0 голосов
/ 15 апреля 2015

Я бы отметил, что 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 означает, что вы не можете сказать, сколько лет что-то говорит по сравнению с чем-то другим, например, старый мой брат по сравнению с моей сестрой).

0 голосов
/ 16 февраля 2010

Я хотел бы отметить, что при передаче ссылки ссылка является 32-разрядным целым числом, а тип данных копируется. Поэтому, если ваш тип значения больше, чем 32-битное целое, передайте по ссылке, если производительность или память являются какой-либо проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...