Covellite++  Version: 2.3.0 Revision: ??? Platform: x64 Build: 23:13 04.01.2025
Кроссплатформенный фреймворк для разработки приложений на С++
Загрузка...
Поиск...
Не найдено
Solution.codestyle.hpp
1
116{
117 // ...
118}
119
120/*static*/ void ClassName::DoProcess(void)
121{
122 // ...
123}
124
125* \endcode
126* - В определении функции сначала ставить входные, затем выходные параметры.
127* - Параметры, являющиеся результатом работы функции должны передаваться через
128* указатели(ссылки - только константные!).
129* - Параметры, являющиеся результатом работы функции, должны быть помечены
130* комментарием \b out
131* \code
132
133void GetValue(/*out*/ int * _pValue);
134
135* \endcode
136*
137* Правила именования переменных/функций/классов/файлов
138* ----------------------------------------------------
139*
140* - Имена переменных должны быть существительными, функций -
141* глаголами/командами.
142* - Имена файлов должны совпадать с именами объявленных в них классов (включая
143* пространство имен).
144* - \ref IdentifiersAnchor "Правила именования идентификаторов".
145*
146* Пространства имен
147* -----------------
148*
149* - Каждый отдельный модуль программы должен иметь свое пространство имен.
150* - Не использовать директиву using namespace вне функций.
151* - Пространство имен должно завершаться комментарием "} // namespace <name>".
152* - Код внутри пространства имен должен идти по левому краю.
153* - Вместо статических констант использовать константы в не именованных
154* пространствах имен (использовать их в заголовочных файлах только для
155* объявления констант!).
156*
157* Конструкторы/деструкторы
158* ------------------------
159*
160* - Всегда явным образом определять конструктор по умолчанию, инициирующий
161* внутренние переменные класса.
162* - Использовать ключевое слово explicit для конструкторов с одним аргументом.
163* - Если класс не имеет явного конструктора копирования, наследовать его от
164* boost::noncopyable.
165* - Деструктору всегда явным образом указывать noexcept.
166*
167* Примеры
168* =======
169*
170* \anchor Example1Anchor
171*
172* Пример 1: Перечисления
173* ----------------------
174*
175* \code
176
177// Объявление:
178class Status
179{
180public:
181 enum Value : size_t
182 {
183 Unknown = 0,
184 Play,
185 Pause,
186 Stop,
187
188 Illegal
189 };
190};
191
192// Использование
193Status::Value CurrentStatatus = Status::Stop;
194
195* \endcode
196*
197* Пример 2: Константы
198* -------------------
199*
200* \code
201
202namespace
203{
204
205// Объявление
206template<class T>
207class Constant final
208{
209public:
210 static constexpr T PI = static_cast<T>(math::PI);
211};
212
213} // unnamed namespace
214
215// Использование
216auto DoublePI = 2.0f * Constant<float>::PI;
217
218* \endcode
219*
220* \anchor Example2Anchor
221*
222* Пример 3: Именование параметров
223* -------------------------------
224*
225* \code
226
227const bool IsSsuccess = CalculateSomething(InterestingValue,
228 10,
229 false,
230 NULL); // Что означают все эти аргументы??
231
232* \endcode
233*
234* вместо:
235*
236* \code
237
238const bool IsSuccess = CalculateSomething(InterestingValue,
239 10, // Базовое значение по умолчанию
240 false, // Функция вызывается не в первый раз.
241 nullptr); // Без возвратной функции.
242
243* \endcode
244*
245* Или, в качестве альтернативы, используя константы или само-описывающие переменные:
246*
247* \code
248
249const int DefaultBaseValue = 10;
250const bool IsFirstTimeCalling = false;
251Callback * fnNullCallback = nullptr;
252
253const bool IsSuccess = CalculateSomething(InterestingValue,
254 DefaultBaseValue,
255 IsFirstTimeCalling,
256 fnNullCallback);
257
258* \endcode
259*
260* Под вопросом
261* ============
262*
263* - Запятые в списке инициализации переменных в конструкторе ставить после
264* переменной.
265* - Вместо \<iostream\> в заголовочных файлах писать \<iosfwd\> для ускорения
266* компиляции.
267* - Для быстрого копирования потоков ввода - вывода(из одного в другой),
268* использовать функцию потока .rdbuf() (cout << file.rdbuf()).
269* - С помощью функции std::uncaught_exception можно проверить, как завершает
270* работу функция: это нормальный возврат или было выброшено исключение.
271* - Преобразовывайте тип числа с плавающей точкой в целочисленный тип
272* исключительно через функции стандартной библиотеки(«round», «floor», «ceil»
273* и т.п.)
274* - Для инициализации переменных использовать списки инициализации (они не
275* позволяют сужение типов: int x1 = { 7.3 }; //compilation error).
276* - Профайлер не может подсказать, какие inline функции не должны быть
277* встраиваемыми!
278* - Строки хранить в отдельном файле (лучше.cpp).
279* - Исключение не должно покидать деструктор (особенно это касается работы
280* с контейнерами STL).
281* - Для класса предоставлять функцию swap() (она должна быть бессбойной!),
282* которую можно использовать для присваивания со строгими гарантиями
283* безопасности (для примитивных типов использовать std::swap())
284* \code
285
286T & T::operator= (T Temp) // По значению!
287{
288 swap(Temp);
289 return *this;
290}
291
292* \endcode
293* - Для отсортированного набора объектов можно использовать индексные
294* контейнеры, содержащие итераторы на основной контейнер.
295* - Для добавления элементов в контейнер предпочтительнее использовать операции
296* с диапазонами.
297* - container<T>(c).swap(c); // Удаление всей лишней (зарезервированной)
298* емкости контейнера.
299* - container<T>().swap(c); // Удаление всех элементов и очистка памяти
300* контейнера.
301* - find / find_if и count / count_if - поиск в неотсортированном диапазоне.
302* - lower_bound, upper_bound, equal_range(реже binary_search) - поиск
303* в отсортированном диапазоне.
304* - Функциональные объекты должны содержать константный operator().
305* - Побочные подзадачи выделять в отдельный код.
306*/