Члены парламента, не занимающие официального поста в pimpl классе?

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

5
задан Anne 1 February 2010 в 16:36
поделиться

7 ответов

(defn foo [& xs]
  (let [big-xs (take 2 (sort-by - xs))]
    (reduce + (map * big-xs big-xs))))
-121--4605361-

Раздел хэша недоступен в SQL Server 2005/2008. Необходимо использовать секционирование диапазонов.

При этом следует иметь в виду, что секционирование является в первую очередь место хранения параметром, см. Концепции секционированных таблиц и индексов :

Секционирование делает большие таблицы или обеспечивает более управляемое , поскольку секционирование позволяет управлять и быстрый и быстрый доступ к подмножествам данных эффективно, при сохранении целостность сбора данных. Около использование секционирования, операция, такая как как загрузка данных из OLTP в система OLAP занимает всего несколько секунд, вместо минут и часов операция принимает в более ранних версиях SQL Server. Техническое обслуживание которые выполняются для подмножеств данных также выполняются более эффективно потому что эти операции предназначены только для данные, которые требуются, вместо весь стол.

Как вы видите, введение разбиения в MSDN сосредоточено на обслуживании, управляемости и загрузке данных. По моему опыту разделение дает, в лучшем случае, 0 усиления производительности. Специально в SQL 2005. Усуалы это дает ухудшение производительности. Для повышения производительности следует использовать правильный кластеризованный индекс и правильно разработанные некластеризованные индексы.

В SQL 2008 имеются улучшения в параллельных операторах в отношении разделов, если они правильно распределены с точки зрения ввода-вывода, см. Проектирование разделов для повышения производительности запросов . Их преимущества незначительны, хотя и омрачаются преимуществами правильно разработанного набора кластеризованных и некластеризованных индексов. Случай точки кластеризованного индекса в (id, topic_id), где id является идентификатором, полезен исключительно для поиска одного предмета по id. С другой стороны, кластеризованный индекс по (topic_id, id) будет полезен для любых запросов, которые ищут определенные темы. Я не знаю ваши системные требования и запросы, которые вы выполняете, но проблемы с производительностью 10M строк в такой узкой таблице пахнут индексацией и запросами, без проблем с секционированием.

-121--4859603-

Я думаю, что люди путают идиому Pimpl с шаблонами адаптера/моста/стратегии . Идиомы специфичны для языка. Узоры могут применяться ко многим языкам.

Идиома Pimpl была разработана для решения следующей проблемы в C++: Частные члены класса видны в объявлении класса, что добавляет пользователю класса ненужные зависимости # include. Этот идиом также известен как брандмауэр компилятора .

Если реализация записана непосредственно в соответствующем * .cpp-файле внешнего класса и недоступна вне модуля, то я думаю, что она прекрасно подходит для простого использования структуры для класса Pimpl . Для дальнейшего повторного применения идеи о том, что реализации не предназначены для прямого повторного использования, я определяю их как частную внутреннюю структуру:

// foo.h
class Foo : boost::noncopyable
{
public:
   ...

private:
   struct Impl;
   boost::scoped_ptr<Impl> impl_;
};

// foo.cpp
struct Foo::Impl
{
   // Impl method and member definitions
};

// Foo method definitions

Как только появится файл заголовка для класса реализации, я думаю, что мы больше не говорим об идиоме Pimpl. Речь идет скорее об адаптере, мосте, стратегии, интерфейсных классах и т.д.

Только мои 2 цента.

11
ответ дан 18 December 2019 в 06:34
поделиться

Потому что private означает лучшую инкапсуляцию данных.

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

class Interface;

class Concrete { public: .... private: Interface* m_interface; }

class ConcreteFoo: public Interface {};

Главное преимущество: вы можете в любой момент поменяться на другой ConcreteBar. Фактически, это комбинация шаблона Pimpl и Strategy, и конструктор ConcreteBar вызовет Factory, который будет ответственен за обслуживание эффективного объекта.

Если вы не можете придумать второй способ реализации сердца, просто инкапсулируйте его в класс. Таким образом, если позже вам придётся рефакторить, то вам просто придётся составить абстрактный Интерфейс с точно таким же набором методов, изменить несколько указателей (и конструктор), и всё будет в порядке ;)

.
0
ответ дан 18 December 2019 в 06:34
поделиться

Теоретические класс Pimpl по-прежнему просто класс, как и любой другой. Что это бетонная реализация интерфейса не означает, что другой код не является клиентом самого класса Pimpl.

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

4
ответ дан 18 December 2019 в 06:34
поделиться

Зависит от вашей реализации pImpl - именно там, где вы применяете инвариант класса, но в целом я не вижу необходимости в том, чтобы часть имплантата имела защищенные/частные члены. На самом деле, я обычно объявляю его структурой.

6
ответ дан 18 December 2019 в 06:34
поделиться

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

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

2
ответ дан 18 December 2019 в 06:34
поделиться

Единственная причина, по которой я действительно могу думать о том. это защитить себя от самого себя

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

1
ответ дан 18 December 2019 в 06:34
поделиться

Вероятно, вы смотрите на образец «огонь и забыть». Вот несколько ссылок.

http://weblogs.asp.net/albertpascual/archive/2009/05/14/fire-and-forget-class-for-asp-net.aspx

http://haacked.com/archive/2009/01/09/asynchronous-fire-and-forget-with-lambdas.aspx

http://www.eggheadcafe.com/articles/20060727.asp

надеюсь, что это поможет

-121--1642815-

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

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

-121--2823069-

(Я неправильно понял вопрос, поэтому я меняю свой ответ.)

Класс реализации, на который указывает класс с pimpl, должен быть обычным классом, с такими же причинами, чтобы скрыть личные детали, как и любой другой. На самом деле, это часто уже существующий класс, с pimpl слой добавлен позже, чтобы разорвать зависимости и, возможно, упростить интерфейс немного.

0
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

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