eugenebo: (Default)
[personal profile] eugenebo
Языки программирования, как известно, пользуются лишь двумя наклонениями глаголов: условным и повелительным. В этих рамках довольно трудно выразить мысли, относящиеся к реальной жизни; но разве нас такими трудностями остановишь?

Вот как могла бы выглядеть знаменитая басня Крылова, если бы он был программистом и писал на C#. Нижеприведённый код не только компилируется, но даже исполняется. Правда, ничего осмысленного, конечно, не делает, поэтому все претензии будут закрыты как Won't Fix :)


using System;
using System.Collections;
using System.Threading;

public class Басня
{
      /*
      Описание кода:

      Вороне как-то бог послал кусочек сыру;
                        На ель Ворона взгромоздясь,
      Позавтракать было совсем уж собралась,
            Да призадумалась, а сыр во рту держала.
            На ту беду Лиса близехонько бежала;
            Вдруг сырный дух Лису остановил:

      ...

      Ворона каркнула во все воронье горло:
      Сыр выпал - с ним была плутовка такова.
      */

      public static int Main()
      {
            // Правила C#, как и пьес, требуют объявления действующих лиц до начала действия:
            ворона Ворона = new ворона();
            лиса Лиса = new лиса();
            Ель ель = Лес.СлучайнаяЁлка();
            DateTime Както = new DateTime((new Random(((int) DateTime.Now.Ticks))).Next());
            
            // Акт 1
            Бог.послать(Ворона, Както, сыр.кусочек);
            Ворона.Переместиться(ель, СпособыПеремещения.взгромоздясь, true);
            Ворона.ПоготовитьсяКЗавтраку();
            Ворона.ВзятьЖратвуВКлюв();
            Thread ДелаВороны = new Thread(new ThreadStart(Ворона.Призадуматься));
            ДелаВороны.Start();

            Лиса.Переместиться(ель, СпособыПеремещения.бежать, false);
            Ворона.ЧтоЯДержуВоРту.Пахнуть();
            if (false == (Лиса.УчуятьЕду())) return Const.РаннийКонецБасни;
            else Лиса.Стоять();

            // Устал. Акт 2 и последний -- конец басни:
            ДелаВороны.Join();
            Ворона.Каркать(Громкость.ВоВсёГорло);
            Лиса.Забрать(Земля.ЧтоВаляется);
            Лиса.Переместиться(Лес.КудаТо, СпособыПеремещения.бежать, true);

            return Const.КонецБасни;
      }
}

public static class Бог
{
      public static void послать(Животное кому, DateTime когда, Object что)
      {
            кому.Забрать(что);
      }
}

public class Const
{
      public static int Дофига = (Int16.MaxValue - 1);

      public static int КонецБасни = 0x0;
      public static int РаннийКонецБасни = 0x3;
}

public enum СпособыПеремещения
{
      взгромоздясь = 0x1,
      бежать = 0x2
}

public enum Громкость
{
      неслышно = 0x1,
      тихо = 0x2,
      громко = 0x3,
      ВоВсёГорло = 0x4
}

public class Лес
{
      private static Ель[] ЁлкиЛесные = new Ель[Const.Дофига];

      public static Ель СлучайнаяЁлка()
      {
            return ЁлкиЛесные[(new Random(((int) DateTime.Now.Ticks))).Next(0, ЁлкиЛесные.Length - 1)];
      }

      public static Object КудаТо
      {
            get
            {
                  return new Object();
            }
      }
}

public static class Воздух
{
      public static ArrayList Запахи = new ArrayList();
}

public static class Земля
{
      public static ArrayList ЧтоВаляется = new ArrayList();
}


public class Животное
{
      protected ArrayList МоиВещи = new ArrayList();
      private Object ГдеЯ = null;
      private bool СейчасПеремещаюсь;

      public void Забрать(Object что)
      {
            МоиВещи.Add(что);
      }

      public void Переместиться(Object куда, СпособыПеремещения как, bool ЗавершитьПеремещениеСейчас)
      {
            ГдеЯ = куда;
            СейчасПеремещаюсь = (!ЗавершитьПеремещениеСейчас);
      }

      public void Стоять()
      {
            СейчасПеремещаюсь = false;
      }
}

public class ворона: Животное
{
      private Еда ЧегоПожрать = null;
      public Еда ЧтоЯДержуВоРту;

