Типизация структур скрывает реализацию против pimpl-idiom - PullRequest
1 голос
/ 01 августа 2011

Я знаю о pimpl-идиоме, которая в C будет выглядеть примерно так:

// foobar.h
struct FooBar {
    char *someString;
    struct FooBarImpl *pImpl;
};
// foobar.c
struct FooBarImpl {
    char *hiddenString;
};

Тем не менее, с помощью Typecasting я могу избавиться от непрозрачного указателя и уменьшить шансы, которые кто-то путает с реализацией:

// foobar.h
struct FooBar {
    char *someString
};
// foobar.c
struct FooBarImpl {
    // FooBar members
    char *someString
    // FooBarImpl members
    char *hiddenString
};

В последнем случае любая функция, выполняющая операцию на FooBar, просто вводит тип FooBarImpl, чтобы получить доступ к «закрытым» членам.

Я вижу, как это может стать проблемой, если, например, кто-то добавит некоторый элемент в FooBar, но не сделает то же самое для FooBarImpl. Однако в моем случае FooBar будет содержать только одного члена и вряд ли изменится.

Будет ли это считаться хорошей практикой, или я должен просто придерживаться идиомы pimpl, когда я хочу скрыть детали реализации?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Компилятор твой друг;не изменяйте этому, используя явные типы типов, особенно между составными типами.Придерживайтесь первого метода, если вы заранее объявите структуру реализации, вам никогда не придется раскрывать ее содержимое.

0 голосов
/ 01 августа 2011

Вы должны быть очень осторожны при работе с кодом, который передается между структурами:

  1. Вы не можете создать массив FooBar или предоставить указатели на такие массивы для клиентского кода.
  2. Для присваивания или создания memcpy: структуры (а не их указатели) потребовалось бы присвоить FooBarImpl, а не FooBar - в противном случае специфичные для реализации данные будут обрезаны.
  3. Глядя на заголовки, пользователь библиотеки мог ошибочно предположить, что memcpying, назначая или создавая структуры FooBar, верны - в конце концов, все, что кажется, содержит базовые данные, которые можно легко заполнить.
...