"Якщо ви дійсно хочете OO цукру - перейдіть на C ++" - була негайна відповідь, яку я отримав від одного з своїх друзів, коли я запитав це. Я знаю, що тут помиляються дві речі. По-перше, OO НЕ "цукор", а по-друге, C ++ НЕ поглинає C.
Нам потрібно написати сервер на C (фронт якого буде в Python), і тому я вивчаю кращі способи управління великими програмами на C.
Моделювання великої системи з точки зору об'єктів та об'єктних взаємодій робить її більш керованою, підтримуваною та розширюваною. Але коли ви намагаєтеся перекласти цю модель на C, яка не містить об'єктів (і всього іншого), вам піддаються певні важливі рішення.
Чи створюєте ви власну бібліотеку для надання абстракцій OO, необхідних вашій системі? Такі речі, як об'єкти, інкапсуляція, успадкування, поліморфізм, винятки, паб / суб (події / сигнали), простори імен, самоаналіз тощо (наприклад, GObject або COS ).
Або ви просто використовуєте основні C-конструкції ( struct
та функції), щоб наблизити всі свої об'єкти-класи (та інші абстракції) спеціальними способами. (наприклад, деякі відповіді на це запитання щодо SO )
Перший підхід дає вам структурований спосіб втілити всю вашу модель в C. Але він також додає шар складності, який вам доведеться підтримувати. (Пам'ятайте, складність полягала в тому, що ми хотіли зменшити, в першу чергу, використовуючи предмети).
Я не знаю про другий підхід, і наскільки він ефективний у наближенні всіх абстракцій, які можуть знадобитися.
Отже, мої прості запитання: Які найкращі практики щодо реалізації об'єктно-орієнтованого дизайну в C. Пам'ятайте, я не прошу, ЯК це зробити. Це та ці питання говорять про це, і навіть є книга про це. Мене більше цікавлять кілька реалістичних порад / прикладів, які стосуються справжніх проблем, які з’являються під час цього.
Примітка. Будь ласка, не радить, чому C не слід використовувати на користь C ++. Ми вже пройшли цей етап.
extern "C"
і може використовуватися з python. Ви можете це зробити вручну, або у вас може допомогти SWIG . Отже, бажання пітонного фронтену - це не привід не використовувати C ++. Це не так сказати, що немає поважних причин хотіти залишитися з C.