Должен ли я научиться реализовывать ООП в C? Есть ли проекты, которые используют ООП в C? - PullRequest
17 голосов
/ 24 июля 2010

Недавно я закончил читать K & R с его почти всеми упражнениями и примерами.Я планировал перейти на «Ускоренный C ++», с которым я столкнулся Книга Акселя Шрайнера ООП с ANSI-C.

Я заинтригован и хочу научиться этому.Но прежде чем тратить на это время, я хочу узнать, сколько стоит внедрить ООП на C. Чтобы я мог решить, сколько времени я должен на него потратить.

  1. Реализация ООП на C, действительно ли этоиспользуемый?Или это просто для умственных упражнений?
  2. Существуют ли в их существующих проектах C, которые используют ООП?
  3. Когда целесообразно использовать ООП в C?
  4. Должен ли я инвестироватьмое время в нем?

Я считаю уместным упомянуть мое прошлое здесь, чтобы вы, ребята, могли лучше направлять меня.Я закончил теорию C, C ++, Java и ООП около года назад, тоже получил работу.Но затем блог Джоэла и ТАК заставили меня понять, что мне не хватает многих вещей.Поэтому я снова взял книги и начал их правильно изучать.

K & R, Ускоренный C ++, Алгоритм на C ++ и некоторые другие книги - моя попытка улучшить свои навыки.Я не новичок в ООП.Так что бы вы предложили?

Спасибо за ваше время.

Ответы [ 6 ]

14 голосов
/ 24 июля 2010

OO используется в C так часто, как это необходимо.Как правило, я не согласен с мнением, что ООП в С не может быть выполнено, как только вы предоставите набор функций, которые работают с данным типом, у вас есть ООП.Возьмем, к примеру, вы решили создать структуру данных.Если вы предоставляете функции для создания, добавления, удаления и поиска элементов структуры данных, это ОО.Как правило, другие языки предоставляют синтаксический сахар, автоматически подразумевая переменную экземпляра и автоматически определяя область действия в различных свойствах этого экземпляра.

  1. Что касается "действительно ли он используется", то ответ - да.Это не для умственных упражнений, это действительная парадигма на C.
  2. Лучший пример, который приходит на ум, - GObject , используемый GLib, GTK + и многими проектами, не связанными с GNOME.GObject предоставляет способ построения объектов в C. Однако нет необходимости использовать стороннюю поддержку, чтобы иметь OO в C. Во многих существующих проектах она есть, хотя она может отсутствовать в интерфейсе (на мой взгляд, это здорово), ииспользуется для различных целей (чистота, защита данных, все обычные обоснования ОО).
  3. Рекомендуется использовать ООП в Си всякий раз, когда возникает необходимость сгруппировать поведения и / или данные.Когда вы можете оправдать небольшие дополнительные синтаксические затраты при использовании интерфейса объектов и время, потраченное на завершение решения.Не отвлекайтесь.
  4. Не стоит тратить время на изучение ОО, потому что вы думаете, что оно лучше, скорее оно должно дополнять ваши будущие решения, и вы должны добавить его в свой инструментарий.Используйте его, когда кажется, что это правильно.Познакомьтесь с тем, как выполнять ОО в С, лучшим способом было бы сделать немного С ++ или исследовать любой хороший проект, который использует небольшой ОО в стиле С.После этого вам покажется естественным.
6 голосов
/ 24 июля 2010

Реализация ООП в C, действительно ли она используется? Или это просто для умственных упражнений?

Да, он действительно используется, но неудивительно, что он не так распространен, как ООП в языках, которые были разработаны для него.

Существуют ли какие-либо существующие проекты C, использующие ООП?

Я помню, как использовал пару:

Когда стоит использовать ООП в C?

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

Вы должны использовать ООП, когда у вашей проблемы есть прекрасное решение ООП. Сноска о том, что вы не должны вставлять 100 строк ООП-кода в 15000-строчный проект, просто потому что это "kewl"! :)

Должен ли я тратить на это свое время?

