C# goto, нужно ли избегать
От: Философ Ад http://vk.com/id10256428
Дата: 14.04.11 13:38
Оценка: -2 :)
Если можете предложить лучшее решение — предлагайте.

            Stack<PropertyInfo> stack2 = new Stack<PropertyInfo>();
            second:
            while (stack.Count > 0)
            {
                PropertyInfo pInfo = stack.Pop();
                count = CEntity.GetRelatedEntitiesProperties(pInfo.PropertyType, out api);

                foreach (PropertyInfo pInfo2 in api)
                {
                    p_Iwalker.ProcessNext(pInfo2);
                    stack2.Push(pInfo2);
                }
            }
            if (stack2.Count > 0)
            {
                //меняем местами стэки
                Stack<PropertyInfo> stackTmp = stack;
                stack = stack2;
                stack2 = stackTmp;
                goto second;
            }
Всё сказанное выше — личное мнение, если не указано обратное.
Re: C# goto, нужно ли избегать
От: andyag  
Дата: 14.04.11 13:45
Оценка: 3 (1)
Здравствуйте, Философ, Вы писали:

Ф>Если можете предложить лучшее решение — предлагайте.


Ф>
Ф>            Stack<PropertyInfo> stack2 = new Stack<PropertyInfo>();
Ф>            while(true)
              {
Ф>                while (stack.Count > 0)
Ф>                {
Ф>                    PropertyInfo pInfo = stack.Pop();
Ф>                    count = CEntity.GetRelatedEntitiesProperties(pInfo.PropertyType, out api);

Ф>                    foreach (PropertyInfo pInfo2 in api)
Ф>                    {
Ф>                        p_Iwalker.ProcessNext(pInfo2);
Ф>                        stack2.Push(pInfo2);
Ф>                    }
Ф>                }
Ф>                if (stack2.Count > 0)
Ф>                {
Ф>                    //меняем местами стэки
Ф>                    Stack<PropertyInfo> stackTmp = stack;
Ф>                    stack = stack2;
Ф>                    stack2 = stackTmp;
Ф>                    continue;
Ф>                }

                  break;
             }
Ф>
Re: C# goto, нужно ли избегать
От: RiNSpy  
Дата: 14.04.11 13:50
Оценка:
Абстрагируй всё в отдельный метод, goto не нужен.

Что-то вроде
while(stack.Count > 0)
{
    ProcessStack(stack, stack2);
    Swap(stack, stack2);
}
Swap(stack, stack2);


намного читабельнее даже без комментариев.
Re: C# goto, нужно ли избегать
От: HunteX http://troyashka.ru/
Дата: 14.04.11 13:54
Оценка:
Почитай это
Re: C# goto, нужно ли избегать
От: 0xC0DE  
Дата: 14.04.11 13:55
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Если можете предложить лучшее решение — предлагайте.


К примеру:

do
 {            
 Stack<PropertyInfo> stack2 = new Stack<PropertyInfo>();

 while (stack.Count > 0)
  {
  PropertyInfo pInfo = stack.Pop();
  count = CEntity.GetRelatedEntitiesProperties(pInfo.PropertyType, out api);

  foreach (PropertyInfo pInfo2 in api)
   {
   p_Iwalker.ProcessNext(pInfo2);
   stack2.Push(pInfo2);
   }
  }

 stack = stack2;
} while(stack.Count > 0)
Re: C# goto, нужно ли избегать
От: vmpire Россия  
Дата: 14.04.11 14:06
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Если можете предложить лучшее решение — предлагайте.

У выс тут два вопроса:
— можно ли предложить лучшее решение
— нужно ли избегать goto

Ответ на первый вопрос — да, можно. Выше уже предложили.
Ответ на второй — лучше избегать, если это не влечёт больших накладных расходов.
Технически без Goto можно написать всегда. Но иногда (очень редко) с goto получается сильно понятнее.
В современных языках для наиболее частых случаев применения goto придумали специализированные операторы (continue, break). Они обладают теми же недостатками, что goto, но эти недостатки в них смягчены тем, что по причине чётко определённой семантики они меньше вводят в заблуждение.

Пример случая, где goto на мой взгляд уместен — несколько вложенных циклов, внутри самого внутреннего проверяется какое-то условие, по которому должен быть выход из всех циклов сразу. Конечно, можно выделить эти циклы в отдельную функцию и сделать return из середины, но чем это лучше goto?
Re[2]: C# goto, нужно ли избегать
От: Sorc17 Россия  
Дата: 14.04.11 14:35
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Пример случая, где goto на мой взгляд уместен — несколько вложенных циклов, внутри самого внутреннего проверяется какое-то условие, по которому должен быть выход из всех циклов сразу. Конечно, можно выделить эти циклы в отдельную функцию и сделать return из середины, но чем это лучше goto?


