«Если вы действительно хотите ОО-сахар - используйте C ++», - был немедленный ответ от одного из моих друзей, когда я спросил об этом. Я знаю, что две вещи здесь совершенно неверны. Во-первых, OO НЕ является «сахаром», а во-вторых, C ++ НЕ поглощает C.
Нам нужно написать сервер на C (внешний интерфейс которого будет в Python), и поэтому я изучаю более эффективные способы управления большими программами на C.
Моделирование большой системы с точки зрения объектов и взаимодействия объектов делает ее более управляемой, поддерживаемой и расширяемой. Но когда вы пытаетесь перевести эту модель на C, в котором нет объектов (и всего остального), вы сталкиваетесь с некоторыми важными решениями.
Вы создаете пользовательскую библиотеку для обеспечения абстракций OO, в которых нуждается ваша система? Такие вещи, как объекты, инкапсуляция, наследование, полиморфизм, исключения, pub / sub (события / сигналы), пространства имен, самоанализ и т. Д. (Например, GObject или COS ).
Или вы просто используете базовые конструкции C ( struct
и функции) для аппроксимации всех ваших классов объектов (и других абстракций) специальными способами. (например, некоторые ответы на этот вопрос на SO )
Первый подход дает вам структурированный способ реализации всей вашей модели на C. Но он также добавляет уровень сложности, который вы должны поддерживать. (Помните, что сложность была то, что мы хотели уменьшить, используя объекты в первую очередь).
Я не знаю о втором подходе и о том, насколько он эффективен в аппроксимации всех абстракций, которые могут вам понадобиться.
Итак, мои простые вопросы: каковы лучшие практики в реализации объектно-ориентированного проектирования в C. Помните, я не спрашиваю, КАК это сделать. Этот и этот вопросы говорят об этом, и даже об этом есть книга . Что меня больше интересует, так это некоторые реалистичные советы / примеры, которые касаются реальных проблем, возникающих при этом.
Примечание: пожалуйста, не советуйте, почему C не следует использовать в пользу C ++. Мы хорошо прошли этот этап.
extern "C"
и мог использоваться из python. Вы можете сделать это вручную или воспользоваться SWIG . Так что стремление к интерфейсу Python - это не причина не использовать C ++. Это не так, говорят, что нет веских причин, чтобы хотеть остаться с C.