Continuiamo con lo smell: Duplicated Code
Problema:
Abbiamo 2 o più metodi che eseguono lo stesso codice anche se con una sequenza logica diversa.
Un esempio di logica errata:
Code Snippet
- class Employee
- {
- public int EmpID { get; set; }
- public string EmpName { get; set; }
- public string Salary { get; set; }
- public Employee(int empID, string empName, string sal)
- {
- this.EmpID = empID;
- this.EmpName = empName;
- this.Salary = sal;
- }
- public string Display()
- {
- string s;
- s = "$" + Salary;
- //Display all Employees Details.
- s += "Employee ID: " + EmpID;
- s += "Employee Name: " + EmpName;
- s += "Employee Salary: " + Salary;
- s += "-------------------";
- return s;
- }
- }
- class Department
- {
- public int DeptID { get; set; }
- public string DeptName { get; set; }
- public string Location { get; set; }
- public Department(int deptID, string deptName, string loc)
- {
- this.DeptID = deptID;
- this.DeptName = deptName;
- this.Location = loc;
- }
- public string Display()
- {
- if (Location == "BLORE")
- {
- Location = "BANGALORE";
- }
- else if (Location == "HYD")
- {
- Location = "HYDERABAD";
- }
- else
- {
- Location = "DELHI";
- }
- //Display all Departments Details.
-
- string s = "Department ID: " + DeptID;
- s += "Department Name: " + DeptName;
- s += "Department Location: " + Location;
- s += "-------------------";
- return s;
- }
- \
Motivazione:
Il polimorfismo viene in aiuto per eliminare il codice duplicato. Quando abbiamo due subclasses con lo stesso metodo portiamo tutto nella classe base e abbiamo risolto.
Ma quando i due metodo non sono esattamente gli stessi, cosa possiamo fare?
Soluzione:
Code Snippet
- abstract class AbstractDAO
- {
- public abstract void LoadDetails();
- public abstract void FormatAndDisplayDetails();
- public virtual void StartUp()
- {
- Console.WriteLine("Start of Processing");
- Console.WriteLine("-------------------");
- }
- public virtual void Dispose()
- {
- Console.WriteLine("End of Processing");
- }
- public void Display()
- {
- StartUp();
- LoadDetails();
- FormatAndDisplayDetails();
- Dispose();
- }
- }
- class Employees : AbstractDAO
- {
- private List<Employee> empList = new List<Employee>();
- public override void LoadDetails()
- {
- //Get Data From Database.
- empList.Add(new Employee(10, "TEST", "2000"));
- empList.Add(new Employee(20, "TEST1", "3000"));
- empList.Add(new Employee(30, "TEST2", "4000"));
- }
- public override void FormatAndDisplayDetails()
- {
- //Add $ to Salary
- foreach (Employee emp in empList)
- {
- emp.Salary = "$" + emp.Salary;
- //Display all Employees Details.
- Console.WriteLine("Employee ID: " + emp.EmpID);
- Console.WriteLine("Employee Name: " + emp.EmpName);
- Console.WriteLine("Employee Salary: " + emp.Salary);
- Console.WriteLine("-------------------");
- }
- }
- }
- class Departments : AbstractDAO
- {
- private List<Department> deptList = new List<Department>();
- public override void LoadDetails()
- {
- //Get Data From Database.
- deptList.Add(new Department(1000, "HRA", "BLORE"));
- deptList.Add(new Department(2000, "FIN", "HYD"));
- deptList.Add(new Department(3000, "MARKETING", "DEL"));
- }
- public override void FormatAndDisplayDetails()
- {
- //Expand Location.
- foreach (Department dept in deptList)
- {
- if (dept.Location == "BLORE")
- {
- dept.Location = "BANGALORE";
- }
- else if (dept.Location == "HYD")
- {
- dept.Location = "HYDERABAD";
- }
- else
- {
- dept.Location = "DELHI";
- }
- //Display all Departments Details.
- Console.WriteLine("Department ID: " + dept.DeptID);
- Console.WriteLine("Department Name: " + dept.DeptName);
- Console.WriteLine("Department Location: " + dept.Location);
- Console.WriteLine("-------------------");
- }
- }
- \
Benefici e non + Rimuove il codice duplicato. + Nasconde come si comporta l’algoritmo a seconda dell’oggetto. + Permette alle sottoclassi di customizzare l’algoritmo. - Complica il design. |
E non prendete come scusa: “il mio sistema ormai è troppo evoluto per poterne apportare queste migliorie. E’ troppo tardi.”
Se fosse realmente così non esisterebbe il Refactoring :)