Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

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

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

Ответ 6

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