Как Вы удостоверяетесь как программист запись качества C код?

Вы можете использовать черты типа, чтобы проверить, является ли некоторый тип специализацией span или std::array. Это работает для меня:

#include 

template class span;

template 
struct is_array : std::false_type { };
template 
struct is_array> : std::true_type { };

template 
struct is_span : std::false_type { };
template 
struct is_span> : std::true_type { };

template 
concept bool NotSpanNotArray = !is_array::value && !is_span::value;

template class span {
public:
  template constexpr span(T& cont);
  // template constexpr span(const T& cont);
};

Рабочая демонстрация: https://wandbox.org/permlink/M0n60U8Hl4mpacuI

Просто я не уверен на 100%, является ли такой Решение соответствует тому, что участвуют в разрешении перегрузки тогда и только тогда, когда требуется. Некоторые юристы могут прояснить это.


ОБНОВЛЕНИЕ

Я только что понял, что std::is_array работает только для «обычных» массивов, а не std::array. Поэтому я добавил также особенность типа is_array.

8
задан Wouter van Nifterick 20 January 2009 в 09:53
поделиться

11 ответов

Включите предупреждения в своем компиляторе. С gcc я использую эти флаги:

-std=c99 -pedantic -Wall -Wextra -Werror -Wmissing-prototypes
-Wmissing-declarations -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings
-Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wconversion
-Wstrict-prototypes

Если Ваш код не может быть изменен для не создания предупреждений, отбросьте -Werror или не используйте определенный флаг, производящий предупреждение.

10
ответ дан 3 November 2019 в 12:28
поделиться

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

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

  • Правильность (это работает согласно спецификации?)
  • Надежность (de пользователь может зависеть от него?)
  • Устойчивость (это работает в неожиданных ситуациях?)
  • Производительность (это делает задание достаточно быстро для пользователя?)
  • Удобство использования (действительно ли это удобно для пользователя?)
  • Verifiability (его свойства могут быть verfified легко?)
  • Пригодность для обслуживания (модификации могут быть сделаны легко?)
    • Ремонтопригодность (дефекты могут быть починены в течение разумного срока?)
    • Способность к развитию (новая функциональность может быть добавлена просто?)
  • Возможность многократного использования (код может легко использоваться в других проектах?)
  • Мобильность (это может работать легко в различных средах?)
  • Понятность (специалисты по обслуживанию могут легко понять это?)
  • Interoperatability (как хорошо это сотрудничает?)
  • Производительность (efficienct и производительная доставка)
  • Своевременность (способность поставить вовремя)
  • Видимость (все шаги документируются ясно?)
11
ответ дан 3 November 2019 в 12:28
поделиться

Существует много аспектов по качеству кода и тоннам статей, книг, блогов

но я могу совет Вы это как начало:

Завершенный код

Безопасный код

4
ответ дан 3 November 2019 в 12:28
поделиться

Традиционно, люди использовали линт для выручения с этим.

7
ответ дан 3 November 2019 в 12:28
поделиться

Трудно видеть Ваше собственное сам, пишете ли Вы качественный код, уверенный, что существуют тонны автоматизации и стандартов там, но как можно применить все, что они видели там?

Это - то, где я - большой поклонник экспертной оценки как метод оценки качества кода. Позвольте другому видеть (и также учитесь) из Вашего кода, и это будет судьей качества.

1
ответ дан 3 November 2019 в 12:28
поделиться

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

С точки зрения правил

  • Не полагайте, что входные данные - проверяют все, размер, вводят, содержание.
  • Защитите от переполнения буфера - strcat, и многие другие не в безопасности.
  • Действительно используйте поблочное тестирование, ddj статья.
  • Действительно рассмотрите свой код кем-то еще
  • Не делайте предположения.
  • Действительно сохраните функции короткими, и протестируйте каждого полностью.
  • Используйте понятные имена.
  • Напишите читаемый код.
  • Не будьте ленивы - если необходимо измениться, что-то для создания этого более значимым затем делают это как можно скорее.

Править: Характерный для C, этот список глюков C является существенным чтением, и даже при том, что это для C++, стоит пройти C++ CERT Безопасный Стандарт Кодирования

4
ответ дан 3 November 2019 в 12:28
поделиться

Люди до сих пор упомянули инструменты. Однако после определенного предела, существует действительно только одна вещь, которую можно сделать для реального улучшения качества кода, который Вы пишете:

Напишите код.

1
ответ дан 3 November 2019 в 12:28
поделиться

Предыдущее обсуждение, what-are-some-good-resources-for-learning-c-beyond-kr, могло бы указать на больше (книги) на примеры.

2
ответ дан 3 November 2019 в 12:28
поделиться

Запишите модульные тесты!

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

Я сказал бы, что надлежащие модульные тесты являются № 1 способ гарантировать качество любого кода. Можно использовать все инструменты статического анализа и кодировать обзоры, которые Вы хотите, но ничто не бьет на самом деле выполнение кода и проверку результатов.

1
ответ дан 3 November 2019 в 12:28
поделиться

Это зависит частично от того, что Вы подразумеваете 'под качеством C' код.

Один важный аспект программы, "это делает то, что это было разработано, чтобы сделать"? Это трудно измерить, но крайне важно.

Затем необходимо знать, приемлем ли код для компиляторов - использование набора параметров компилятора GCC, обеспеченных Cristoph, указало бы, что код в хорошем состоянии. (Хотя я придрался бы -Wno-long-long, это зависит от того, где Ваш код, возможно, должен был бы быть быть перемещенным в).

Размещение кода важно. Действительно ли код читаем людьми, а также компиляторами? Действительно ли расположение универсально? Это находится в одном из стандартных форматов - существуют несколько, все с главными followings, и, пока Вы используете одного из них последовательно, код должен быть прекрасным. Это соответственно прокомментировано? Это означает достаточно комментариев, но не слишком многих! Файл должен иметь комментарий заголовка, указывающий, что находится в нем - и вероятно кто записал это, и возможно лицензия, в соответствии с которой он распределяется. Было несколько вопросов на ТАК об этом, включая Профессиональные комментарии #include. Написание кода к стандарту наглядности является стандартной программой после короткого времени, все же.

Документация может быть соответствующей - обычно релевантно. Как кто-то еще знал бы, что код существует, что он делает, как использовать его, когда использовать его, если не для использования его?

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

Wouter van Nifterick дал превосходный набор указателей также.

1
ответ дан 3 November 2019 в 12:28
поделиться

Некоторые современные методы жизненного цикла программного обеспечения, которые осуществляют качество кода:

  • интеграционные тесты (запланированный при запуске проекта)
  • экспертные оценки кода (во время разработки)
  • программирование пары (во время разработки)
  • использование объединенных библиотек (вместо 'изобретающего велосипед' подхода)

Последний может в особенности относиться к языку C.

0
ответ дан 3 November 2019 в 12:28
поделиться
Другие вопросы по тегам:

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