PDA

Просмотр полной версии : [Вопрос] Тернарный оператор



Camelot
10.06.2014, 00:15
Недавно узнал об тернарном операторе, так решил сразу за него взяться.
Всё продвигалось неплохо, пока не столкнулся с такой проблемой.
Сейчас у меня все названия фракций проходят через switch, а мне хочется чтобы они проходили через тернарный оператор.
Так вот незадача, строка оператора будет уж настолько длинная...
Может существует способ разбить строку на 2-3 части? Или же какой-нибудь еще...
В общем, жду помощи... Заранее, спасибо.

switch(IsAFractions(targetid))
{
case 0: ttext = "Гражданин";
case 1: ttext = "LSPolice";
case 2: ttext = "FBI";
case 3: ttext = "Nathional Guard";
case 5: ttext = "La Cosa Nostra";
case 6: ttext = "Yakuza";
case 7: ttext = "Мэрия";
case 8: ttext = "Hitmans";
case 9: ttext = "LSNews";
case 11: ttext = "Licensors";
case 12: ttext = "Russian Mafia";
case 13: ttext = "Grove Street Families";
case 14: ttext = "The Ballas Gang";
case 15: ttext = "Los Santos Vagos Gang";
case 16: ttext = "Varrio Los Aztecas";
case 17: ttext = "The Rifa Gang";
}


ttext = (IsAFractions(targetid) == 1) ? ("LSPolice") : (IsAFractions(targetid) == 2) ? ("FBI") : (IsAFractions(targetid) == 3) ? ("Nathional Guard") и т.д.

underwoker
10.06.2014, 00:19
Недавно узнал об тернарном операторе, так решил сразу за него взяться.
Всё продвигалось неплохо, пока не столкнулся с такой проблемой.
Сейчас у меня все названия фракций проходят через switch, а мне хочется чтобы они проходили через тернарный оператор.
Так вот незадача, строка оператора будет уж настолько длинная...
Может существует способ разбить строку на 2-3 части? Или же какой-нибудь еще...
В общем, жду помощи... Заранее, спасибо.

switch(IsAFractions(targetid))
{
case 0: ttext = "Гражданин";
case 1: ttext = "LSPolice";
case 2: ttext = "FBI";
case 3: ttext = "Nathional Guard";
case 5: ttext = "La Cosa Nostra";
case 6: ttext = "Yakuza";
case 7: ttext = "Мэрия";
case 8: ttext = "Hitmans";
case 9: ttext = "LSNews";
case 11: ttext = "Licensors";
case 12: ttext = "Russian Mafia";
case 13: ttext = "Grove Street Families";
case 14: ttext = "The Ballas Gang";
case 15: ttext = "Los Santos Vagos Gang";
case 16: ttext = "Varrio Los Aztecas";
case 17: ttext = "The Rifa Gang";
}


ttext = (IsAFractions(targetid) == 1) ? ("LSPolice") : (IsAFractions(targetid) == 2) ? ("FBI") : (IsAFractions(targetid) == 3) ? ("Nathional Guard") и т.д.
Собсна, зачем усложнять себе жизнь? Ведь и свитчем это все прекрасно работает. 2-3 ms вам оптимизации не дадут.

Camelot
10.06.2014, 00:24
У меня в моде много подобных случаев. И если это всё перевести в тернарый оператор, то небольшой + к оптимизации, думаю, будет...

Daniel_Cortez
10.06.2014, 07:44
Проще будет сделать один глобальный массив с названиями всех организаций. Делать 18 вариантов с помощью тернарного оператора - не иначе, как извращение.

OKStyle
10.06.2014, 08:52
Кто сказал, что тернарный оператор в этом случае даст оптимизацию? Я бы сделал, как предложил Daniel_Cortez.

DeimoS
10.06.2014, 09:09
Ох уж эти доморощенные оптимизаторы, которые гоняться за скоростью там, где совершенно не нужно.

Вы знаете какое различие в скорости обработки машиной тернарных условий и логических? Десятые, а то и сотые доли микросекунд. Много от такого "прироста" толку будет в коде, который будет вызываться раз в несколько минут? При этом вам этот код ещё читать через неделю-месяц-год. И потратите вы на его разбор явно больше, чем на разбор обычных логических условий. И ошибок в написании наделаете гораздо больше (тех самых, что уже делаете).
Действительно ли те доли микросекунд, которые просто затеряются в интервалах вызова кода, стоит того времени, которое вы будете тратить на чтение и исправление ошибок? Сейчас вы занимаетесь чистейшим извращением и пессимизацией. Подобное уместно будет только в случае, когда код вызывается очень часто и постоянно. Например, в OnPlayerUpdate или же каком-нибудь секундном таймере с БОЛЬШИМИ и СЛОЖНЫМИ вычислениями. А какой толк от того, что какая-нибудь команда, которую игроки вызывают раз в 10 минут, будет срабатывать на 0.002 микросекунды быстрее?
В общем, прирост к скорости настолько мал, что тут решается больше вопрос скорости программиста: прочитать, понять, исправить или доработать код, - чем производительности процесса.

И да, вы совсем не поняли предназначения тернарного оператора. Он создан для упрощения простых условий, а-ля

if(Optimization == 1) Optimize = true;
else Optimize = false;
и

Optimize = (Optimization ? true : false);
Тут действительно и читаемость не теряется, и код выглядит более красиво. В вашем же случае это полное извращение над теми, кто будет работать с вашим кодом в дальнейшем (в том числе и над собой вы издеваетесь). Не занимайтесь ерундой.

Camelot
10.06.2014, 14:08
Всем спасибо. Буду придерживаться ваших советов.
Тему можно закрывать.