Борьба с C, прибывающим из Объектно-ориентированной земли? [закрытый]

let obj1 = [{
    'id': 1,
    'longString': 'Joe - 2011-04-23T18:25:23.511Z'
  },
  {
    'id': 2,
    'longString': 'Mary - 2010-04-23T18:25:23.511Z'
  }
];


const res = obj1.map(({
  id,
  longString
}) => ({
  id,
  name: longString.match(/\w+/)[0],
  date: longString.match(/\d+.*/)[0],
}))

console.log(res)

19
задан Community 23 May 2017 в 12:31
поделиться

10 ответов

Но в C, нет объектов. Я должен встроить все поведение своей структуры данных Очереди?

Нет.

Сделайте это.

  1. Определите свой класс однако, Вы чувствуете себя комфортно, делая дизайн OO.

  2. Запишите атрибуты своего класса как структура языка C.

  3. Помещенный, что структура в заголовочный файл, наряду со всеми функциями, которые воздействуют на ту структуру. Удостоверьтесь a MyStruct * self первый аргумент всем этим "функциям метода".

  4. Запишите модуль C со всеми телами функций метода.

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

Обычно постарайтесь не пытаться иметь частные переменные во-первых. У Вас нет полной мощности компилятора OO, не беспокойтесь функциями низкой стоимости как "частный" или "защищенный".

30
ответ дан 30 November 2019 в 02:03
поделиться

Я исправил бы S. Ответ Lott для использования непрозрачного указателя для выполнения сокрытия данных членов структуры:

  1. Определите свой класс однако, Вы хотите использовать нормальный дизайн OO.
  2. Членские переменные Вашего класса входят в структуру языка C.
  3. В заголовочном файле Вы не хотите выставлять членские переменные своего объекта (так как они были бы "частными" на языке OO). Вместо этого используйте непрозрачный указатель, т.е.
    typedef struct mystruct_s *mystruct_t; // first argument to all your methods
  4. Для всех методов Вы хотите быть "общедоступными", поместить их подписи в Ваш.h файл. Тела метода должны войти в.c файл, и "частные" методы должны быть только определены в.c файле и также объявлены статичные, таким образом, их символы не сталкиваются с символами, определенными в других файлах.

Умные соглашения о присвоении имен как символы нижнего подчеркивания являются ненужным использованием этого метода, но это означает, что все Ваши членские переменные будут частными. Функции могут быть государственными или частными, хотя государственные функции, они - часть глобального пространства имен, таким образом, Вы могли бы хотеть квалифицировать их имена с именем "пакета" как mystruct_push(), mystruct_pop(), и т.д.

Также необходимо прояснить, ответственны ли вызывающая сторона или библиотека за вызов malloc() и free(). Скорее всего, Вы будете иметь mystruct_t *create() и void destroy(mystruct_t *target) методы.

17
ответ дан 30 November 2019 в 02:03
поделиться

Можно все еще думать объектно-ориентированные с C.

Просто необходимо создать структуру и ряд функций, которые берут указатель на экземпляр той структуры как ее первый параметр.

Что касается полиморфизма, можно передать размер структуры как первый член структуры, таким образом, Вы знаете, как бросить его.

Существует большой PDF объектно-ориентированного программирования с ANSI-C здесь.

15
ответ дан 30 November 2019 в 02:03
поделиться

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

Я нашел, что, чтобы изучить, как создать объекты, было лучше думать о том, как они обратятся к вызывающей стороне. Тот же подход мог бы помочь Вам, идя другим путем. Рассмотрите то, на что был бы похож API к Вашему компоненту. Один хороший путь состоит в том, чтобы изучить существующие API C (я использовал стандартные API Java в качестве ряда примеров API OO).

Вы привыкли использовать компонент очереди что-то вроде этого:

import some.package.Queue;

Queue q = new Queue(); 
q.add(item);

В типичном API C Вы ожидали бы что-то больше как:

#include <queue.h> // provides queue, make_queue(), queue_add(), others

queue q = make_queue(); // queue is probably a struct, or a struct*
queue_add(q,item);

Каждый раз, когда Вы думаете в объектах, сделайте подобное преобразование.

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

Удачи!

4
ответ дан 30 November 2019 в 02:03
поделиться

Первоначально C++ был просто компилятором, который написал код C из источников C++; они были затем скомпилированы собственным компилятором C, связанным, и т.д.

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

  1. C++ "структура" был (вероятно, все еще), эквивалентный "классу" со всеми участниками "общественность".
  2. Функции членства могут быть реализованы как указатели функции в структуре; это может обеспечить инкапсуляцию и полиморфизм. Конструкторы существуют в глобальной области видимости, если Вы не используете фабрики. Деструкторы могут быть функциями членства.
  3. Используя функции членства средства доступа, как getColor (), setColor () может облегчить внутренние различия и обеспечить некоторое сокрытие данных. Если Вы действительно хотите, Вы могли бы использовать предложение Brian Bondy сокрытия с макросами.
  4. Существует на самом деле много библиотек FOSS, которые обеспечивают стандартные контейнеры - хеш-таблицы, динамические массивы, связанные списки, и т.д.
1
ответ дан 30 November 2019 в 02:03
поделиться

Проверьте Lua C API. Это был мой направляющий свет насколько C дизайн интерфейса идет. Каждая функция берет состояние Lua в качестве ведущего аргумента, который становится Вашим "это". Наследование немного более хитро, но Бурундуку удается сделать, довольно хорошее представление задания функционирует, которые принимают универсальную форму структуры и разрабатывают детали, из которых функция на самом деле вызвана через "klass". Можно часто использовать пусто*, чтобы иметь функции, берут различные типы (структуры) путем, Вы перегрузились бы в OO. Это может время от времени чувствовать немного hackish, но работает хорошо.

2
ответ дан 30 November 2019 в 02:03
поделиться

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

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

0
ответ дан 30 November 2019 в 02:03
поделиться

Можно сделать производные классы также с C:

Производные классы в C - Каков Ваш любимый метод?

0
ответ дан 30 November 2019 в 02:03
поделиться

используйте бойкий, c библиотека с ООП http://library.gnome.org/devel/glib/2.20/

0
ответ дан 30 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

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