C для Объектно-ориентированного программиста

Вот незначительное обновление к Вашей реализации. Если Ваша попытка к выполнению чего-либо более подробного я предлагаю изучить NLTK что предложенный le dorfier.

Это могло бы только быть немного быстрее, так как ''.join () используется вместо + =, который является известен быть быстрее .

import string

d = "Hello, I'm a string!"

result = []
word = ''

for char in d:
    if char not in string.whitespace:
        if char not in string.ascii_letters + "'":
            if word:
                    result.append(word)
            result.append(char)
            word = ''
        else:
            word = ''.join([word,char])

    else:
        if word:
            result.append(word)
            word = ''
print result
['Hello', ',', "I'm", 'a', 'string', '!']

9
задан mcjabberz 20 September 2009 в 20:01
поделиться

7 ответов

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

Еще до того, как С ++ стал стандартом объектно-ориентированного программирования, в C.

Они включали определение структур с помощью указателя. для srtuct (обычно это называется ...) Затем определение функций-указателей в структуре и инициализация этих указателей на соответствующие функции во время выполнения. Все эти функции получили в качестве первого параметра указатель на структуру this.

1
ответ дан 4 December 2019 в 22:28
поделиться

Процедурный способ состоит в том, чтобы, с одной стороны, иметь ваши структуры данных, а с другой - ваши алгоритмы. Затем вы берете свои структуры данных и передаете их своим алгоритмам. Без инкапсуляции это требует несколько большей дисциплины, и если вы увеличите уровень абстракции, чтобы упростить выполнение этого правильно, вы выполните значительную часть объектно-ориентированного программирования на C.

4
ответ дан 4 December 2019 в 22:28
поделиться

Набор инструментов C состоит из функций, указателей на функции и макросов.

1
ответ дан 4 December 2019 в 22:28
поделиться

Don Не думаю, что C полностью ООП. Если вам нужно использовать C, вам следует изучить процедурное программирование. Выполнение этого не займет больше времени, чем изучение того, как реализовать все функции ООП в C.Более того, базовая инкапсуляция, вероятно, прекрасна, но многие другие функции ООП имеют накладные расходы на производительность, когда вы имитируете их (не когда язык разработан. для поддержки ООП). Накладные расходы могут быть огромными, если вы строго следуете методологии проектирования C ++ для представления каждой мелочи в виде объектов. У языков программирования есть определенные цели в дизайне. Когда вы нарушаете границы, вы всегда должны платить что-то в качестве стоимости.

1
ответ дан 4 December 2019 в 22:28
поделиться

Стандартный способ реализовать полиморфное поведение в C - использовать указатели на функции. Вы найдете множество C API (таких как стандартный qsort (3) и bsearch (3) ), которые принимают указатели на функции в качестве параметров; некоторые нестандартные, такие как qsort_r , принимают указатель на функцию и указатель context (в данном случае thunk ), который не служит другой цели, кроме как передаваться обратно в функцию обратного вызова. Указатель контекста работает точно так же, как указатель this в объектно-ориентированных языках, при работе с объектами функций (например, функторами).

См. Также:

0
ответ дан 4 December 2019 в 22:28
поделиться

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

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

Другой особенностью сбалансированного дерева было использование пустых указателей для хранения произвольных данных. Еще раз, Указатели на пустоты и функции в C - это боль (если вы не знаете их входов и выходов), но их можно использовать для приблизительного создания общей структуры данных.

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

Если вы хотите использовать C просто для овладения процедурной техникой, выберите задачу, которая хорошо подходит для процедурного подхода. У меня не было выбора (унаследованное приложение, написанное на C, и люди требуют мира и отказываются вступать в 21 век), поэтому мне пришлось проявить творческий подход. C отлично подходит для низких / средних абстракций от машины, скажем, если вы хотите написать программу проверки пакетов из командной строки.

Если вы хотите использовать C просто для овладения процедурной техникой, выберите задачу, которая хорошо подходит для процедурного подхода. У меня не было выбора (унаследованное приложение, написанное на C, и люди требуют мира и отказываются вступать в 21 век), поэтому мне пришлось проявить творческий подход. C отлично подходит для низких / средних абстракций от машины, скажем, если вы хотите написать программу проверки пакетов из командной строки.

0
ответ дан 4 December 2019 в 22:28
поделиться

Думаю, у вас есть хороший план. Делать что-то полностью объектно-ориентированным способом в C, хотя это вполне возможно, достаточно, чтобы вы в любом случае вскоре отказались от этого. (Не боритесь с языком.)

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

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

1
ответ дан 4 December 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: