Способы использования дизайна с использованием Closures (или блоков) в качестве программиста на C - PullRequest
5 голосов
/ 04 марта 2011

Моими 2 основными средами разработки являются C и Objective-C. С Clang и LLVM использование замыканий стало или становится полной реальностью, называемой блоками ... но они все еще замыкания. Меня не интересует техническое "как"

Что я хочу знать, так это то, как лучше всего разработать программное обеспечение для использования Closures?

Я знаю, что вы можете хорошо сортировать вещи, используя их, но какие еще есть возможности? Я видел способы упростить структуру программы, но тема, по-видимому, очень интересна для поиска. Я никогда не видел исчерпывающего списка или хорошего ресурса.

За вознаграждение: за вознаграждение будет дан полный список и конкретные примеры использования блоков в C и Objective-C

Ответы [ 3 ]

3 голосов
/ 09 марта 2011
0 голосов
/ 10 марта 2011

Я не работал с Objective-C, но использовал замыкания в C, C ++, Object Pascal, Delphi, Javascript.«Закрытие» - очень неоднозначный термин, и его реализация в коде отличается от одного языка программирования от другого, а также математическим термином.

Именно поэтому у нас есть «блоки», «обратные вызовы», «функция»указатели "," ссылки на методы ", бла.

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

Поскольку вы упоминаете «Objective C», который также является объектно-ориентированным, способ использования «замыкания» будет другим, есливы хотите использовать замыкания для методов или замыкания для глобальных функций.

Пример с "Обычным C":


typedef int (*ClosureType)(int a, int b);

int add(int a, int b)
{
    return a + b;
}

int substract(int a, int b)
{
    return a - b;
}

int multiply(int a, int b)
{
    return a * b;
}

int main(int argc, char *argv[])
{
    ClosureType functions[3] = { add, substract, multiply };

    int option = 0;

    printf("Operation Menu:\n");
    printf("(1) Addition:\n");
    printf("(2) Substraction:\n");
    printf("(3) Multiplication:\n");
    printf("Select an operation\n"); 
        scanf("%d", &option);

    int r = -1;
    switch () {
        case 1:
            r = functions[0] (3, 4);
        break;

        case 2:
            r = functions[1] (3, 4);
        break;

        case 3:
            r = functions[2] (3, 4);
        break;

        default
        break;
    }

    printf("The result of %d and %d: %d\n", 3, 4, r); 
    getch()("\n"); 

    return 0;
}

0 голосов
/ 04 марта 2011

Возможно, не тот ответ, который вы ищете, но это может помочь ...

Замыкания не новы, они существуют с самого начала программирования (Lisp, Algol-60). Лучший способ узнать о том, как они используются, - взглянуть на зрелый язык, на котором они были всегда, и посмотреть, как люди их используют.

Функциональные языки и замыкания являются синонимами, обычно называемыми «программированием высшего порядка» - когда функции (методы) принимают другие функции в качестве аргументов, а функции можно создавать на лету (блоки). Так что, глядя на книгу по программированию на Хаскеле, это не плохой выбор, или, может быть, F #.

Если это кажется слишком радикальным, вы можете взглянуть на Ada 95, «обычный» язык со встроенными функциями, хотя это (прибыльный) нишевый язык, и его функции, вероятно, не используются широко.

Если вы хотите что-то относительно новое, посмотрите на C #, где встроенные функции были добавлены в v2. Встроенные функции C # имеют много тех же ошибок, что и Obj-C, и люди попадают в них с неосведомленным восторгом - так что ищите недавнюю книгу по C #, когда их использование стало более зрелым.

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

...