Обычно это код. Вот простой пример:
import java.util.*;
public class GarbageCollector {
public static void main(String... args) {
System.out.printf("Testing...%n");
List<Double> list = new ArrayList<Double>();
for (int outer = 0; outer < 10000; outer++) {
// list = new ArrayList<Double>(10000); // BAD
// list = new ArrayList<Double>(); // WORSE
list.clear(); // BETTER
for (int inner = 0; inner < 10000; inner++) {
list.add(Math.random());
}
if (outer % 1000 == 0) {
System.out.printf("Outer loop at %d%n", outer);
}
}
System.out.printf("Done.%n");
}
}
Использование java 1.6.0_24-b07 На 32-разрядной версии Windows 7.
java -Xloggc: gc.log GarbageCollector
Затем посмотрите на gc.log
Теперь предоставлено, это не лучший тест или лучший дизайн, но когда вы столкнулись с ситуацией, когда у вас нет выбора, кроме как реализовать такой цикл или при работе с существующим кодом, который ведет себя плохо, выбирая повторное использование объектов вместо создания новых может уменьшить количество сборов сборщика мусора на пути ...
Несколько моих любимых:
Стремитесь написать код, который является корректной константой. Вы включите в список компилятор для выручения сорняка, легкого зафиксировать только иногда болезненные ошибки. Ваш код также расскажет историю того, что Вы имели в виду в то время, когда Вы записали это - ценный для вновь прибывших или специалистов по обслуживанию, после того как Вы ушли.
Выйдите из бизнеса управления памятью. Учитесь использовать интеллектуальные указатели: std::auto_ptr
, std::tr1::shared_ptr
(или boost::shared_ptr
) и boost::scoped_ptr
. Изучите различия между ними и когда использовать один по сравнению с другим.
Вы, вероятно, собираетесь быть использованием Стандартной библиотеки шаблонов. Прочитайте книгу Josuttis. Только остановитесь после первых нескольких глав по контейнерам, думая, что Вы знаете STL. Продвиньте до хорошего материала: алгоритмы и функциональные объекты.
Хм - я, вероятно, должен был быть немного более конкретным.
Я не так ищу совет для меня - я пишу статический инструмент анализа кода (текущие коммерческие предложения просто не достаточно хороши для того, что я хочу), и я ищу идеи для плагинов для выделения возможных ошибок в коде.
Несколько человек упомянули вещи как правильность константы и использующий интеллектуальные указатели - это, отчасти думают, что я могу проверить на. Проверку добавление отступа и комментарий немного более трудно сделать (с точки зрения программирования так или иначе).
Интеллектуальные указатели имеют хороший способ указать на владение очень ясно. Если Вы - класс или функция:
Я нахожу случай для auto_ptr особенно сильным: в дизайне, если я вижу auto_ptr, я сразу знаю, что тот объект собирается "блуждать" от одной части системы к другому.
Это - по крайней мере, логика, которую я использую на своем любимом проекте. Я не уверен сколько изменений, там может быть по теме, но до сих пор этот ruleset служил мне хорошо.
Кроме того, для некоторых хороших методов Вы могли бы следовать блогу Google, "Тестирующему на Туалете".
Вот самый важный совет, который мне дал гуру C++, и он помог мне в нескольких критических случаях найти ошибки в своем коде:
С этими 2 правилами компилятор скажет Вам бесплатно, где в Вашем коде логика испорчена!
Я использую Линт ПК на своих проектах C++ и особенно как то, как он ссылается на существующие публикации, такие как инструкции MISRA или "Эффективный C++ Scott Meyers" и "Более эффективный C++". Даже если Вы - планирование записи очень подробных выравниваний для каждого правила Ваши проверки инструмента статического анализа, это - хорошая идея указать на установленные публикации, что Ваш пользователь доверяет.
Где Вы можете, использовать преинкремент вместо постинкремента.
В том же духе Вы могли бы найти некоторые полезные предложения здесь: Как Вы заставляете неверный код выглядеть неправильным? Какие шаблоны Вы используете для предотвращения семантических ошибок?
Существует также хорошее Руководство по стилю C++, используемое внутренне Google, который включает большинство правил, упомянутых здесь.
Только прокомментируйте, когда только необходимо объяснить, что делает код, где чтение кода не могло сказать Вам то же.
Не комментируйте код, который Вы не используете больше. Если Вы хотите восстановить старый код, используйте свою систему управления исходным кодом. Комментирование кода просто заставляет вещи выглядеть грязными, и делает Ваши комментарии, которые на самом деле важны, исчезают в фоновую путаницу прокомментированного кода.
Начните писать много комментариев - но использование, что как возможность осуществить рефакторинг код так, чтобы это было сам объяснительное.
т.е.:
for(int i=0; i<=arr.length; i++) {
arr[i].conf() //confirm that every username doesn't contain invalid characters
}
Должно было быть что-то больше как
for(int i=0; i<=activeusers.length; i++) {
activeusers[i].UsernameStripInvalidChars()
}
В то, если операторы помещают константу слева т.е.
if( 12 == var )
нет
if( var == 12 )
Beacause, если Вы избегаете вводить '=' затем, это становится присвоением. В главной версии в компиляторе говорится, что это не возможно в последнем, которого это выполняет и, если всегда верно.
Я использую фигурные скобки для if's каждый раз, когда они не находятся на той же строке.
if( a == b ) something();
if( b == d )
{
bigLongStringOfStuffThatWontFitOnASingleLineNeatly();
}
Открытые и близкие фигурные скобки всегда получают свои собственные строки. Но это - конечно, персональная конвенция.
Включите все предупреждения, можно стоять в компиляторе (gcc: -Wall
хорошее начало, но не включает все, так проверьте документы), и сделайте их ошибками, таким образом, необходимо зафиксировать их (gcc: -Werror
).
Руководство по стилю Google, упомянутое в одном из этих ответов, является довольно основательным. Существует некоторый бессмысленный материал в нем, но это более хорошо, чем плохо.
Sutter и Alexandrescu записали достойную книгу по этому предмету, названному Стандартами Кодирования C++.
Вот являются некоторые общие советы от небольшого ole мной:
Ваше добавление отступа и заключающий стиль в скобки является оба неправильным. Так все else's. Поэтому следуйте стандартам проекта для этого. Глотайте свою гордость и установите Вашего редактора так, чтобы все максимально согласовывалось с остальной частью кодовой базы. Это - действительно действительно раздражающая необходимость прочитать код, это располагается с отступом несовместимо. Тем не менее заключение в скобки и расположение с отступом не имеют ничего вообще, чтобы сделать с "улучшением Вашего кода". Это больше об улучшении Вашей способности работать с другими.
Комментарий хорошо. Это чрезвычайно субъективно, но в целом всегда хорошо записать комментарии о том, почему код работает способ, которым это делает, вместо того, чтобы объяснить, что это делает. Конечно, для сложного кода это также хорошо для программистов, которые не могут быть знакомы с алгоритмом или кодировать, чтобы иметь идею того, что это делает также. Ссылки на описания используемых алгоритмов очень приветствуются.
Выразите логику максимально простым способом. Иронически предложения как "помещенные константы на левой стороне сравнений" пошли не так, как надо здесь, я думаю. Они очень популярны, но для англоговорящих, они часто повреждают логический поток программы тем, которые читают. Если Вы не можете доверять себе (или Ваш компилятор), чтобы записать, что равенство выдерживает сравнение правильно, то любой ценой приемы использования как это. Но Вы жертвуете ясностью, когда Вы делаете это. Также подпадание под этой категории является вещами как... "Моя логика имеет 3 уровня добавления отступа? Это могло быть более просто?" и прокрутка подобного кода в функции. Возможно, даже разделение функций. Это берет опыт написать код, который изящно выражает базовую логику, но это стоит работать в нем.
Это было довольно общим. Для определенных подсказок я не могу сделать намного лучшего задания, чем Sutter и Alexandrescu.
Используйте вкладки для добавлений отступа, но выровняйте данные с пробелами, Это означает, что люди могут решить, сколько сделать отступ путем изменения размера вкладки, но также и этого, вещи остаются выровненными (например, Вы могли бы хотеть весь '=' в вертикальной строке, когда присваивают значения структуре),
Allways используют константы или подставляемые функции вместо макросов, где возможно
Никогда не используйте 'использование' в заголовочных файлах, потому что все, что включает ту телку, будет также затронуто, даже если человек includeing Ваш заголовок не захочет весь станд. (например), в их глобальном пространстве имен.
Если что-то длиннее, чем приблизительно 80 columes, разбейте его в несколько строк, например,
if(SomeVeryLongVaribleName != LongFunction(AnotherVarible, AString) &&
BigVaribleIsValid(SomeVeryLongVaribleName))
{
DoSomething();
}
Только операторы перегрузки, чтобы заставить их сделать, что пользователь ожидает, например, перегрузка + и - операторы для 2dVector, прекрасны
Всегда комментируйте свой код, даже если его только для высказывания, что делает следующий блок (например, "удаляют все структуры, которые не нужны для этого уровня"). Кто-то, возможно, должен работать с ним позже, возможно после отъезда, и они не хотят находить, что 1000-е строк кода без комментариев указывают на то, что делает что.