Quando un oggetto appartiene veramente a una classe? Ho familiarità con la relazione "ha-a", ma nel caso di un oggetto Employee, ha "un-un" 401k, ma non è realmente composto da un oggetto 401k. Come dipendente, il mio 401k non mi rende quello che sono.
Quello che sto ottenendo è che non dovrei aver bisogno di raggiungere l'oggetto Impiegato per arrivare al suo 401k. L'aderenza a questo sarebbe considerata l'aderenza alla Legge di Demetra (ad esempio A (). B (). C (). D ()), che vorrei seguire.
Inoltre, un oggetto Employee ha molti attributi come EmployeeID, age, dateOfBirth, ecc. Potresti finire con attributi infiniti solo per un Dipendente, che ricade tutti sotto la stessa responsabilità.
Nel caso di un 401K, non gestisce lo stesso 401k, quindi il Dipendente aderisce ancora al Principio di Responsabilità Unica, ma ne ha "uno". Hai solo bisogno di raggiungere attraverso l'oggetto Impiegato per ottenere il suo 401k. Perfino un Supervisore non compone davvero un Dipendente. Simile a 401k, forse EmployeeRepository dovrebbe avere un metodo FindSupervisor (Employee employee).
È qui che un repository & il servizio arriva?
class Employee
{
public Employee(401k 401k) {...}
public 401K Get401K()
{
return 401k; // EWW! No, does not follow LoD
}
public Money Calculate401k()
{
return 401k.calculate(); // Ugly and breaks SRP? No Employee should calculate 401k just to follow LoD...
}
private 401K 401k;
}
class 401K
{
public void MakeContribution(IContribution contribution)
{
//add contribution
}
public Money Calculate(ICalculator calculator)
{
//calculate & return money object
}
}
VS
class Employee
{
public int Age() {//calculate age with dob...}
// Other employee-specific methods
private string name;
private DateTime dob;
// other employee-specific attributes
}
class 401kRespository
{
public 401K FindByEmployee(Employee emp) {// return 401k of Employee);
// More 401KRepo functions...
}
class 401K
{
public void MakeContribution(IContribution contribution) {//add contribution}
public Money Calculate(ICalculator calculator) {//calculate}
}