Чи є якісь “шаблони дизайну” в C? [зачинено]


84

Я знаю, що шаблони дизайну, як правило, пов’язані з програмуванням OO, але чи є у вас якийсь шаблон, який ви часто використовуєте, коли програмуєте C?

Мене не цікавлять прості переклади класичних моделей ОО, і, будь ласка, не згадуйте про пристрій Даффа. ;-)

Відповіді:


86

Мій улюблений - серія "Візерунки на Сі" Адама Торнхілла :

Також: Я завжди вважаю gotoце чудовим інструментом бідної людини для декоративного малюнка.

Оновлення : Я настійно рекомендую використовувати Rust ( rust-lang.org ), а не C, за винятком випадків, коли вам потрібно використовувати c. Rust має всі переваги c, включаючи швидкість і сумісність бінарних бібліотек з c, але компілятор обробляє значну частину складності, щоб забезпечити безпеку коду та не містити раси даних. Він також портативний, має стандартну бібліотеку для загальних завдань і набагато простіший для програмування на різні шаблони дизайну.


9
Не могли б ви детальніше розповісти, що gotoспільного з декораторами?
Gui Prá

1
Це чудова маленька серія Адама Торнхілла (був Петерсен). Доступна його повна книга . Цей невеликий набір шаблонів доставить вас у C.
Клінт Пехл,

10

Шаблони дизайну можна розглядати як відсутні функції мови. Введення шаблонів дизайну: Елементи багаторазового об'єктно-орієнтованого програмного забезпечення стверджує:

Вибір мови програмування важливий, оскільки він впливає на власну точку зору. Наші зразки передбачають особливості мови на рівні Smalltalk / C ++, і цей вибір визначає, що можна, а що не можна легко реалізувати. Якби ми припускали процедурні мови, ми могли б включити шаблони проектування, що називаються "Спадкування", "Інкапсуляція" та "Поліморфізм". Подібним чином деякі наші шаблони підтримуються безпосередньо менш поширеними об'єктно-орієнтованими мовами. CLOS, наприклад, має мультиметоди, які зменшують потребу в такому шаблоні, як Visitor. ( курсив мій )

Речення курсивом - це відповідь на ваше запитання.


7

Поліморфізм через зворотні виклики, наприклад, qsortфункція стандартної бібліотеки . Все, що йому потрібно, це спосіб порівняння двох елементів, і він може відсортувати їх масив.

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


Мені подобається використання зворотних дзвінків. Ви можете створити загальну функцію обходу структури даних, яка виконує функцію зворотного виклику для кожного елемента.
onemasse

5

Так, є. Ледача ініціалізація, синглтон, пул об’єктів, стан об’єктів тощо легко реалізуються в чистому C.

Приклад (ледача ініціалізація)


Так, ймовірно, вони є, але як би ви зазвичай реалізовували один із цих зразків у C?
onemasse

2
Кращий момент полягає в тому, що ви не повинні реалізовувати погані шаблони дизайну (наприклад, одиночні, вони ж глобальні змінні) на мові C чи будь-якій іншій мові.
R .. GitHub СТОП ДОПОМОГАЙ ЛЕДІ

4
@R .: Я справді не думаю, що синглтон - це погана модель як така. Це може бути корисним і продуктивним у певних випадках, може шкодити для якості коду в певних випадках. Але розробник повинен знати переваги та недоліки дизайнерських шаблонів та використовувати їх з розумом.
Влад


2

Шаблони дизайну часто моделюють речі, які лише на одному рівні від того, що пропонує існуюче середовище. Якщо взяти C із його стандартною бібліотекою як середовище, видатним шаблоном дизайну є об’єктна орієнтація.


2

Віртуальна файлова система є прекрасним прикладом для вивчення шаблону дизайну.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.