Использование фигурных скобок для разделения кода в переполнении стека

Одна вещь, которая мне действительно нравится в IDE — это возможность «минимизировать» участки кода, чтобы:

while(conditions){
// Really long code...
}

Может стать:

while(conditions){ // The rest is hidden

У меня вопрос, будет ли что-то подобное приемлемым форматированием?

// Code
{
// More code
}
// Code

Я понимаю, что все, что делается внутри скобок, будет иметь такую ​​ограниченную область, но я также могу редактировать переменные во внешней области.

Итак, для краткого, ненужного примера

int x = 1;
{ // Create new variable, add and output
int y = 2;
cout << x + y;
}

Станет:

int x = 1;
{ // Create new variable, add and output (The rest of the code is hidden)

Так будет ли это приемлемым или избегать?

Вот реальный пример того, что я хотел бы просто спрятать.

/// Add line to msg vector
// Check to see if each side X is needed
if(uniqueSide && line == 1){
// Create stringstream to hold string and int (e.g. "Message " + 1 + " - Side " + 1
stringstream tempString;
// Add full line to stringstream. validMessages.length() + 1 will make Message X be incremental
tempString << "Message " << (validMessages.length() + 1) << " - Side " << numSide;
// Then append full string (e.g. "Message 1 - Side 1") to msg
msg.append(tempString.str());
}
// Else just add Message X using same method as above
else if(line == 1){
stringstream tempString;
tempString << "Message " << (validMessages.length() + 1);
}

// Add each line to msg vector with double space indent and (width) before each line
stringstream tempString;
tempString << setprecision(5) // Makes width be output as 10.325 or 100.33
<< "  (" << width << ") " << tempInput
msg.append(tempString.str());

Благодарю.

1

Решение

По крайней мере, на мой взгляд, если вам это нужно (или даже нужно), вы, вероятно, плохо структурируете свой код.

Интерес к сокрытию кода имеет тенденцию указывать на то, что вы можете собрать слишком много кода вместе, что может быть лучше разделить на более значимые функции или (обычно даже лучше) универсальные алгоритмы.

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

Тем не менее, я бы сказал, как правило, добавление блока без его контроля оператором управления потоком вполне разумно — но это обычно сделано для контроля времени жизни объекта — если вы хотите, чтобы что-то было создано и уничтожено, используйте объект RAII и поместите его в блок, поэтому, когда выполнение выйдет из блока, оно будет уничтожено автоматически.

Изменить: По крайней мере для меня, ваш образец выглядит зрелым (запоздалым?) Для серьезного рефакторинга.

/// Add line to msg vector
// Check to see if each side X is needed
if(uniqueSide && line == 1){
// Create stringstream to hold string and int (e.g. "Message " + 1 + " - Side " + 1
stringstream tempString;
// Add full line to stringstream. validMessages.length() + 1 will make Message X be incremental
tempString << "Message " << (validMessages.length() + 1) << " - Side " << numSide;
// Then append full string (e.g. "Message 1 - Side 1") to msg
msg.append(tempString.str());
}
// Else just add Message X using same method as above
else if(line == 1){
stringstream tempString;
tempString << "Message " << (validMessages.length() + 1);
}

Прямо сейчас, ваш else пункт на самом деле ничего не делает (помещает что-то в tempString, но это локально, поэтому оно исчезает при выходе из блока. Давайте предположим, что комментарий правильный, поэтому остальное должно иметь:

    msg.append(tempString.str());

прежде чем он выйдет. В этом случае две части кода достаточно похожи, так что они должны быть (в основном) объединены:

stringstream tempString;
tempString << Message << validMesssages.length()+1;
if (uniqueSide && line == 1)
tempString << " - Side " << numSide;
msg.append(tempString.str());

Затем, поскольку последняя часть этого выполняется безоговорочно, мы можем объединить оставшуюся часть кода с предыдущим (и в процессе совсем немного исключить, чтобы мы получили что-то вроде этого:

stringstream tempString;
if (line == 1) {
tempString << "Message " << validMesssages.length()+1;
if (uniqueSide) tempString << " - Side " << numSide;
}
tempString << setprecision(5) << " ( " << width << " ) " << tempInput;
msg.append(tempString.str());

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

msg.append(msg(line, validMessages, uniqueSide, numSide, width, tempInput));

Хотите ли вы сделать это, только вы, вероятно, можете сказать. Лично я думаю, что это будет зависеть от того, пишете ли вы похожий код в нескольких местах. Если это единственное место с таким кодом, я бы, вероятно, оставил его, но если вам нужен один и тот же код в двух (или более) местах, функция начинает приобретать гораздо больший смысл.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector