LINUX.ORG.RU
ФорумTalks

Все просто ))

 ,


0

1

Вчера вбросил знакомым одну простую задачку, которая слегка ввела их в ступор. Дай-ка и сюда вброшу.

Необходимо оптимизировать (переходы по адресу, кол-во условий/вызовов/переменных) и сделать лаконичным, понятным, читаемым, без лапши, копипасты, расширяемым для большего кол-ва значений за наименьшее кол-во телодвижений, следующий кусочек псевдокода:

// value can be: a,b,c,d,e,f or g
myLongLongNameOfVariable = getName();
if (myLongLongNameOfVariable == 'a' || myLongLongNameOfVariable == 'b' || myLongLongNameOfVariable == 'c' || myLongLongNameOfVariable == 'd' || myLongLongNameOfVariable == 'e' || myLongLongNameOfVariable == 'f') {
    forAllNonDefault();
    if (myLongLongNameOfVariable == 'a') {
        forA();
    } else if (myLongLongNameOfVariable == 'b') {
        forB();
    } else if (myLongLongNameOfVariable == 'c') {
        forC();
    } else if (myLongLongNameOfVariable == 'd') {
        forD();
    } else if (myLongLongNameOfVariable == 'e') {
        forE();
    } else if (myLongLongNameOfVariable == 'f') {
        forF();
    }
} else {
    // last (here 'g') value context (default)
    forDefault();
}

Ваши предложения?

★★★★★
int variable_index;
variable_index = get_variable_index();
switch (variable_index) {
case VAR_A:
     forA();
     break;
......
default:
     forDefault();
     break;
}
cvs-255 ★★★★★
()

Свалить указатели на все for* в массив, вызывать функцию по смещению myLongLongNameOfVariable - 'a'. Ну и первый if на недефолты — тупо проверять диапазон от a до f.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Это плохо расширяется на случай, когда нужно передавать аргументы функциям, причем разным разные

cvs-255 ★★★★★
()

Ваши предложения?

Хэш указателей на функции.

Relan ★★★★★
()

кусочек псевдокода

А что этот псевдокод умеет? Списки умеет? Искать в них умеет? Указатели на функции умеет? Метапрограммирование умеет?

Xellos ★★★★★
()
Ответ на: комментарий от x3al

Свалить указатели на все for* в массив

Это уже лишняя сущность - массив, что не отвечает условиям задачи.

deep-purple ★★★★★
() автор топика

Да даже на быдлопохапе это лаконичнее будет:

$callbacksList = array(
'a' => somefunction,
'b' => somefunction,
...
);
if (!empty($callbacksList($longvar))) {
$callbacksList($longvar)();
} else {
default();
}

