Является ли идиома pimpl, используемая в С#?

Я прихожу из фона С# и недавно начал изучать С++. Одна из вещей, с которыми я столкнулся, - это идиома прыгуна. Я занимался разработкой С# для некоторых крупных фирм, но никогда не сталкивался с этим.

Возможно, это неправильно, но я понимаю, что это необходимо в С++ из-за использования файлов заголовков и без частичного класса.

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

Я действительно не понимаю, почему то же самое нельзя делать с С++. Pimpl просто выглядит как уродливый хак для меня.

Ответы

Ответ 1

Является ли идиома pimpl, используемая в С#?

Это зависит от того, что вы подразумеваете под этой идиомой.

Идиома, по сути, заключается в том, чтобы разделить детали реализации типа на один класс и область общей поверхности в класс-оболочку, который просто удерживает указатель на класс реализации.

Это имеет два преимущества.

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

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

Первое преимущество не имеет значения в С#. Компилятор С# работает быстро. (В значительной степени, конечно, потому что язык был разработан для быстрой компиляции.)

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

Метод, который мне особенно нравится в С#, заключается в том, чтобы сделать публичный класс базовым классом частного вложенного класса, дать базовому классу частный конструктор для предотвращения расширения третьей стороны и использовать шаблон factory для раздачи экземпляров частный вложенный класс.

Я действительно не понимаю, почему то же самое нельзя делать с С++.

Затем я рекомендую вам попытаться написать компилятор С++, который сделает это. Вам удастся создать намного более быстрый компилятор С++, или вы узнаете, почему то же самое нельзя сделать на С++. Вы выигрываете в любом случае!

Ответ 2

Да, это ( "взломать" ). Это вызвано текстовой моделью компиляции для ANSI С++: компилятору необходимо увидеть текстовое представление кода, чтобы создать что-то полезное. Не то, чтобы это было так, но так, как это делается сегодня.

Ответ 3

Как отметил Эрик, идиома прыгуна имеет две цели. Я бы добавил, что вторая цель (разделяющий интерфейс и реализация) является одним из хорошо известных шаблонов проектирования программного обеспечения: Bridge (также известный как Handle/Body, который я думаю). Вы можете узнать больше об этом здесь