Что пройти? Справочный объект или тип значения?
Ребята У меня есть "вопрос с наилучшей практикой". Например, у меня есть следующие классы:
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 мой брат по сравнению с моей сестрой).