А вот в Java его по другому и нельзя использовать. Не скомпилится. Что, в C# не скопировали эту блестящую идею? Странно.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re: C# goto, нужно ли избегать
От: WolfHound  
Дата: 14.04.11 15:03
Оценка: 2 (2) +1 -7 :)
Здравствуйте, Философ, Вы писали:

Ф>Если можете предложить лучшее решение — предлагайте.

Можем. Но не на C#. Ибо он тупой очень.
def process(stack, stack2)
{
    while (stack.Count > 0)
    {
        def pInfo = stack.Pop();
        count = CEntity.GetRelatedEntitiesProperties(pInfo.PropertyType, out api);
        foreach (pInfo2 in api)
        {
            p_Iwalker.ProcessNext(pInfo2);
            stack2.Push(pInfo2);
        }
    }
    when (stack2.Count > 0)
        process(stack2, stack);//Хвостовые вызовы стек не кушают.
}
process(stack, Stack());

А то что остальные напредлагали это и есть спагетти. Хотя они сами этого еще не понимают.
А вообще нужно озвучить всю задачу.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: C# goto, нужно ли избегать
От: vmpire Россия  
Дата: 14.04.11 15:21
Оценка:
Здравствуйте, Sorc17, Вы писали:

V>>Пример случая, где goto на мой взгляд уместен — несколько вложенных циклов, внутри самого внутреннего проверяется какое-то условие, по которому должен быть выход из всех циклов сразу. Конечно, можно выделить эти циклы в отдельную функцию и сделать return из середины, но чем это лучше goto?


S>А вот в Java его по другому и нельзя использовать. Не скомпилится. Что, в C# не скопировали эту блестящую идею? Странно.

У Вас отличная логика: спросить, предположить, что ответ положительный и удивиться ему
В C# можно переходить на метку можно только из скопа её действия, то есть из блока наружу (но не наружнее, чем стоит метка), но не внутрь.
Насколько я понимаю, это так же, как в Java или очень похоже.
Re: C# goto, нужно ли избегать
От: Abyx Россия  
Дата: 14.04.11 15:29
Оценка:
шаг 1
       {
        second:
            count = ...(stack, stack2);
            if (stack2.Count > 0)
            {
                swap(ref stack, ref stack2);
                goto second;
            }
       }


шаг 2
       for(;;)
       {
            count = ...(stack, stack2);

            if(stack2.Count == 0)
                return;

            swap(ref stack, ref stack2);
       }
In Zen We Trust
Re[2]: C# goto, нужно ли избегать
От: WolfHound  
Дата: 14.04.11 16:08
Оценка:
Здравствуйте, WolfHound, Вы писали:

Мне интересно с каким из озвученных фактов не согласны минусующие?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: C# goto, нужно ли избегать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.04.11 16:14
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Технически без Goto можно написать всегда. Но иногда (очень редко) с goto получается сильно понятнее.


В этом умозаключении неявно фигурирует язык на котором у тебя возникают проблемы.

Я знаю как минимум 5 языков в которых вообще нет goto и не возникает никаких проблем по этому поводу.

Так что то что ты думаешь, что что-то знаешь — это от незнания . Освой любой язык претендующий на звание "функциональный" и ты тотчас же изменишь свое мнение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: C# goto, нужно ли избегать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.04.11 16:25
Оценка: 14 (5) +2 -1
Здравствуйте, Философ, Вы писали:

Ф>Если можете предложить лучшее решение — предлагайте.


Ф>
Ф>            Stack<PropertyInfo> stack2 = new Stack<PropertyInfo>();
Ф>            second:
Ф>            while (stack.Count > 0)
Ф>            {
Ф>                PropertyInfo pInfo = stack.Pop();
Ф>                count = CEntity.GetRelatedEntitiesProperties(pInfo.PropertyType, out api);

Ф>                foreach (PropertyInfo pInfo2 in api)
Ф>                {
Ф>                    p_Iwalker.ProcessNext(pInfo2);
Ф>                    stack2.Push(pInfo2);
Ф>                }
Ф>            }
Ф>            if (stack2.Count > 0)
Ф>            {
Ф>                //меняем местами стэки
Ф>                Stack<PropertyInfo> stackTmp = stack;
Ф>                stack = stack2;
Ф>                stack2 = stackTmp;
Ф>                goto second;
Ф>            }
Ф>


Мне казалось, что вопрос с goto был закрыт много лет назад вот этим вот шедевром
Автор: IT
Дата: 08.06.02
народного творчества IT. Ан, нет.