      public bool ПоготовитьсяКЗавтраку()
      {
            foreach(Object вещь in МоиВещи)
            {
                  ЧегоПожрать = вещь as Еда;
                  if (null != ЧегоПожрать) return true;
            }
            return false;
      }

      public void ВзятьЖратвуВКлюв()
      {
            ЧтоЯДержуВоРту = ЧегоПожрать;
      }

      public void Призадуматься()
      {
            // Поскольку мозгов у вороны нет, думать она не может. Просто спим 3 секунды:
            Thread.Sleep(3000);
      }

      public void Каркать(Громкость гр)
      {
            switch (гр)
            {
                  case Громкость.неслышно:
                        break;
                  case Громкость.тихо:
                        Console.WriteLine("кррр");
                        break;
                  case Громкость.громко:
                        Console.WriteLine("Кар!");
                        break;
                  case Громкость.ВоВсёГорло:
                        Console.WriteLine("КАРРРРР!!!");
                        break;
                  default: throw new Exception("Да ты, баснописец, гонишь!");
            }
            // Тут очевиден race condition; пусть Крылов чинит.
            МоиВещи.Remove(ЧтоЯДержуВоРту);
            Земля.ЧтоВаляется.Add(ЧтоЯДержуВоРту);
            ЧтоЯДержуВоРту = null;
            ЧегоПожрать = null;
      }
}

public class лиса: Животное
{
      public bool УчуятьЕду()
      {
            foreach (Object o in Воздух.Запахи)
            {
                  if (null != (o as Еда)) return true;
            }
            return false;
      }
}

public class Ель
{
}

public class Еда
{
      public void Пахнуть()
      {
            Воздух.Запахи.Add(this);
      }
}

public class сыр: Еда
{
      public static сыр кусочек
      {
            get
            {
                  return new сыр();
            }
      }
}

Date: 2006-03-10 08:14 pm (UTC)
From: [identity profile] speshuric.livejournal.com
1. Поубивай nbsp
2. Для кода лучше всего использовать тег pre

Date: 2006-03-10 08:34 pm (UTC)
From: [identity profile] speshuric.livejournal.com
Однако...
Дополнения (такие же несерьёзные, как и сама тема):
1. "Сыр выпал, с ниб была..." - наверное, лучше бы оформить как обработку события. Лицица вообще сплошные обработки событий. То же "учуять сыр" - явная обработка события.
2. Про лес в басне ни слова. Ель могла быть отдельно стоящей.
3. По-моему "а сыр во рту держала" - это не ВзятьЖратвуВКлюв(), а изменение состояния в связи с подготовкой к завтраку.
4. Если писать с использованием generics, то получится песенка "Нам помнится вороне..." :)

Date: 2006-03-10 08:51 pm (UTC)
From: [identity profile] speshuric.livejournal.com
5. Воздух, лес, землю лучше оформить как singleton. Наверное, стоит их все вообще объединить в один класс "МирБасни".
6. Классы Жывотное и Еда разве не абстрактные?
7. Ну и главное: а какого лешего у тебя вообще ворона начала каркать? Хоть бы условие лести поставил :)

Date: 2006-03-11 12:39 am (UTC)
From: [identity profile] eugenebo.livejournal.com
Заплатите мне денег, так я вам это всё ещё 1000 и одним способом оформлю :)

Date: 2006-03-11 03:22 am (UTC)
From: [identity profile] speshuric.livejournal.com
Это ж главная мораль этой реализации басни! :)
From: [identity profile] paul-schultz.livejournal.com

ЕСЛИ ЖЕЛАЕШЬ ОБРЕСТИ СВОБОДУ СЛОВА - ПРИГОТОВЬСЯ РАССТАТЬСЯ С ДАРМОВЫМ СЫРОМ!!!

complete and utter off-topic

Date: 2006-03-12 05:00 pm (UTC)
From: [identity profile] alisa-selezneva.livejournal.com
(про себя)
Офигеть, неужели у меня было столько же свободного времени, когда я работал на самого богатого дядю в мире?

(вслух)
Заезжай как-нить в гости. Повторим сценарий, если не против :)

(совсем громко)
Про 4 марта наслышан. Чуть не расплакался, ностальгируя. Молодцы!

обратное преобразование

Date: 2006-03-28 09:48 am (UTC)
From: [identity profile] speshuric.livejournal.com
Выполнение куска кода в виде сказки: http://speshuric.livejournal.com/42883.html
Page generated Mar. 21st, 2026 02:53 pm
Powered by Dreamwidth Studios