Интервью на тему дизайна класса - PullRequest
6 голосов
/ 28 марта 2011

Недавно я присутствовал на собеседовании. Этот вопрос был задан.

Это сценарий.

У нас есть два типа сотрудников. Штатный и контрактный работник. Обычные сотрудники будут получать оплату в установленном порядке в конце месяца. Работникам по контракту будет выплачиваться еженедельно в зависимости от количества отработанных часов.

Менеджеры будут назначены для этих сотрудников для контроля. У менеджера могут быть штатные и контрактные сотрудники.

Это приложение будет рассчитывать заработную плату для этих сотрудников.

Они попросили меня придумать дизайн класса для этой ситуации.

Какой ответ ожидает от меня интервьюер? Указатели в этом направлении будут высоко оценены.

Ответы [ 5 ]

6 голосов
/ 28 марта 2011

Они проверяют, что вы понимаете некоторые основные принципы хорошего ОО дизайна.В частности, они, похоже, ищут:

  1. Понимание полиморфизма (используя функциональность каждого сотрудника на абстрактном базовом уровне)
  2. Понимание специализации (расширяя функциональностьбазовый класс Employee для получения различного поведения)
3 голосов
/ 28 марта 2011

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

public class Employee
{
    public bool IsContractEmployee
    {
       get;
       set;
    }
}

public class WageCalculator
{

    private abstract class WageCalculAlgorithm
    { 
        public virtual decimal Calculate( Employee emp )
        {
             // regular calc goes here
        }
    }

    private class ContractorCalculator : WageCalculAgorithm
    {
        public override decimal Calculate( Employee emp )
        {
            // contractor calc goes here
        }
    }

    public static decimal CalculateWageFor( Employee emp )
    {
       if( emp.IsContractEmployee )
            return new ContractorCalculator().Calculate(emp);
       else
            return new WageCalculAlgorithm().Calculate(emp);
    }
}
2 голосов
/ 28 марта 2011

следующий может быть одним из дизайна

дизайн 1.

public class Employee
{
   public bool isContractEmployee
      { get; set;}

   public abstract float CalCulatePayroll();   
}


public class FullTimeEmp : Employee
{
   public override float CalCulatePayroll()
   {
   }
}

public class ContractEmp : Employee
{
  public int NoofHR
      {get; set;}

  public override float CalCulatePayroll()
   {
       sal = nohr*money;
   }
}

дизайн 2.

public class employee
{
  public bool isContractEmployee
  { get; set;}

  public int NoofHR
  {get; set;}


  public  float CalCulatePayroll()
  {
    if(this.isContractEmployee)
    {
      //calculate sal on based hr
    }
    else
    {
      //calculate regurlare sal
    }
  }
}
0 голосов
/ 06 февраля 2017

Я бы пошел по этому пути:

public class Employee
{        
     public abstract int CalculateSalary();
}



public class RegularEmployee : Employee
{
    public int NumOfWeeklyHours { get; set; }
    public int CalculateSalary()
    {
            // TODO: Implement
    }
}

public class ContractEmployee : Employee
{
    public int FixedBasis { get; set; }

    public override int CalculateSalary()
    {
        // TODO: Implement
    }
}

public class Manager
{
    public List<Employee> InChargeOf { get; set; }
}

public class PayRoll
{
    public int CalculateSalaries(List<Employee> le)
    {
         return le.Sum(e => e.CalculateSalary());
    }
}
0 голосов
/ 28 марта 2011

Интервьюер, вероятно, ожидал, что вы сделаете все возможное, чтобы найти решение, которое, по вашему мнению, решило проблему.

Он также ожидал, что вы объясните некоторые из решений, которые вы приняли, придумываяваше решение.

Наконец-то вы ожидали, что вы придумали решение самостоятельно, а не запрашивали его на интернет-форуме.

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

...