Я не буду приводить примера того как этот код можно было бы переписать без goto. Я просто скажу что твой код — говно. Или как его любят называть в народе — говнокод. Читать его сложно и уныло.

Лучшим решением было бы не пытаться устранить в этом говнокоде goto, а попытаться описать задачу на естественно языке и подумать как ее лучше всего решить не доводя код до состояния говнокода.

За долгие годы программирования я для себя вывел формулу написания хорошего кода — надо писать код думая о том как ты будешь объяснять его окружающим. Оптималным вариантом является описание кода в статье (блоге, сообщении на форуме в скайпе, ...). Как только ты начинаешь думать о том как описать свой код словами, так тот час же понимаешь, что проще переписать код более очевидным образом, нежели пытаться описать некачественный код.

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

В общем, не борись с goto. Борись за понятность кода. Начни с того, что приведи здесь внятно описание задачи на естественном (русском) языке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: C# goto, нужно ли избегать
От: vmpire Россия  
Дата: 14.04.11 17:45
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, vmpire, Вы писали:

V>>Технически без Goto можно написать всегда. Но иногда (очень редко) с goto получается сильно понятнее.
VD>В этом умозаключении неявно фигурирует язык на котором у тебя возникают проблемы.
Этот язык явно фигурирует в названии топика

VD>Я знаю как минимум 5 языков в которых вообще нет goto и не возникает никаких проблем по этому поводу.

Я тоже знаю намного больше одного языка, смысла заниматься фаллометрией не вижу.
С goto у меня проблем не возникает, в проектах использовать не приходилось ни разу, за исключением версий break/continue и языков, где без него нельзя никак.

VD>Так что то что ты думаешь, что что-то знаешь — это от незнания .

Это ты думаешь, что знаешь, что я думаю. Но это, как ты сам сказал, от незнания

VD>Освой любой язык претендующий на звание "функциональный" и ты тотчас же изменишь свое мнение.

Изменю мнение о том, что в C# бывают случаи, когда goto оправдан? Как C# связан с функциональными языками?
Вы действительно считаете, что отсутствие goto в одних языках это довод за то, что он не нужен и в других? Тогда вот вам контрпример: напишите, пожалуйста, что-нибудь без goto на ассемблере.
Re[3]: C# goto, нужно ли избегать
От: vmpire Россия  
Дата: 14.04.11 17:47
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Мне интересно с каким из озвученных фактов не согласны минусующие?

С понятием "тупой язык" и неявным утверждением, что на C# показанный способ невозможен
Re[4]: C# goto, нужно ли избегать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.04.11 17:56
Оценка:
Здравствуйте, vmpire, Вы писали:

VD>>В этом умозаключении неявно фигурирует язык на котором у тебя возникают проблемы.

V>Этот язык явно фигурирует в названии топика

Сори. Как-то в шапку я забыл второй раз заглянуть когда читал само сообщение. Однако же даже в рамках C# понятнее от наличия goto ни разу еще не становилось. Если нужны goto, то стоит подумать над более детальным продумыванием алгоритма.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: C# goto, нужно ли избегать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.04.11 18:05
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Мне интересно с каким из озвученных фактов не согласны минусующие?


А почему сразу несогласны? Просто больно людям за бесцельно прожитые дни (с).

Если серьезно, то ты не прав, конечно. Язык не тупой (есть множество тупее). Он просто не очень удобный. В данном случае он просто провоцирует на говнокод. Но это свойство любого приемущественно императивного языка. В том числе Явы, С++, С, Паскаля и т.п.

Когда ты мыслишь циклами, то вопрос входа и выхода из двух вложенных циклов возникает сам собой. Это вопрос времени.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: C# goto, нужно ли избегать
От: WolfHound  
Дата: 14.04.11 18:07
Оценка:
Здравствуйте, vmpire, Вы писали:

V>С понятием "тупой язык" и неявным утверждением, что на C# показанный способ невозможен

Ну тебе и флаг в руки. Перепиши на C#.
Вот только там нет ни локальных функций ни оптимизации хвостовой рекурсии.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: C# goto, нужно ли избегать
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.04.11 18:07
Оценка: +1 :)
Здравствуйте, VladD2, Вы писали:

Мне кажется надо подкрутить движок сайта... чтобы минус от minorlogic (полученный вне форума С++) заменялся бы на 3, нет, 5 плюсов!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: C# goto, нужно ли избегать
От: night beast СССР  
Дата: 14.04.11 18:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мне кажется надо подкрутить движок сайта... чтобы минус от minorlogic (полученный вне форума С++) заменялся бы на 3, нет, 5 плюсов!


это называется административный ресурс, да?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.