Инструкции для улучшения кода

Обычно это код. Вот простой пример:

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

  • Запущено 444 раза с использованием метода BAD
  • Запущено 666 раз с использованием метода WORSE
  • Триггер 354 раза с использованием метода BETTER
  • g2]

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

10
задан Madara Uchiha 28 March 2016 в 14:21
поделиться

21 ответ

Несколько моих любимых:

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

Выйдите из бизнеса управления памятью. Учитесь использовать интеллектуальные указатели: std::auto_ptr, std::tr1::shared_ptr (или boost::shared_ptr) и boost::scoped_ptr. Изучите различия между ними и когда использовать один по сравнению с другим.

Вы, вероятно, собираетесь быть использованием Стандартной библиотеки шаблонов. Прочитайте книгу Josuttis. Только остановитесь после первых нескольких глав по контейнерам, думая, что Вы знаете STL. Продвиньте до хорошего материала: алгоритмы и функциональные объекты.

9
ответ дан 3 December 2019 в 13:16
поделиться

удостоверьтесь Вы отступ правильно

0
ответ дан 3 December 2019 в 13:16
поделиться

Хм - я, вероятно, должен был быть немного более конкретным.

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

Несколько человек упомянули вещи как правильность константы и использующий интеллектуальные указатели - это, отчасти думают, что я могу проверить на. Проверку добавление отступа и комментарий немного более трудно сделать (с точки зрения программирования так или иначе).

0
ответ дан 3 December 2019 в 13:16
поделиться

Интеллектуальные указатели имеют хороший способ указать на владение очень ясно. Если Вы - класс или функция:

  • если Вы получаете необработанный указатель, Вы ничем не владеете. Вам разрешают использовать пуант, любезность Вашей вызывающей стороны, которая гарантирует, что пуант останется в живых дольше, чем Вы.
  • если Вы получаете weak_ptr, Вы не владеете пуантом, и к тому же пуант может исчезнуть в любое время.
  • если Вы получаете shared_ptr, Вы владеете объектом вместе с другими, таким образом, Вы не должны волноваться. Меньше напряжения, но также и меньше управления.
  • если Вы получаете auto_ptr, Вы - единственный владелец объекта. Это Ваше, Вы - король. Вы имеете право уничтожать тот объект или давать его кому-то еще (таким образом, проигрывающее владение).

Я нахожу случай для auto_ptr особенно сильным: в дизайне, если я вижу auto_ptr, я сразу знаю, что тот объект собирается "блуждать" от одной части системы к другому.

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

0
ответ дан 3 December 2019 в 13:16
поделиться

Посмотрите на него шесть месяцев спустя

1
ответ дан 3 December 2019 в 13:16
поделиться

Кроме того, для некоторых хороших методов Вы могли бы следовать блогу Google, "Тестирующему на Туалете".

1
ответ дан 3 December 2019 в 13:16
поделиться

Вот самый важный совет, который мне дал гуру C++, и он помог мне в нескольких критических случаях найти ошибки в своем коде:

  • Используйте методы константы, когда метод, как будет предполагаться, не изменит объект.
  • Используйте ссылки константы и указатели в параметрах, когда объект, как будет предполагаться, не изменит объект.

С этими 2 правилами компилятор скажет Вам бесплатно, где в Вашем коде логика испорчена!

1
ответ дан 3 December 2019 в 13:16
поделиться

Я использую Линт ПК на своих проектах C++ и особенно как то, как он ссылается на существующие публикации, такие как инструкции MISRA или "Эффективный C++ Scott Meyers" и "Более эффективный C++". Даже если Вы - планирование записи очень подробных выравниваний для каждого правила Ваши проверки инструмента статического анализа, это - хорошая идея указать на установленные публикации, что Ваш пользователь доверяет.

1
ответ дан 3 December 2019 в 13:16
поделиться

Где Вы можете, использовать преинкремент вместо постинкремента.

1
ответ дан 3 December 2019 в 13:16
поделиться
1
ответ дан 3 December 2019 в 13:16
поделиться
  1. Используйте последовательное форматирование.
  2. Когда работа над унаследованным кодом использует существующий стиль форматирования, особенно заключает в фигурные скобки стиль.
  3. Получите копию книги Scott Meyer Эффективный C++
  4. Получите копию Завершенного книжного кода Steve MConnell.
3
ответ дан 3 December 2019 в 13:16
поделиться

Существует также хорошее Руководство по стилю C++, используемое внутренне Google, который включает большинство правил, упомянутых здесь.

3
ответ дан 3 December 2019 в 13:16
поделиться
  1. конвенция кодирования установки и делает, все вовлеченные следуют конвенции (Вы не хотели бы читать код, которые требуют, чтобы Вы выяснили, где следующий оператор/выражение то, потому что это не располагается с отступом правильно),
  2. постоянно рефакторинг Вашего кода (получают копию Рефакторинга, Martin Fowler, за и против, детализирован в книге),
  3. напишите слабо связанный код (постарайтесь не писать комментарий путем написания очевидного кода, слабо связанный код имеет тенденцию быть легче управлять/адаптировать измениться),
  4. если это возможно, модульный тест Ваш код (или если Вы являетесь достаточно мужественными, TDD.)
  5. выпустите рано, часто выпускайте
  6. избегайте преждевременной оптимизации (профилирование помогает в оптимизации),
1
ответ дан 3 December 2019 в 13:16
поделиться

Только прокомментируйте, когда только необходимо объяснить, что делает код, где чтение кода не могло сказать Вам то же.

Не комментируйте код, который Вы не используете больше. Если Вы хотите восстановить старый код, используйте свою систему управления исходным кодом. Комментирование кода просто заставляет вещи выглядеть грязными, и делает Ваши комментарии, которые на самом деле важны, исчезают в фоновую путаницу прокомментированного кода.

