Информация об изменениях

Сообщение Re: Искусство программирования от 24.01.2017 10:42

Изменено 24.01.2017 10:44 Sinix

Re: Искусство программирования
Здравствуйте, Basil B, Вы писали:

BB>Что мы (т.е. я ) видим? Вариант на Хаскелле — это то, что приходит на ум первым, т.е. банальность. Решение на перле — самое короткое, но при этом запутанное, неряшливое — все принесено в жертву краткости. А вот вариант на пиколиспе — ясный, элегантный, небанальный — можно сказать, красивый. Заключительная программа приведена для контраста.


На самом деле мы видим код, который не пригоден к использованию. Всё остальное вторично.
Как только дело доходит до реальных задач, сценарий внезапно™ оказывается сложнее чем "вывести в консоль".

Скажем, FizzBuzz используется не только при выводе, да ещё и данные не факт что всегда корректными будут.
Вот тут и начинается искусство. Ну, или FizzBuzzEnterpriseEdition, тут уж как пойдёт

Так вот, как насчёт чуть усложнить задачу?
  Скрытый текст
    public static class FBApp
    {
        [NotNull]
        private static string ToFizzBuzz(this int value)
        {
            Code.InRange(value, nameof(value), 0, int.MaxValue);

            string result;
            if (value % 15 == 0)
                result = "FizzBuzz";
            else if (value % 3 == 0)
                result = "Fizz";
            else if (value % 5 == 0)
                result = "Buzz";
            else
                result = value.ToString();

            return result;
        }

        public static void Main()
        {
            foreach (var value in Enumerable.Range(1, 100))
            {
                Console.WriteLine(value.ToFizzBuzz());
            }
            Console.WriteLine("Done.");
            Console.ReadKey();
        }

        [TestCase(0, "FizzBuzz")]
        [TestCase(122, "122")]
        [TestCase(123, "Fizz")]
        [TestCase(125, "Buzz")]
        [TestCase(int.MaxValue, "2147483647")]
        public static void Proofs(int value, string expected) => 
            Assert.AreEqual(value.ToFizzBuzz(), expected);

        [TestCase(int.MinValue, false)]
        [TestCase(-1, false)]
        [TestCase(0, true)]
        [TestCase(1, true)]
        [TestCase(int.MaxValue, true)]
        public static void ProofsBadInput(int value, bool ok)
        {
            if (ok)
                Assert.DoesNotThrow(()=>value.ToFizzBuzz());
            else
                Assert.Throws<ArgumentOutOfRangeException>(() => value.ToFizzBuzz());
        }
    }

Что-то мне подсказывает, что где-то к этому моменту критерии "красивости" немножко поменяется

UPD Хороший аргумент про "проблема в руках, а не в языке": 1000 и 1 способ doing it wrong
Re: Искусство программирования
Здравствуйте, Basil B, Вы писали:

BB>Что мы (т.е. я ) видим? Вариант на Хаскелле — это то, что приходит на ум первым, т.е. банальность. Решение на перле — самое короткое, но при этом запутанное, неряшливое — все принесено в жертву краткости. А вот вариант на пиколиспе — ясный, элегантный, небанальный — можно сказать, красивый. Заключительная программа приведена для контраста.


На самом деле мы видим код, который не пригоден к использованию. Всё остальное вторично.
Как только дело доходит до реальных задач, сценарий внезапно™ оказывается сложнее чем "вывести в консоль".

Скажем, FizzBuzz используется не только при выводе, да ещё и данные не факт что всегда корректными будут.
Вот тут и начинается искусство. Ну, или FizzBuzzEnterpriseEdition, тут уж как пойдёт

Так вот, как насчёт чуть усложнить задачу?
  Скрытый текст
    public static class FBApp
    {
        [NotNull]
        private static string ToFizzBuzz(this int value)
        {
            Code.InRange(value, nameof(value), 0, int.MaxValue);

            string result;
            if (value % 15 == 0)
                result = "FizzBuzz";
            else if (value % 3 == 0)
                result = "Fizz";
            else if (value % 5 == 0)
                result = "Buzz";
            else
                result = value.ToString();

            return result;
        }

        public static void Main()
        {
            foreach (var value in Enumerable.Range(1, 100))
            {
                Console.WriteLine(value.ToFizzBuzz());
            }
            Console.WriteLine("Done.");
            Console.ReadKey();
        }

        [TestCase(0, "FizzBuzz")]
        [TestCase(122, "122")]
        [TestCase(123, "Fizz")]
        [TestCase(125, "Buzz")]
        [TestCase(int.MaxValue, "2147483647")]
        public static void Proofs(int value, string expected) => 
            Assert.AreEqual(value.ToFizzBuzz(), expected);

        [TestCase(int.MinValue, false)]
        [TestCase(-1, false)]
        [TestCase(0, true)]
        [TestCase(1, true)]
        [TestCase(int.MaxValue, true)]
        public static void ProofsBadInput(int value, bool ok)
        {
            if (ok)
                Assert.DoesNotThrow(()=>value.ToFizzBuzz());
            else
                Assert.Throws<ArgumentOutOfRangeException>(() => value.ToFizzBuzz());
        }
    }

Что-то мне подсказывает, что где-то к этому моменту критерии "красивости" немножко поменяются

UPD Хороший аргумент про "проблема в руках, а не в языке": 1000 и 1 способ doing it wrong