Один из элементов контрольного списка Стива Макконнелла состоит в том, что вам не следует обезьяна с индексом цикла (Глава 16, стр. 25, Индексы циклов, PDF формат).
Это делает интуитивный смысл и является практикой, которую я всегда соблюдал, за исключением, может быть, когда я научился программировать в тот же день.
В недавнем обзоре кода я нашел этот неудобный цикл и сразу же пометил его как подозреваемого.
for ( int i=0 ; i < this.MyControl.TabPages.Count ; i++ )
{
this.MyControl.TabPages.Remove ( this.MyControl.TabPages[i] );
i--;
}
Это почти забавно, так как ему удается работать, сохраняя индекс в ноль до тех пор, пока все вкладки не будут удалены.
Этот цикл мог быть записан как
while(MyControl.TabPages.Count > 0)
MyControl.TabPages.RemoveAt(0);
И поскольку элемент управления был фактически написан примерно в то же время, что и цикл, он даже мог быть записан как
MyControl.TabPages.Clear();
С тех пор мне бросили вызов проблеме проверки кода и обнаружили, что моя артикуляция , почему это плохая практика, была не такой сильной, как мне бы хотелось. Я сказал, что сложнее понять поток цикла и, следовательно, сложнее поддерживать и отлаживать и в конечном итоге дороже в течение всего срока службы кода.
Есть ли лучшая артикуляция, почему это плохая практика?