今天去奥博的天(objectival)面试遇到了这样的 一道的机试题
题干大致如下:
有关税率的问题: 一般的商品要交的消费税,单除了 医药,书籍,食品之外 不交税,他的税率是10%, 还有的就是 进口税 ,进口税 税率是5%, .
测试用例通过xml来存放数据,
要求 本面试题完全使用了面向对象的方式来实现。 来计算商品的税收,并且商品税收是进行舍入0.05的操作,如13.14舍入是13.15, 60.00舍入是60.00,
13.151舍入是13.20 并且要求增加更多的税收以后或者 消费税增加更多的免税商品品种以后, 要求改更少的的源代码,最好只通过 配置文件。
基本的源代码:
我们 需要 税率的 基类
/// <summary> /// 基本的税率的基类 任何税率继承 此类 /// </summary>
public abstract class baseTaxes
{ public decimal Rate;
public baseTaxes(decimal Rate)
{ this.Rate = Rate; }
}
//进行舍入的0,05 操作
/// <summary>
/// 计算的帮助类 任何税类计算都 进行 舍入的0.05 操作
/// </summary>
public static class CalcHelper
{
public static decimal Calc(decimal value)
{
return Math.Ceiling(value/0.05m)*0.05m;
}
}
进口关税继承与他
/// <summary>
/// 进口的关税
/// </summary>
public class importedTaxes:baseTaxes
{
public importedTaxes(decimal Rate):base(Rate)
{
}
}
由于不会直接操作xml文件
/// <summary>
/// 进行xml文件路径的拼接
/// </summary>
public class StringHelper
{
public static readonly string strTaxes = "Test";
public static List<string> TList()
{
return new List<string> { "case1.xml", "case2.xml", "case3.xml", "case4.xml" };
}
}
此消费税也是继承与基本税的借口
///消费税
public class Taxes:baseTaxes
{
public Taxes(decimal Rate):base(Rate)
{
}
}
/// <summary>
/// 消费税的那些的种类 由于会自动增加免消费税的种类 所以写了这个 类自动的添加
/// </summary>
public class TaxesCategory
{
public static List<string> GetCategory()
{
return new List<string> {"food", "medical", "book"};
}
}
//计算 总额和税收的结果的类
/// <summary> /// 计算 总额和税收的结果的类 /// </summary> public class MyResult { public decimal Total { get; set; }
public decimal Taxes { get; set; } }
///通过税收工厂产生不同的税收
public class taxesFactory { private static baseTaxes _baseTaxes = null; public static baseTaxes CreateTaxes(taxesType type) { switch (type) { case taxesType.based:_baseTaxes=new Taxes(0.1m);break; case taxesType.imported:_baseTaxes=new importedTaxes(0.05m);break; } return _baseTaxes; }
}
//进行xml文件操作与正规的测试用例
static void Test()
{
MyResult result = null;
try
{
List<string> strs = StringHelper.TList();
foreach (string str in strs)
{
string newstring =Path.Combine(StringHelper.strTaxes,str) ;
XmlDocument xmlDocument=new XmlDocument();
xmlDocument.Load(@"C:\Users\admin\Documents\Visual Studio 2010\Projects\Objectival.Interview.Test\Objectival.Interview.Test\"+newstring);
XmlNode xmlNode = xmlDocument.SelectSingleNode("TestCase");
XmlNode xmlTopNode = xmlNode.SelectSingleNode("Name");
Console.WriteLine(xmlNode.Value);
XmlNode xmlsecondNode = xmlNode.SelectSingleNode("Items");
foreach (XmlNode childNode in xmlsecondNode.SelectNodes("Item"))
{
Console.WriteLine("Name:" + childNode.Attributes["Name"].Value.ToString() + ",Count:" + childNode.Attributes["Count"].Value + ",Unit:" + childNode.Attributes["Unit"].Value.ToString() + ",Type:" + childNode.Attributes["Type"].Value.ToString() + ",IsImported:" + childNode.Attributes["IsImported"].Value.ToString());
}
result = NewResult(xmlDocument);
XmlNode xmlThirdNode = xmlNode.SelectSingleNode("Result");
decimal tax = Convert.ToDecimal(xmlThirdNode.Attributes["tax"].Value);
decimal total = Convert.ToDecimal(xmlThirdNode.Attributes["total"].Value);
bool isTaxPassed = result.Taxes == tax;
bool isTotal = result.Total == total;
}
Console.WriteLine();
}
catch (Exception)
{
Console.WriteLine("this is a exception");
}
}
总结 项目经理说着不是真的面向对象,当增加一个类以后怎么办啊,我郁闷啊,你自己加一个类 继承与 基类 当 操作的时候,你在后面增加源代码。 这不是达到了修改关闭,增加开放面向对象的高级的原则吗