Должен ли я научиться внедрять ООП в C? Существуют ли проекты, которые используют ООП в C?

17

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

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

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

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

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

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

    
задан Andrew-Dufresne 24.07.2010 в 15:37
источник
  • Здесь есть несколько отличных ответов, с которыми я полностью согласен! –  Matt Joiner 24.07.2010 в 15:57

6 ответов

14

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

  1. Насколько «действительно ли он используется», ответ «да». Это не для умственных упражнений, это действительная парадигма в C.
  2. Лучший пример, который приходит на ум, - GObject , используемый GLib, GTK + и многими проектами, не связанными с GNOME. GObject предоставляет способ создания объектов на C. Однако нет необходимости использовать стороннюю поддержку для того, чтобы иметь OO в C. Многие существующие проекты имеют его, хотя он может и не присутствовать в интерфейсе (что, на мой взгляд, замечательно) и используется для различных целей (чистота, защита данных, все обычные обоснования OO).
  3. Рекомендуется использовать OOP в C, когда вы обнаружите необходимость группировать поведение и / или данные. Когда вы можете оправдать небольшие дополнительные синтаксические затраты при использовании интерфейса ваших объектов и время, потраченное на то, чтобы не завершить свое решение. Не заходите в сторону.
  4. Вам не следует тратить время на изучение OO, потому что вы думаете, что он превосходен, скорее он должен дополнять ваши будущие решения, и вы должны добавить его в свой инструментарий. Используйте его, когда кажется правильным. Ознакомьтесь с тем, как сделать OO на C, лучшим способом было бы сделать некоторые C ++ или изучить любой хороший проект, который использует небольшое OO C-стиля. После этого вам будет казаться естественным.
ответ дан Matt Joiner 24.07.2010 в 15:52
6
  

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

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

  

Являются ли их любыми существующими проектами C, использующими ООП?

Я могу запомнить пару:

  

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

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

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

  

Должен ли я вкладывать в него свое время?

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

  

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

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

    
ответ дан Stephen 24.07.2010 в 16:03
4

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

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

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

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

    
ответ дан SoapBox 24.07.2010 в 15:52
  • +1 для упоминания ядра Linux, отличный пример, о котором я забыл упомянуть. –  Matt Joiner 25.07.2010 в 04:13
3

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

Реальный язык «OO» предоставляет вам несколько механизмов для реализации дизайна OO: языки имеют встроенные концепции для объектов и / или классов, для инкапсуляции кода с данными, для наследования и т. д. C по существу ничто из этого, но нет ничего, что мешало бы вам выполнять программирование OO на C, учитывая некоторые методы и самодисциплину (как ваша книга, безусловно, говорит вам).

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

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

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

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

    
ответ дан Carl Smotricz 24.07.2010 в 15:54
  • Если вы управляете своей собственной памятью на C ++, вы почти наверняка делаете это неправильно. Это для RAII. –  Puppy 24.07.2010 в 16:28
  • Должен признаться, что я потерял следы C ++ около 10 лет назад. У меня есть «Accelerated C ++» Koenig и Moo на моей полке, и полностью половина из них касается того, как очистить ваши объекты после того, как вы закончите с ними. Кажется, это предшествовало std :: auto_ptr стандартной библиотеки, потому что выделение текста, казалось, было связано с тем, как создавать собственные интеллектуальные указатели. Но позволяют ли эти стандартизованные интеллектуальные указатели устранить все или большинство потенциальных возможностей самопроверки с утечкой объекта? –  Carl Smotricz 24.07.2010 в 16:46
  • +1 за то, что показывает, насколько уродливым C ++ является :) –  Matt Joiner 25.07.2010 в 04:13
2

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

Ссылка

    
ответ дан ceeit 24.07.2010 в 17:28
  • Проект ooc-lang упоминается в одном из комментариев блога. Не в самом блоге. Принял меня когда-нибудь, чтобы получить ссылку, и я тоже прочитал комментарии. В любом случае это ссылка ooc-lang –  Andrew-Dufresne 24.07.2010 в 18:56
0

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

    
ответ дан Puppy 24.07.2010 в 16:25
  • Но C ++ sux .... –  Matt Joiner 25.07.2010 в 04:14
  • @Matt Joiner: Только если вы не знаете, как его использовать. –  Puppy 25.07.2010 в 11:44
  • Нет, это только sux, если вы знаете, как его использовать. Если вы этого не сделаете, вы в восторге от этого. Также, если вы сосать, то вы думаете, что это sux. Но это не я;) –  Matt Joiner 25.07.2010 в 17:16