109: (Default)
[personal profile] 109
ах да, я ж тут эту задачку типа решил. напомню, кто не знает: требуется написать функцию, принимающую аргумент типа int, которая, будучи дважды приложена, меняет знак числа.

static class I_Function
{
	static void Main()
	{
		Console.WriteLine("F(F(42)) = {0}", F(F(42)));
		Console.WriteLine("F(F(-5)) = {0}", F(F(-5)));
		Console.ReadKey();
	}

	static object F(object num)
	{
		if (num is Helper)
			return -((Helper)num).num;
		else if (num is int)
		{
			if ((int)num == int.MinValue)
				throw new Exception("Unsupported argument value");
			else
				return new Helper((int)num);
		}
		else throw new Exception("Unsupported argument type");
	}

	class Helper { internal int num; internal Helper(int num) { this.num = num; } }
}


претензий по поводу MinValue не предлагать: ряд функций, принимающих int, бросают на него. в частности, все функции, которым зачем-то надо делать Abs().

претензии по поводу возврата boxed int вместо ожидаемого unboxed более интересны. напомню, что это задачка для интервью. формальная отмазка могла бы звучать как "требование unboxed int не было озвучено в явном виде" :)

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

(no subject)

Date: 2008-02-26 11:49 pm (UTC)
From: [identity profile] 109.livejournal.com
и потом, где же твой знаменитый тест-драйвнутый подход? попробуй написать тест, который этот код не пройдёт.

Profile

109: (Default)
109

March 2019

S M T W T F S
     12
3456789
101112131415 16
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags