, Они загрязнят Ваш код.
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
никогда не используют это . Вы более обеспокоены скоростью, чем с экономией 4 ints. Используя битовые поля на самом деле медленнее, чем доступ к любому другому типу.
Однако у разрядных участников в структурах есть практические недостатки. Во-первых, упорядочивание битов в памяти варьируется от компилятора до компилятора. Кроме того, много популярных компиляторов генерируют неэффективный код для чтения, и запись укусила участников , и существует потенциально серьезно проблемы потокобезопасности касающийся битовых полей (особенно в многопроцессорных системах) вследствие того, что большинство машин не может управлять произвольными наборами битов в памяти, но должно вместо этого загрузить и сохранить целые слова. например, следующее не было бы ориентировано на многопотоковое исполнение, несмотря на использование взаимного исключения
Источник: http://en.wikipedia.org/wiki/Bit_field :
И если Вам нужно больше причин для [1 135] не битовые поля использования, возможно , Raymond Chen убедит Вас в его Старая Новая Вещь Сообщение: анализ рентабельности битовых полей для набора булевских переменных в [1 111] http://blogs.msdn.com/oldnewthing/archive/2008/11/26/9143050.aspx
namespace RecordType {
static const uint8 xNew = 1;
static const uint8 xDeleted = 2;
static const uint8 xModified = 4;
static const uint8 xExisting = 8;
}
Помещение их в пространстве имен прохладно. Если они будут объявлены в Вашем CPP или заголовочном файле, то их значения будут встроены. Вы сможете использовать, включают те значения, но это немного увеличит связь.
А-ч, да: удаляют статическое ключевое слово . статичный удерживается от использования в C++ при использовании, как Вы делаете, и если uint8 будет типом здания, то Вам не будет нужно это для объявления этого в заголовке, включенном многочисленными источниками того же модуля. В конце код должен быть:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
проблема этого подхода состоит в том, что Ваш код знает значение Ваших констант, которое увеличивает немного связь.
то же как интервал константы, с несколько более сильным вводом.
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Они все еще загрязняют глобальное пространство имен, все же. Между прочим... Удаляют определение типа . Вы работаете в C++. Те определения типов перечислений и структур загрязняют код больше, чем что-либо еще.
результат отчасти:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
, Как Вы видите, Ваше перечисление загрязняет глобальное пространство имен. При помещении этого перечисления в пространство имен у Вас будет что-то как:
namespace RecordType {
enum Value { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
}
void doSomething(RecordType::Value p_eMyEnum)
{
if(p_eMyEnum == RecordType::xNew)
{
// etc.
}
}
, Если Вы хотите уменьшить связь (т.е. способность скрыть значения констант, и таким образом, измените их, как желаемый, не нуждаясь в полной перекомпиляции), можно объявить ints как экстерн в заголовке, и столь же постоянный в файле CPP, как в следующем примере:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
И:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Вы не сможете использовать, включают те константы, все же. Таким образом в конце, выберите свой яд... :-p
Я начну с предупреждения, что QuickBooks, вероятно, не лучший выбор для надежной внутренней базы данных, доступной с удаленного веб-сайта. На самом деле ... это, наверное, действительно очень плохой выбор.
У вас должна быть собственная база данных приложения, а затем, если вам нужно также обмениваться данными с QuickBooks, делайте это вне обычного жизненного цикла вашего приложения, как отдельный процесс синхронизации.
QuickBooks обычно недостаточно надежен для приложений, постоянно работающих в сети, по ряду причин:
С учетом сказанного ...
Да, вы можете создать веб-службу WCF, разместить ее на машине QuickBooks и сделайте так, чтобы ваш веб-сервис WCF ретранслировал сообщения в / из QuickBooks.
Да, вы также можете создать службу Windows, которая делает то же самое.
НЕ реализовывать его как службу Windows, а НЕ реализовывать его в IIS - вместо этого реализуйте его как приложение с графическим интерфейсом, которое работает вместе с QuickBooks.
Если вы попытаетесь реализовать что-то как служба Windows или в IIS, QuickBooks SDK требует, чтобы у вас был доступный графический интерфейс (он использует насос сообщений COM с графическим интерфейсом для отправки событий или что-то в этом роде ...) для обработки запросов, поэтому вы ' Мне, вероятно, потребуется использовать что-то вроде QBXMLRP2e.exe, чтобы преодолеть границу процесса между QuickBooks и вашей службой Windows / IIS без графического интерфейса. По моему опыту, это огромная боль в заднице, и она также требует исправления с разрешениями DCOM.
У меня есть пример и некоторая документация в моей вики по интеграции QuickBooks .
Форумы IDN - хорошее место, чтобы задать вопросы.
Я вам порекомендую:
ИЛИ