Goto не только в циклах?
От: Badenweiler Россия http://helloimyourmind.com/
Дата: 20.11.05 11:03
Оценка:
Есть тулбар. Самописный. У него есть несколько режимов отображения (Надписи слева, надписи снизу, без надписей, без картинок). Причем стрелочки для DropDown кнопок — картинки, т.е. в режиме "без картинок" они не отображаются. Чтобы преодолеть это пришлось воспользоваться goto:

                    switch(labels)
                    {
                        case NavigationButtonLabels.Bottom:
                            //...
                            break;
                        case NavigationButtonLabels.Edge:
                            //...
                            break;
                        case NavigationButtonLabels.NoImages:
                            if(button.StrongImage) //Если картинка должна всегда отображаться
                                goto case NavigationButtonLabels.Edge; //пускай отображается

                            //...
                            break;
                        case NavigationButtonLabels.NoLabels:
                            //...
                            break;
                    }


Это, естественно, заработало. Но какое-то чувство осталось. Скажите, пожалуйста, красиво ли это?
Hello, I'm your mind [[EVANESCENCE — MY IMMORTAL]]
Re: Goto не только в циклах?
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 20.11.05 11:10
Оценка: 1 (1)
Здравствуйте, Badenweiler, Вы писали:

B>
B>                    switch(labels)
B>                    {
B>                        case NavigationButtonLabels.Bottom:
B>                            //...
B>                            break;
B>                        case NavigationButtonLabels.Edge:
B>                            //...
B>                            break;
B>                        case NavigationButtonLabels.NoImages:
B>                            if(button.StrongImage) //Если картинка должна всегда отображаться
B>                                goto case NavigationButtonLabels.Edge; //пускай отображается

B>                            //...
B>                            break;
B>                        case NavigationButtonLabels.NoLabels:
B>                            //...
B>                            break;
B>                    }
B>


                    switch(labels)
                    {
                        case NavigationButtonLabels.Bottom:
                            //...
                            break;
                        case NavigationButtonLabels.NoImages:
                            if(!button.StrongImage) //Если картинка не должна всегда отображаться[/b]
                            {
                               //....
                               break;
                            }   
                            //пускай отображается[/b]
                        case NavigationButtonLabels.Edge:
                            //...
                            break;
                        case NavigationButtonLabels.NoLabels:
                            //...
                            break;
                    }
Re: Goto не только в циклах?
От: Cyberax Марс  
Дата: 20.11.05 11:11
Оценка: 8 (3) +2
Badenweiler wrote:

> Это, естественно, заработало. Но какое-то чувство осталось. Скажите,

> пожалуйста, красиво ли это?

Нет Если хочется еще что-то более запутанного, то можно сделать так:
switch(labels)
{
    case NavigationButtonLabels.NoImages:
        *if(!button.StrongImage) //Если картинка НЕ должна всегда 
отображаться
        {
        *    break;
        }
        //А вот тут мы "провалимся" на следущую метку
    case NavigationButtonLabels.Edge:
        //...
    break;

}

А вообще, тут имеет смысл заменить содержимое case'ов на функции и
просто вызвать функцию "Edge".

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re: Goto не только в циклах?
От: reductor  
Дата: 20.11.05 11:13
Оценка: 7 (2)
B> Скажите, пожалуйста, красиво ли это?

По-моему, нет.
Я бы поставил NoImages перед Edge и "забыл бы" убрать break или же обернул бы все в функции и их вызывал из кейсов (заодно, если кода много, будет читабельнее)
Re[2]: Goto не только в циклах?
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 20.11.05 11:35
Оценка:
C>А вообще, тут имеет смысл заменить содержимое case'ов на функции и
C>просто вызвать функцию "Edge".

+2
Только имя для функции попонятнее выбрать.
Re[2]: Goto не только в циклах?
От: Badenweiler Россия http://helloimyourmind.com/
Дата: 20.11.05 11:47
Оценка:
Ну да, спасибо
Hello, I'm your mind [[CHEVELLE — UNTIL YOU'RE REFORMED]]
Re[2]: Goto не только в циклах?
От: Centaur Россия  
Дата: 20.11.05 14:06
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>
C>switch(labels)
C>{
C>    case NavigationButtonLabels.NoImages:
C>        *if(!button.StrongImage) //Если картинка НЕ должна всегда 
C>отображаться
C>        {
C>        *    break;
C>        }
C>        //А вот тут мы "провалимся" на следущую метку
C>    case NavigationButtonLabels.Edge:
C>        //...
C>    break;

C>}
C>


Судя по конструкции goto case в исходном сообщении, это C#. А там проваливаться нельзя, каждый case обязан заканчиваться break’ом, return’ом, throw’ом или goto [case].
Re[3]: Goto не только в циклах?
От: Kemm  
Дата: 20.11.05 14:17
Оценка: 1 (1)
Здравствуйте, Centaur, Вы писали:

C>Судя по конструкции goto case в исходном сообщении, это C#. А там проваливаться нельзя, каждый case обязан заканчиваться break’ом, return’ом, throw’ом или goto [case].


В таком случае goto case является более общим аналогом fall-through. Что вполне "красиво" (вспоминая вопрос).
Re: Goto не только в циклах?
От: Banch  
Дата: 21.11.05 08:48
Оценка: +1
Здравствуйте, Badenweiler, Вы писали:

B>Это, естественно, заработало. Но какое-то чувство осталось. Скажите, пожалуйста, красиво ли это?


а почему бы не воспользоваться полиморфизмом и убрать case вообще?
Re[2]: Goto не только в циклах?
От: reductor  
Дата: 21.11.05 09:26
Оценка:
B>а почему бы не воспользоваться полиморфизмом и убрать case вообще?

Видимо, имелась в виду перегрузка?

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

Если все не задокументировать подробнейшим образом, в будущем это породит кучу таинственных багов и проблем с пониманием того как это работает.
Явная диспетчеризация иногда лучше.

Впрочем, всей картины тут все равно не видно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.