Что пройти? Справочный объект или тип значения?

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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

public void checkAge(int n)

Ответ 5

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

Ответ 6

Я бы отметил, что 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 должен был быть методом (потому что методы возвращают значения, которые могут меняться за вызов, а свойство обычно не изменяет значения для каждого вызова, см. Ссылку выше), Возрастные изменения за звонок, поэтому свойство должно быть, вероятно, Затем я инкапсулировал метод определения Age как метода расширения, потому что все, что может быть IBorn, безусловно, может иметь возраст (игнорируйте философский вопрос о том, что что-то мертво, имеет ли он возраст: P). И наконец, создал объект IDateTimeFactory, чтобы можно было unit test использовать метод Age, чтобы определить, правильно ли он вычисляет возраст (в противном случае hardcoding DateTime.Now означает, что вы не можете сказать, сколько лет что-то говорит по сравнению с чем-то другим, например, old мой брат по сравнению с моей сестрой).