Я пытаюсь закрепить некоторые вопросы интервью, поэтому я посмотрел на простой.
Разработка факториальной функции.
Эта функция - лист(нет зависимостей - легко тестируемый), поэтому я сделал его статическим внутри класса помощника.
public static class MathHelper
{
public static int Factorial(int n)
{
Debug.Assert(n >= 0);
if (n < 0)
{
throw new ArgumentException("n cannot be lower that 0");
}
Debug.Assert(n <= 12);
if (n > 12)
{
throw new OverflowException("Overflow occurs above 12 factorial");
}
int factorialOfN = 1;
for (int i = 1; i <= n; ++i)
{
//checked
//{
factorialOfN *= i;
//}
}
return factorialOfN;
}
}
Тестирование:
[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void Overflow()
{
int temp = FactorialHelper.MathHelper.Factorial(40);
}
[TestMethod]
public void ZeroTest()
{
int factorialOfZero = FactorialHelper.MathHelper.Factorial(0);
Assert.AreEqual(1, factorialOfZero);
}
[TestMethod]
public void FactorialOf5()
{
int factOf5 = FactorialHelper.MathHelper.Factorial(5);
Assert.AreEqual(5*4*3*2*1,factOf5);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void NegativeTest()
{
int factOfMinus5 = FactorialHelper.MathHelper.Factorial(-5);
}
У меня есть несколько вопросов:
- Это правильно?(Я надеюсь на это;))
- Выдает ли правильные исключения?
- Должен ли я использовать флажок контекст или этот трюк (n> 12) в порядке?
- Лучше ли использовать uint вместо проверки на отрицательные значения?
- Будущее улучшение: перегрузка для длинных, десятичных, BigInteger или, возможно, универсального метода?
Спасибовы