LINUX.ORG.RU

Design patterns in C


3

3

посоветуйте, что почитать. ООП в топку.

А так же, касательно Кернигана-Ричи, посоветуйте перевод, или жестчайше необходимо в оригинале?

★★★★★

Последнее исправление: MyTrooName (всего исправлений: 2)

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

Из теории, то вот например про синхронизацию с помощью семафоров http://www.greenteapress.com/semaphores/ . Переносимо все и на чистый С.

Отсюда также можно выцепить полезные «шаблоны», которые можно применить на практике http://aosabook.org/en/index.html

В общем и целом, смотря какая область конкретно интересует (сети, ОС, обработка данных...).

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

Никакая конкретная область не интересует, интересует сам язык.

Только что случайно «изобрел»:

if(ptr)
    free(ptr), ptr = 0;

вместо

if(ptr) {
    free(ptr);
    ptr = 0;
}

зашел на вики, прочитать точно про comma operator, увидел еще пару тривиальных, но совершенно необходимых вещей каждому, кто смеет заявлять, что он знает С.

или, скажем, инициализация структуры с кучей ссылок на динамические объекты: если где-то вывалился malloc() == 0, то надо все остальные освобождать. Только что наваял пару макросов, которые позволяют сделать это в 2N+1 строчек, где N - количество указателей. Но сами макросы хрен распарсишь на глаз. Вот и хочу обратиться к специалистам

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

ООП в топку.

или, скажем, инициализация структуры с кучей ссылок на динамические объекты:

Я как бы понямаю о чём речь, выделены в куче и всё такое, но у тебя ооп головного мозга.

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

ООП в топку
у тебя ооп головного мозга

?

объекты

купи толковый словарь русского языка, и открой для себя новое значение слова «объект», никак с ооп не связанное

ооп головного мозга

у тебя

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

так и знал, что кому-нибудь хватит оригинальности придраться

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

инициализация структуры с кучей ссылок на динамические объекты: если где-то вывалился malloc() == 0, то надо все остальные освобождать.

Можно просто освобождать все ненулевые. И тогда весь код выглядит как