Это действительно зависит от того, что вы планируете с ним делать. Я бы никогда не выступил за то, чтобы ничего не изучать - это здорово узнать, как, почему и когда его использовать. Замечательно видеть язык, который не был разработан для поддержки ООП. Вы читаете книгу, поэтому я предполагаю, что у вас есть некоторая близость к Си и интерес к ООП. Попробуйте, возможно, соберите несколько приложений с графическим интерфейсом в GTK +. С другой стороны, если вы хотите стать ведущим веб-разработчиком шаблонов проектирования, возможно, это не лучший подход, вы можете рассмотреть другие языки, которые в большей степени ориентированы на эту область.

Так что бы вы предложили?

Я бы посоветовал вам использовать лучшие инструменты в вашем распоряжении, которые соответствуют тем проблемам, которые вы пытаетесь решить. Решите, какую проблему вы собираетесь решить. Настольное приложение с графическим интерфейсом, веб-сервер, игра, утилита cmd line ... как только вы решите свою проблему, вы сможете лучше решить, какая технология подходит для разработки решения. Я обнаружил, что вы ничего не можете освоить с помощью «игрушек», поэтому вам нужно делать что-то настоящее.

4 голосов
/ 24 июля 2010

У меня был опыт работы с несколькими продвинутыми проектами на Си, которые хотя бы частично используют ООП.Наиболее известным является ядро ​​Linux.

Ядро целиком на C (за исключением специфических для платформы компонентов в сборке для аппаратных интерфейсов).

Ядро интенсивно использует структуры с указателями на функции вмного мест.Первое, что приходит на ум, это файловые системы.Драйверы заполняют структуру file_operations (как и многие другие) обратными вызовами для своих конкретных реализаций.

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

3 голосов
/ 24 июля 2010

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

Настоящий язык "OO" предоставляет вамГорстка механизмов для реализации ОО-дизайна: языки имеют встроенные концепции для объекта и / или классов, для инкапсуляции кода с данными, для наследования и так далее.По сути, в С этого ничего нет, но ничто не мешает вам заниматься ОО-программированием на С, учитывая некоторые приемы и самодисциплину (как, несомненно, говорит ваша книга).

Но хотите ли вы?

Мое мнение таково: если вы только учитесь делать ОО-программирование, возможно, имеет смысл научиться этому, будучи «держаться за руку» языком, который уже глубоко включает в себя концепции.Хорошо бы хорошо структурированный, простой и интерактивный язык: если бы у меня был свободный выбор, я бы порекомендовал Ruby, Python или Groovy.Учитывая язык со встроенной ОО-магией, это становится очень очевидным, когда вы делаете ОО-вещи и когда вы просто структурированы, дисциплинированы и хорошо организованы.При переходе с C на другой язык также может быть что-то, чему можно научиться: общие черты, различия.

Некоторые люди рекомендуют изучать C ++ как естественное развитие ОО от C. Я не от всей души поддерживаю это,потому что я считаю C ++ довольно уродливым использованием возможностей ОО на языке, который был уже более «практичным», чем элегантным.При переходе от «стандартного» программирования на С к ОО-программированию, я думаю, программисту следует подумать о том, чтобы, например, отказаться от прямого манипулирования указателями, и, конечно, я считаю обременительным управление памятью для моих данных.Современные ОО-языки автоматизируют это, так что у программиста остается больше клеток мозга для задач более высокого уровня.Привлекательность C ++, конечно же, - грубая скорость.Поскольку он может опуститься до уровня, близкого к металлическому, как C, он обычно является «самым быстрым» из ОО-языков.

Все это говорит: если у вас большой проект, где требуемый язык - C, и вы хотитеиспользовать и практиковать ОО-методы, тогда непременно идите вперед!Если нет, вы могли бы извлечь выгоду из изучения ОО в среде, которая поощряет и поддерживает это, и, возможно, позже вернетесь в С со своими знаниями о ОО.Методы, изложенные в книге, будут иметь для вас смысл, и вы сможете лучше решить, действительно ли вы хотите делать это на C или на «реальном» языке OO.

2 голосов
/ 24 июля 2010

Может быть, смотрите упомянутый здесь проект ooc-lang:

http://attractivechaos.wordpress.com/2009/09/20/oop-in-c-dont-go-too-far/

0 голосов
/ 24 июля 2010

Может быть, но без вызовов функций времени уничтожения, предоставляемых другими языками ООП, это не так полезно.Кроме того, если вам нужен ООП, всегда есть C ++, где ваш код практически мгновенно переносится на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...