Должен ли я передать целые экземпляры объекта или только значения, необходимые в методы? - PullRequest
0 голосов
/ 17 января 2012

Я знаю «логический подход» к этому вопросу ...

Это логически правильно :

public static Department FindDepartment(Employee emp)
{
    if(emp.ID > 500)
    {
         return new Department("Department for Over 500");
    }else{
         return new Department("Department for 500 and under");
    }
 }

... потому что Департамент действительнооснованный на Employee, тогда как следующее логически неверно :

public static int GetPlusOne(Employee emp)
{
     return emp.ID + 1;
}

... потому что метод на самом деле не является функцией Employee ... это просто целочисленный модификатор.

Это все говорит (и не стесняйтесь указывать, если я по какой-то причине ошибаюсь), есть ли потеря производительности при прохождении всего экземпляра Employee?

У меня есть базовый метод, который будет вызываться большую часть времени из другого класса, и поэтому я пытаюсь сравнить производительность и логичность здесь.Но если вам не о чем беспокоиться по поводу производительности, то выбор становится логичным (хаха ... слабо).

Ответы [ 3 ]

3 голосов
/ 17 января 2012

С точки зрения самого вызова метода любой потери производительности будет недостаточно.Более важным является влияние, которое это оказывает на удобство сопровождения вашей программы.

Если вы берете Employee в качестве аргумента, кто-то должен всегда убедиться, что у него есть en Employee, прежде чем он сможет вызвать ваш метод.С одной стороны, это помогает избежать ошибок, когда люди передают неверную переменную int в ваш метод:

int plusOne = GetPlusOne(emp.DirectReportId); // oops, didn't you mean EmployeeId?

С другой стороны, это может раздражать, если все, что у меня есть, это идентификатор сотрудника,и теперь мне нужно сделать какой-то доступ к базе данных, чтобы получить из него реальный объект Employee.

foreach(var pinkSlip in pinkSlips)
{
    var employee = GetEmployee(pinkSlip.EmployeeId); // ugh, is this really necessary?
    int plusOne = GetPlusOne(employee);
    ...
}

Если GetEmployee делает что-то дорогое, например, обход данных базы данных, приведенный выше код потенциально может быть очень медленным: не из-за вызова GetPlusOne, а потому, что вы должны создать Employee, когда все, что вас интересует, это идентификатор.

В конечном итоге вам придется принимать это решение в зависимости от того, как выожидать, что данный метод будет использован.

2 голосов
/ 17 января 2012

IF Employee - это class, тогда .NET передает ссылку (которая в основном является указателем), а НЕ сам экземпляр ... так что производительность довольно похожа на метод реального экземпляра (который тоже получает ссылку на экземпляр как неявный параметр , называемый this).

Вы даже можете определить их как Методы расширения вроде:

public static Department FindDepartment(this Employee emp)
{
    if(emp.ID > 500)
    {
         return new Department("Department for Over 500");
    }else{
         return new Department("Department for 500 and under");
    }
}

затем вы вызываете его как любой метод экземпляра для экземпляра Employee:

Employee emp = ...;

Department dep = emp.FindDepartment();
0 голосов
/ 17 января 2012

Я бы на самом деле сделал и depFindBy (int employeeId) и depFindBy (Employee employee).не так много работы, и может быть удобно иметь оба метода позже.

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