if(!(a = malloc(...))
  goto cleanup;

if(!(b = malloc(...))
  goto cleanup;

if(!(c = malloc(...))
  goto cleanup;

return 0;
cleanup:
  if(a) free(a);
  if(b) free(b);
  if(c) free(c);

Если очень не любишь goto можно делать

ok = 0;
if((a = malloc(...))
   && (b = malloc(...))
   && (c = malloc(...)))
{
  ...
} else {
  if(a) free(a);
  if(b) free(b);
  if(c) free(c);
}

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

слишком длинно и багоопасно. понятно, что примитивщина, но не хочу дублировать код, еще и в двух местах (блок malloc'ов и блок cleanup). а ну как добавлю еще malloc, а про free забуду?

MyTrooName ★★★★★
() автор топика

Судя по тому, что тебя живо интересуют такие конструкции с запятой, тебе нужно просто учить язык, а читать учебники тебе в лом. Ничего страшного. Читать я всегда советую CERT C Secure Coding Standard. На английском и в онлайне. Идеальное чтиво, чтобы усвоить то, что обычно приходит с опытом.

P. S. И не надо противопоставлять C и ООП. Ну и вообще ООП не надо упоминать всуе.

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

вывалился malloc() == 0

Не очень удачный пример. Если malloc() вернул NULL в большинстве случаев лучше сдаться. assert() после malloc() например

anonymous
()
Ответ на: комментарий от Krieger_Od

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

Дваждую.

anonymous
()

«design patterns» не имеют привязки к языкам. Это просто обобщения, чтоб одинаковые подходы называть одинаковыми именами и друг-друга понимать. Заодно иметь под рукой общения наработок. Просто в терминах ОО это короче формулируется.

кстати замена if (p) { free(p);p=0; } на if (p) free(p),p=0; это не patterns это trics :) тогда уж сразу p&&(free(p),p=0);

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

читать учебники тебе в лом

грешен

Судя по тому, что тебя живо интересуют такие конструкции с запятой, тебе нужно просто учить язык

хм. а какая связь?

CERT C Secure Coding Standard

обязательно посмотрю

И не надо противопоставлять C и ООП

и не пытался. просто хотел сразу отшить тех, кто ставит знак равенства между ооп и DP

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

а ну как добавлю еще malloc, а про free забуду?

[troll on] Хаха! use unique_ptr & throw [troll off]

Bienvenue в С!

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

assert() как раз не хорошо, так как он отключается при сборке релиза

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

А что такое ДП?

Дабл Пенетрейшн.

anonymous
()
Ответ на: комментарий от nanoolinux

А что такое ДП?

не скажу. а то опять будешь своим troll-тегом тут щелкать (включать-выключать т.е.)

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

Ну так я ж тебе по делу написал. Хочешь писать на С - привыкай, т.к. писать надо будет много и рутины будет более чем дофига.

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

и не пытался. просто хотел сразу отшить тех, кто ставит знак равенства между ооп и DP

На самом деле ООП гораздо глубже, чем ты понимаешь. ООП это не только классы, приват/паблики и функции члены, это способ проектирования. И объектный подход применяется не только в ООП-языках.

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

рутины будет более чем дофига

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

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

ООП

это бренд. как, например, ГМО. что только под ним не понимают

MyTrooName ★★★★★
() автор топика

GoF книжку про паттерны читай, там конечно про плюсы, но идеи не меняются при переходе с языка на язык, а местами пригождается даже в не-ООП языках.

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

ptr = 0;

«converts integer to pointer without a cast»

anonymous
()
Ответ на: комментарий от MyTrooName

Это очень плохая идея. Во-первых перед free вообще не надо проверять указатель на предмет равенства NULL. Во-вторых второй вариант намного удобнее при отладке: легко превратить его в:

if (ptr) {
    printf("XXX: %d\n", __LINE__);
    free(ptr);
    ptr = NULL;
}

rymis ★★
()
Ответ на: комментарий от MyTrooName
if(ptr)
    free(ptr), ptr = 0;

вместо

if(ptr) {
    free(ptr);
    ptr = 0;
}

facepalm.mpeg

У меня просто нет слов.

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

может не будем мыш на кактус натягивать. а?

паттерны проектирования - это ручное придериживание того , что в языке как отдельная языковая синтаксическая конструкция отсутствует(по тем иным причинам)

наследование как правило зло.

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

дык пимпл хорош.

тока по инерции мЫшления я считал , что и в жабке пимпл необходим - оказалось вм не обязана размещать поля обьекта последовательно.

т.е обьяснять ооп через с++ ( в котором пимпл необходим для реального сокрытия реализации) -это смешивание «высокого»/«академического»( т.е абстракций подхода) с «низким»/«практическим» (деталями реализации подхода и сужением самого подхода по причине статической ( т.е трансляции (в компайл-тайм , а не в рантайм по мере необходимости) имён В места))

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

ptr = 0;
if(ptr)

лолшто? Как будто ты ещё где-то в другой функции хочешь применять поинтер на освобожденную память и приравниваешь его 0 от греха подальше.

Весело бы смотрелся код

void lol()
{
    void *p = alloc (1005000);
    doit (p);
    if (p) {free (p); p=0;}
}

Про if (ptr) вообще молчу. В общем, надо учиться думать, а не забивать голову шаблонами, а проектированию учиться на примере хорошего кода

lispfuerimmer
()
Ответ на: комментарий от qulinxao

Ты мне скажи, спец по «академическому подходу»... Я вот читаю книжечку по хаскелю и по ФП в целом. Всё отлично, крутой ЯП. Но вот возможность динамически линковать части программы при старте процесса там присутствует или нет?

А то если чтобы применить исправление ошибки в библиотеке, придётся перекомпилировать сотню бинарников — это не айс, при всей академической крутоте.

anonymous
()
Ответ на: комментарий от lispfuerimmer

Объект - это не обязательно ООП. Например в CL всё объект, даже с отрывом от CLOS

Ты ничего не путаешь? Объект как термин используется в ОБЪЕКТНО-ориентированной парадигме. Потому она так и называется.

А в лиспе базово всё есть список. До тех пор, пока мы сами не решим какую-нибудь разновидность списка считать объектом, т.е. не перейдём к ООП.

anonymous
()
Ответ на: комментарий от lispfuerimmer

С гоуту - излюбленный вариант в ведре

Потому что это наиболее читабельный и выполненый в стиле DRY способ обработки ошибок в сишном коде.

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

А в лиспе базово всё есть список.

Я не знаю, что за лисп, я говорю о CL. Атом тоже список - да? И кроме list CL есть ещё уйма неатомарных последовательностей.

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

Атом тоже список - да?

Я хз, каким это термином у вас там зовётся, ибо я в лиспах разбираюсь как свинья в апельсинах. Но с формальной точки зрения это, Pair = Pair Node Node; Node = Atom n | Pair a b | nil; — эт я точно помню.

И кроме list CL есть ещё уйма неатомарных последовательностей.

Если следовать концепции, они должны натягиваться на списковые структуры. Т.е. на уровне реализации там может быть хоть libastral, но если семантически оно не выводится из абстрактной лисп-машины, то это не лисп. Благо, лисп-машина тьюринг полная и из неё можно вывести любой алгоритм, так что это не проблема.

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.