Должен ли я использовать метод с параметрами или функцией? - PullRequest
0 голосов
/ 06 февраля 2009

У меня философская проблема программирования. Допустим, у меня есть класс с именем «Сотрудники». У сотрудников есть бизнес-члены, которые устанавливаются из dataTable. Чтобы заполнить это, я использую метод, который берет экземпляр класса employee, проходит по циклу dataTable и устанавливает члены экземпляра, переданного в него. Например:

public void GetEmployees(objEmployee)
{
  //the function I am calling returns a dataTable of all the employees in the db.
  dim dt as DataTable = dbEmployees.GetEmployees(); 

   foreach(DataRow drow in dt.rows) 
     {
        objEmployee.Name = drow["Name"].ToString();
        objEmployee.ID = drow["ID"].ToString();
     }
}

Тогда я бы назвал такой код в своей логике пользовательского интерфейса:

public void GetEmployees()
{
   Employees employee = new Employees();

   employee.GetEmployees(employee);
}

У меня вопрос: допустимо ли передавать в моем экземпляре класса метод и изменять свойства, как я, или было бы более объектно-ориентированным делать это с помощью такой функции:

 public Employees GetEmployees()
  {
     Employees objEmployee = new Employees();

  //the function I am calling returns a dataTable of all the employees in the db.
  dim dt as DataTable = dbEmployees.GetEmployees(); 

   foreach(DataRow drow in dt.rows) 
     {
        objEmployee.Name = drow["Name"].ToString();
        objEmployee.ID = drow["ID"].ToString();
     }

  return objEmployee


}

И тогда я бы назвал это так:

private void GetEmployees()
{

Employees employee;

employee = employee.GetEmployees();
}

Есть ли преимущество использования функции перед методом? Спасибо!

Ответы [ 3 ]

7 голосов
/ 06 февраля 2009

Звучит так, будто вы должны сделать GetEmployees () статическим методом для Employee. Вам не нужно создавать экземпляр сотрудника, чтобы получить их список.

Кроме того, ваш первый пример будет только устанавливать ваш objEmployee на то, что будет последним в ваших данных. Когда он проходит по всем сотрудникам, он останавливается, когда достигает последнего, то есть данных, которые вы получите.

Кроме того, класс "Сотрудники" относится к одному сотруднику или ко многим? Назовите это соответственно. Если «Employees» представляет одного «Employee», то, возможно, вам следует переименовать его в «Employee» и вернуть List из метода GetEmployees, который, как я говорил выше, должен быть статическим, поэтому вы можете просто вызвать что-то вроде «Employee». GetEmployees ()».

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

Возможно, вы захотите создать интерфейс доступа к данным, который принимает параметры для поиска сотрудников и возвращает фактические объекты сотрудников в качестве результата. После того, как вы это сделаете, вы захотите создать реализацию этого уровня доступа к данным, которую затем будете использовать для генерации реальных экземпляров. Преимущество этого состоит в том, что вы можете быстро изменить реализацию уровня доступа к данным, не изменяя также и бизнес-объекты. Тогда вы запрограммируете свои бизнес-объекты вне интерфейса, и вы сможете использовать динамическую загрузку сборки или какой-либо другой метод для динамического определения реализации вашего доступа к данным.

5 голосов
/ 06 февраля 2009

Обе вещи являются методами (также известными как функции). Разница в том, что первый «возвращает по ссылке», а второй «возвращает ссылку».

Нет преимущества в возврате по ссылке в C #, потому что в более простом, естественном случае, когда вы просто возвращаете ссылку, копирование не выполняется (в отличие от C ++).

Возврат ссылки, таким образом, всегда предпочтительнее, так как он самый простой, и он обеспечивает большую синтаксическую гибкость на сайте вызова (например, вложенные выражения: manager.Fire (GetEmployee ()) без необходимости отдельного оператора ).

0 голосов
/ 06 февраля 2009
public void GetEmployees(objEmployee)
{
  //the function I am calling returns a dataTable of all the employees in the db.
  dim dt as DataTable = dbEmployees.GetEmployees(); 

   foreach(DataRow drow in dt.rows) 
     {
        objEmployee.Name = drow["Name"].ToString();
        objEmployee.ID = drow["ID"].ToString();
     }
}

При первом подходе, что бы вы сделали, если бы не было Сотрудников? Вы создали объект Employe и передали метод для его заполнения, а затем хотите проверить, есть ли сотрудники. Но когда вы хотите проверить, никогда не будет нулевого значения, потому что вы послали созданный объект. Я думаю, что второй лучше и более понятен.

Employees employee = new Employees();

 employee.GetEmployees(employee);

 if(employee==null)//but employee is not null??
     DoSomething();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...