Зависимость между несколькими классами - PullRequest
0 голосов
/ 01 апреля 2010

Я путаюсь между лучшим способом организовать зависимость между несколькими классами
Предположим, у меня есть следующие классы Работник, Оплата труда, DataAccess

Должен ли я пойти на: Option1

Employee emp = new Employee();
Salary sal = new Salary();
DataAccess data = new DataAccess();

sal.Calculate(emp);
data.Save(emp);

или Option2

Employee emp = new Employee();
Salary sal = new Salary();

sal.Calculate(emp); //once salary has been calculated salary object will initialize  data access class to do the actual saving.

или вариант 3

Employee emp = new Employee();
emp.Calculate(); // employee object will encapsulate both the salary and data access object

Ответы [ 5 ]

1 голос
/ 01 апреля 2010

Обычно зарплата сотрудника HAS-A. Так что я бы пошел с чем-то вроде:

Employee emp = new Employee();
emp.Salary = new Salary();

Вы можете создать общий класс, который будет извлекать из него все бизнес-правила расчета зарплаты (из источника данных) и рассчитывать зарплату для сотрудников на основе атрибутов сотрудника.

SalaryCalculator.CalculateSalary(emp); //I'd agree with Silky
DataAccess.Save(emp); //This shall save changes in emp as well as in salary.

- EDIT -

Это ответ на ваш комментарий.

Ваш объект hrms (если имеется) должен затем инкапсулировать Employee и предоставить параметр CalculateSalary.

Как насчет чего-то вроде:

yourHrms.Employees.Add(new Employee(Age, Name, DateOfBirth, EmployedSince, TotalExperience, IsManager, new Salary(someStartPointForSalaryIfAny));

Здесь ваш класс Salary наследуется от вашего абстрактного класса BaseSalary, который будет содержать бизнес-правила и будет выполнять ионы Calculate(). Поэтому new Salary(someStartPointForSalaryIfAny) будет выполнять вычисления внутри.

Для сохранения вашего объекта вы можете иметь:

yourHrms.Employees.Save();//Saves all employees.
yourHrms.Employees[0].Save();//Save this.
1 голос
/ 01 апреля 2010

Мне кажется, что «CalculateSalary» должно быть чем-то, что происходит как часть какого-то другого объекта, и ему предоставляется различная информация о сотруднике. Какой-то объект 'SalaryCalculator', возможно ... Что-то вроде:

employee.Salary = SalaryCalculator.CalculateFor(employee); 

о том, как происходит сохранение; Я бы оставил это на усмотрение ORM, которым вы пользуетесь лично.

0 голосов
/ 01 апреля 2010

Вы можете реализовать шаблон ActiveRecord для Сотрудника, чтобы он выглядел следующим образом:

Employee emp = new Employee();
emp.Salary = SalaryManager.CalculateSalary(emp);
emp.Save(); //Save to some IDataStore logic.
0 голосов
/ 01 апреля 2010

Согласен с Зависит ответ.

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

Тем не менее, вы можете поместить DataAcccess в ваши объекты (если логика выглядит просто) и использовать их как своего рода Proxy между другими службами и сохраняемой версией, но не забудьте введите DataAccess в ваши объекты в качестве интерфейса (в установщике или конструкторе), чтобы иметь возможность легко тестировать или изменять.

0 голосов
/ 01 апреля 2010

Краткий ответ: " Это зависит ".

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

Однако настойчивость - это особый случай. Постоянство - это «услуга»; Вы говорите кому-нибудь записать это на диск для последующего поиска. Нет состояния ни одного объекта, к которому осуществляется доступ. Поэтому создайте службу без сохранения состояния, которая принимает входные данные, которые должны быть сериализованы / десериализованы

DAO_Service.Save(anEmployee);
DAO_Service.Save(preferences);
DAO_Service.Save(taxRecord);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...