Clean Code – Function Part II

Kondisi

Sebuah fungsi bisa jadi memiliki banyak pengecekan kondisi di dalamnya. Kita bisa memastikan bahwa tiap kondisi dilakukan pada low-level class yaitu dengan menggunakan polymorphisme dan inheritance.

public abstract class Employee
        {
            public double BasicSalary;
            public abstract double CalculatePayment();
        }

Dari potongan kode program di atas, semakin banyak tipe customer dan semakin kompleks kalkulasi payment tiap tipe customer, akan semakin panjang kode program pada fungsi CalculatePay() sehingga melanggar prinsip bahwa sebuah fungsi haruslah kecil. Mari kita refactor menjadi beberapa implementasi pada low-level class seperti ini.

Kita bisa menggunakan interface ataupun class abstract. Selanjutnya kita buat 2 konkrit class yaitu class Sales dan Manager, masing-masing mengimplementasikan operasi CalculatePay() secara berbeda.

public class Sales : Employee
       {
           private const double COMMISION_PERCENTAGE = 0.2;

           public override double CalculatePayment()
           {
               return BasicSalary + (COMMISION_PERCENTAGE * BasicSalary);
           }
       }

       public class Manager : Employee
       {

           private const double BONUS_PERCENTAGE = 0.5;

           public override double CalculatePayment()
           {
               return BasicSalary + (BONUS_PERCENTAGE * BasicSalary);
           }
       }

Untuk menentukan class mana yang sesuai, kita bisa menggunakan Factory Pattern. Melalui Factory Pattern sebuah kelas mendelagasikan tanggung jawab pembuatan objectnya.

public class EmployeeFactory
        {
            public Employee MakeEmployee(EmployeeType employeeType)
            {
                switch (employeeType)
                {
                    case EmployeeType.Sales:
                        return new Sales();
                    case EmployeeType.Manager:
                        return new Manager();
                    default:
                        throw new Exception("Incorrect Employee");
                }
            }
        }

Bentuk akhir dari class PayrollService jadinya seperti ini.

public class PayrollService
        {
            private Employee _employee;
            public PayrollService(EmployeeType employeeType)
            {
                _employee = new EmployeeFactory().MakeEmployee(employeeType);
            }
            public double GetEmployeeSalary(double basicSalary)
            {
                _employee.BasicSalary = basicSalary;
                return _employee.CalculatePayment();
            }
        }

 

 

Tinggalkan komentar