Tark ★★
()
Последнее исправление: Tark (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Там иф умеет возвращать значения. И свитч, кажется, тоже.

ee1337a
()
switch (myLongLongNameOfVariable) {
case 'g':
forDefault();
break;
default:
forAllNonDefault();
switch (myLongLongNameOfVariable) {
case 'a':
forA();
break;
case 'b':
forB();
break;
case 'c':
forC();
break;
case 'd':
forD();
break;
case 'e':
forE();
break;
case 'f':
forF();
break;
}
}
Lincor
()
Ответ на: комментарий от Tark

$callbacksList = array(

Лишняя сущность, мимо.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от Lincor

case 'g':

Мимо. Вместо g там может быть все что угодно, т.е. некий дефолт. Я не стал сильно подробно описывать условия словами, но логика когда в первом посте корректна. Понадеялся что посмотрят код для подробностей.

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

для 2.7 и 3.х будет что-то на подобие такого

myList = [a, b, c, d]
myLongLongNameOfVariable = get_name()
if myLongLongNameOfVariable in myList:
    for_func(myLongLongNameOfVariable)
else:
    for_func(default)

der_looser ★★
()
Ответ на: комментарий от der_looser

Дык, даже логика не правильная. Там для всех кто не дефолт сперва должно отработать общее, а потом для каждого свое. Плюс ты еще лишнюю сущность «myList» заюзал.

deep-purple ★★★★★
() автор топика

Это уже лишняя сущность - массив, что не отвечает условиям задачи.
Лишняя сущность, мимо.
лишнюю сущность «myList» заюзал

Единственная лишняя здесь сущность — это тред, который ты создал.

edigaryev ★★★★★
()
Ответ на: комментарий от edigaryev

Проходи мимо, если не интересно.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Ви такие странные наводящие вопросы задаете, будто забыли как работать с простыми условными операторами.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от next_time

есс-но, при

class MyLetter{
char letter;
public:
virtual void for_letter();
};
next_time ★★★★★
()
Ответ на: комментарий от deep-purple
myLongLongNameOfVariable = get_name()
if myLongLongNameOfVariable in [a, b, c, d, e, f]:
    for_all_non_default()
    for_func(myLongLongNameOfVariable)
else:
    for_default()

Теперь ты множество заранее известных значений будешь править листая код до сточки с if, а не в начале кода, переписывая переменную myList. Лишней сущности нет, как ты и хотел. Но вообще питон поможет лишь сделать код более человекочитаемым, а на счет низкоуровневых оптимизаций останется только понядеяться на Гвидо.

der_looser ★★
()
Ответ на: комментарий от next_time

Да, их может и пушкин реализует, только это не наше дело, нам только выбрать нужный можно.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Забыл, да. Как-то всё больше хэши указателей на функции. Зачем мне гужевой транспорт, если есть автобус?

Xellos ★★★★★
()
Ответ на: комментарий от deep-purple

тогда неясно ваше сообщение выше. в представленном решении нет выбора уже реализованной функции (Все просто )) (комментарий)), а вы его засчитали.

что касается моего примера, ну сделаете обёртки из классов с виртуальными функциями (как я выше написал). формально, это будет библиотека, да. из 3-строчек.

next_time ★★★★★
()

Карта Карно.

Deleted
()
Ответ на: комментарий от next_time

Да у него там еще и список, что равносильно пыховому array() обьсужденному еще выше. В целом да, можно не засчитать.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от wakuwaku

Необходимо оптимизировать (переходы по адресу, кол-во условий/вызовов/переменных) и сделать лаконичным, понятным, читаемым
eval

/0

next_time ★★★★★
()

На хаскелле (буквально)

main = getName >>= branching

branching myLongNameOfVariable
    | name `elem` "abcdef" = forAllNonDefault >> case myLongNameOfVariable of
        'a' -> forA
        'b' -> forB
        'c' -> forC
        'd' -> forD
        'e' -> forE
        'f' -> forF
branching _ = forDefault

zinfandel ★★
()
Последнее исправление: zinfandel (всего исправлений: 1)
Ответ на: комментарий от next_time

Хэй хэй мы тут пидон обсуждаем! Или php там было? Меньше всего оверхеда будет у case и прочих способах, основанных на безусловных переходах, однако их легко скатить в лапшу. А в твоём коде, очевидно, «лишние сущности», что не устраивает ТС. :D

Хотя if это очень лишние сущности сами по себе, с весомым оверхэдом.

wakuwaku ★★★★
()
Ответ на: комментарий от next_time

ну пробегай тогда по ключам словаря, а значения - ссылки на соответствующие функции. можешь еще сахараром присыпать и навернуть хокку 80 лвл. в таком случае любая оптимизация споткнется об лапшу forN().

der_looser ★★
()
Ответ на: комментарий от next_time

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

der_looser ★★
()
Ответ на: комментарий от der_looser

вопрос низкоуровневой оптимизации

Тут уже вызовы функций, какая, нафиг, низкоуровневая оптимизация?

Xellos ★★★★★
()
Ответ на: комментарий от zinfandel

На хаскелле без лишних сравнений, лаконично, читаемо, расширяемо

main = getName >>= branching

branching myLongNameOfVariable
    | Just f <- dispatch myLongNameOfVariable = forAllNonDefault >> f
    | otherwise = forDefault

dispatch 'a' = forA
dispatch 'b' = forB
dispatch 'c' = forC
dispatch 'd' = forD
dispatch 'e' = forE
dispatch 'f' = forF
dispatch _   = fail "No function dispatched"

zinfandel ★★
()
Последнее исправление: zinfandel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.