Хорошо, из того, что вы сказали, у вас есть что-то вроде структуры:
while (row!=NULL) {
if (!x) {
GetNextRow();
continue;
}
else {
SetType(someType);
SetValue(someValue);
}
if (!y) {
GetNextRow();
continue;
}
else {
SetType(SomeOtherType);
SetValue(someOtherValue);
}
// ...
GetNextRow();
}
Если это действительно так, я бы избавился от всех GetNextRow
вызовов, кроме последнего. Я бы тогда структурировал код примерно так:
while (row != NULL) {
if (x) {
SetType(someType);
SetValue(someValue);
}
else if (y) {
SetType(someOtherType);
SetValue(SomeOtherValue);
}
// ...
GetNextRow();
}
Редактировать: Другая возможность - написать код в виде цикла:
for (;row!=NULL;GetNextRow()) {
if (!x)
continue;
SetTypeAndValue();
if (!y)
continue;
SetTypeandValue();
// ...
Поскольку вызов GetNextRow
теперь является частью самого цикла, нам не нужно (явно) вызывать его каждый раз - сам цикл позаботится об этом. Следующим шагом (если у вас их достаточно, чтобы это стоило того) будет работа над сокращением кода для установки типов и значений. Одна из возможностей будет использовать специализацию шаблона:
// We never use the base template -- it just throws to indicate a problem.
template <class T>
SetValue(T const &value) {
throw(something);
}
// Then we provide a template specialization for each type we really use:
template <>
SetValue<int>(int value) {
SetType(VT_INT);
SetValue(value);
}
template <>
SetValue<float>(float value) {
SetType(VT_FLOAT);
SetValue(value);
}
Это позволяет объединить пару вызовов для установки типа и значения в один вызов.
Редактировать: Что касается обработки сокращения, это зависит от того, является ли анализ столбца дорогостоящим (достаточно, чтобы о нем заботиться), вы можете просто вкладывать свои условия:
if (x) {
SetTypeAndValue();
if (y) {
SetTypeAndValue();
if (z) {
SetTypeAndValue();
и так далее. Основным недостатком этого является то, что он будет довольно глубоко вложенным, если (как вы сказали) у вас более 20 условий в одном цикле. В таком случае, я бы, наверное, задумался над версией для цикла for, которую я дал выше.