4
ответ дан 3 December 2019 в 13:16
поделиться

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

т.е.:

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()
}
2
ответ дан 3 December 2019 в 13:16
поделиться

В то, если операторы помещают константу слева т.е.

if( 12 == var )

нет

if( var == 12 )

Beacause, если Вы избегаете вводить '=' затем, это становится присвоением. В главной версии в компиляторе говорится, что это не возможно в последнем, которого это выполняет и, если всегда верно.

Я использую фигурные скобки для if's каждый раз, когда они не находятся на той же строке.

if( a == b ) something();
if( b == d )
{
    bigLongStringOfStuffThatWontFitOnASingleLineNeatly();
}

Открытые и близкие фигурные скобки всегда получают свои собственные строки. Но это - конечно, персональная конвенция.

4
ответ дан 3 December 2019 в 13:16
поделиться

Включите все предупреждения, можно стоять в компиляторе (gcc: -Wall хорошее начало, но не включает все, так проверьте документы), и сделайте их ошибками, таким образом, необходимо зафиксировать их (gcc: -Werror).

7
ответ дан 3 December 2019 в 13:16
поделиться

Руководство по стилю Google, упомянутое в одном из этих ответов, является довольно основательным. Существует некоторый бессмысленный материал в нем, но это более хорошо, чем плохо.

Sutter и Alexandrescu записали достойную книгу по этому предмету, названному Стандартами Кодирования C++.

Вот являются некоторые общие советы от небольшого ole мной:

  1. Ваше добавление отступа и заключающий стиль в скобки является оба неправильным. Так все else's. Поэтому следуйте стандартам проекта для этого. Глотайте свою гордость и установите Вашего редактора так, чтобы все максимально согласовывалось с остальной частью кодовой базы. Это - действительно действительно раздражающая необходимость прочитать код, это располагается с отступом несовместимо. Тем не менее заключение в скобки и расположение с отступом не имеют ничего вообще, чтобы сделать с "улучшением Вашего кода". Это больше об улучшении Вашей способности работать с другими.

  2. Комментарий хорошо. Это чрезвычайно субъективно, но в целом всегда хорошо записать комментарии о том, почему код работает способ, которым это делает, вместо того, чтобы объяснить, что это делает. Конечно, для сложного кода это также хорошо для программистов, которые не могут быть знакомы с алгоритмом или кодировать, чтобы иметь идею того, что это делает также. Ссылки на описания используемых алгоритмов очень приветствуются.

  3. Выразите логику максимально простым способом. Иронически предложения как "помещенные константы на левой стороне сравнений" пошли не так, как надо здесь, я думаю. Они очень популярны, но для англоговорящих, они часто повреждают логический поток программы тем, которые читают. Если Вы не можете доверять себе (или Ваш компилятор), чтобы записать, что равенство выдерживает сравнение правильно, то любой ценой приемы использования как это. Но Вы жертвуете ясностью, когда Вы делаете это. Также подпадание под этой категории является вещами как... "Моя логика имеет 3 уровня добавления отступа? Это могло быть более просто?" и прокрутка подобного кода в функции. Возможно, даже разделение функций. Это берет опыт написать код, который изящно выражает базовую логику, но это стоит работать в нем.

Это было довольно общим. Для определенных подсказок я не могу сделать намного лучшего задания, чем Sutter и Alexandrescu.

5
ответ дан 3 December 2019 в 13:16
поделиться
  • Используйте и осуществите общий стиль кодирования и инструкции. Объяснение: Каждый разработчик в команде или в фирме может прочитать код без отвлекающих факторов, которые могут произойти из-за различных стилей фигурной скобки или подобный.
  • Регулярно делайте полное восстанавливает Вашей всей исходной базы (т.е. сделайте ежедневные сборки или сборки после каждой регистрации), и сообщите о любых ошибках! Объяснение: источник находится почти всегда в применимом состоянии, и проблемы обнаруживаются вскоре после того, как они "реализованы", где решение задач является дешевым.
7
ответ дан 3 December 2019 в 13:16
поделиться
  1. Удалите ненужный код.

Это - все.

9
ответ дан 3 December 2019 в 13:16
поделиться
  • Используйте вкладки для добавлений отступа, но выровняйте данные с пробелами, Это означает, что люди могут решить, сколько сделать отступ путем изменения размера вкладки, но также и этого, вещи остаются выровненными (например, Вы могли бы хотеть весь '=' в вертикальной строке, когда присваивают значения структуре),

  • Allways используют константы или подставляемые функции вместо макросов, где возможно

  • Никогда не используйте 'использование' в заголовочных файлах, потому что все, что включает ту телку, будет также затронуто, даже если человек includeing Ваш заголовок не захочет весь станд. (например), в их глобальном пространстве имен.

  • Если что-то длиннее, чем приблизительно 80 columes, разбейте его в несколько строк, например,

    if(SomeVeryLongVaribleName != LongFunction(AnotherVarible, AString) &&
       BigVaribleIsValid(SomeVeryLongVaribleName))
    {
        DoSomething();
    }
    
  • Только операторы перегрузки, чтобы заставить их сделать, что пользователь ожидает, например, перегрузка + и - операторы для 2dVector, прекрасны

  • Всегда комментируйте свой код, даже если его только для высказывания, что делает следующий блок (например, "удаляют все структуры, которые не нужны для этого уровня"). Кто-то, возможно, должен работать с ним позже, возможно после отъезда, и они не хотят находить, что 1000-е строк кода без комментариев указывают на то, что делает что.

1
ответ дан 3 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: