Одна вещь, которая мне действительно нравится в 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());
Благодарю.
По крайней мере, на мой взгляд, если вам это нужно (или даже нужно), вы, вероятно, плохо структурируете свой код.
Интерес к сокрытию кода имеет тенденцию указывать на то, что вы можете собрать слишком много кода вместе, что может быть лучше разделить на более значимые функции или (обычно даже лучше) универсальные алгоритмы.
Я хотел бы углубиться в подробности и дать более конкретные советы о том, как можно улучшить некоторый код, но это трудно сделать, когда вопрос настолько общий, а в небольшом коде отсутствует какой-либо контекст, поэтому практически невозможно угадайте, что он представляет, и это первое, что вам нужно сделать, чтобы значительно его улучшить.
Тем не менее, я бы сказал, как правило, добавление блока без его контроля оператором управления потоком вполне разумно — но это обычно сделано для контроля времени жизни объекта — если вы хотите, чтобы что-то было создано и уничтожено, используйте объект 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));
Хотите ли вы сделать это, только вы, вероятно, можете сказать. Лично я думаю, что это будет зависеть от того, пишете ли вы похожий код в нескольких местах. Если это единственное место с таким кодом, я бы, вероятно, оставил его, но если вам нужен один и тот же код в двух (или более) местах, функция начинает приобретать гораздо больший смысл.
Других решений пока нет …