Что такое виртуальный прокси?

#c# #java #design-patterns

#c# #java #шаблоны проектирования

Вопрос:

Согласно www.dofactory.com и www.blackwasp.com виртуальный прокси используется для представления упрощенной версии сложного объекта. Только когда требуется подробная информация об объекте, основной объект фактически заполняется, обеспечивая форму отложенной загрузки. Означает ли это, что всякий раз, когда мы используем отложенную загрузку, мы можем называть это виртуальным прокси? Есть ли другие причины, по которым мы должны его использовать, кроме случаев, когда мы используем дорогостоящий объект? Я не вижу этого отчетливо. Может кто-нибудь дать хорошее объяснение по этому поводу, пожалуйста?

Комментарии:

1. Я бы сказал, что хорошее использование виртуальных прокси довольно редко. Большинство прокси-серверов не являются виртуальными или кэширующими, отчасти из-за сложности, которую добавляет такая стратегия.

2. @PeterLawrey Вы когда-нибудь внедряли картографы данных и отложенную загрузку? С помощью картографов данных вы на самом деле никогда не используете отложенную загрузку?

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

Ответ №1:

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

Комментарии:

1. Это означает, что вы никогда не использовали отложенную загрузку? Вы всегда получаете полный объектный граф от картографов данных (только с необходимыми данными)?

2. Отложенная загрузка приводит к N 1 проблемам, поэтому я избегаю этого. Лучше четко указывать, что вы извлекаете.

3. Для меня иногда быстрее (или проще) создать некоторые объединения таблиц базы данных, а затем объединить их с другим select / join (затем заполнить объект). В подобных случаях, если реализованы прокси, это может избежать второго слияния запросов, поскольку оно уже существует в прокси (связь, которая выполняется в отдельном запросе). Вы когда-нибудь думали об этом сценарии? В этом случае нет никакой проблемы, поскольку разделение запросов происходит именно из-за производительности и времени отклика. Это также стоит протестировать, прежде чем углубляться в запросы, подобные тому, что сказал @PeterLawrey выше (quest.comment).