最近我参加了一次采访。有人质问这个问题。
这就是情景。
我们有两种类型的员工。定期和合同员工。 普通员工将在月底按固定基金支付。 合同员工将根据他们工作的小时数每周支付一次。
管理人员将被分配到这些员工进行监督。 经理可以在他下面有常规和合同雇员。
此应用程序将计算这些员工的工资单。
他们让我为这种情况提出课堂设计。
面试官对我的期待是什么? 这方面的指针将受到高度赞赏。
答案 0 :(得分:6)
他们正在测试您是否了解优秀OO设计的一些基本原则。具体来说,他们似乎在寻找:
答案 1 :(得分:3)
如果您了解关注点的分离(计算员工的工资不是员工本身的责任),并且看看您是否理解抽象性和多态性,那么这个问题会对您进行测试:是(目前)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 :(得分:2)
以下可能是设计之一
设计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
}
}
}
答案 3 :(得分:0)
面试官可能希望你尽力提出一个你认为能解决问题的解决方案。
他也希望您在提出解决方案时解释一些您做出的决定。
最后期望你自己想出解决方案而不是在互联网论坛上提出解决方案。
很难从技术上说出他的预期,因为我们不知道你的目标是什么。如果你是第一个开发人员的工作,他可能没想到你会得到正确的答案,但只是想看看你解决问题的方法是什么样的。
答案 4 :(得分:0)
我会这样:
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());
}
}