Skip to content

Commit 1cc81aa

Browse files
committed
[代码质量改进与功能优化]: 大规模代码重构与优化**
- **代码检查配置更新**:调整`.clang-tidy`配置,新增忽略规则`-llvm-header-guard`和`-readability-identifier-length`,优化代码检查策略 - **工作流优化**:扩展GitHub Actions工作流`cpp_linter.yml`的忽略范围,新增对`Client`、`Icmp`、`Server`和`utils`目录的忽略规则 - **算法改进**:重构`Algorithm/Search/search.hpp`中的多个搜索算法(顺序查找、二分查找、斐波那契查找等),统一参数命名规范,提升代码可读性 - **类型安全增强**:修改`Curl/file_utils.cc`和`Curl/file_utils.hpp`中的`formatBytes`函数,将参数类型从`double`调整为`int64_t`,增强类型安全性 - **HTTP客户端优化**:重构`Curl/httpclient.cc`和`Curl/httpclient.hpp`,将多个成员函数声明为`const`,修复文件读写操作中的类型转换问题 - **异步HTTP客户端改进**:调整`Curl/httpclient_async.hpp`中的函数返回值类型声明,采用`auto`关键字提升代码简洁性 - **设计模式优化**: - 工厂模式:修改`DesignPattern/Factory/factory.hpp`和相关实现文件,添加`noncopyable`继承并启用`DISABLE_COPY_MOVE`宏 - 单例模式:重构`DesignPattern/Singleton`目录下的文件,新增单元测试`sington_unittest.cc`,删除冗余的`main.cpp`和`singletonmanager.hpp`文件 - **头文件规范统一**:将多个文件中的`#ifndef`/`#define`/`#endif`保护机制替换为`#pragma once`,简化头文件结构 - **资源管理增强**:在`SpinMutex/spinmutex.hpp`和`Thread/thread.hpp`等文件中添加`DISABLE_MOVE`宏,明确禁止移动语义的使用场景 - **文档优化**:更新`README.md`文件,重新组织设计模式相关示例的编号结构,提升文档可读性 - **网络编程改进**:修改`Server/socket.cc`和`Server/socket.hpp`中的函数参数名称和返回值类型声明,增强代码语义清晰度 - **工具函数增强**:优化`OpenSSL/openssl_utils.hpp`中的Hex编码转换函数,新增`utils/utils.hpp`文件定义`UNUSED`宏,提升工具函数实用性
1 parent c4f6733 commit 1cc81aa

31 files changed

+406
-308
lines changed

.clang-tidy

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,38 @@
1-
---
2-
Checks: 'clang-analyzer-*,readability-*,performance-*,modernize-*,bugprone-*,cert-*,portability-*,llvm-*,google-*'
3-
WarningsAsErrors: ''
1+
Checks: >
2+
clang-analyzer-*,
3+
bugprone-*,
4+
performance-*,
5+
cert-*,
6+
misc-*,
7+
modernize-*,
8+
cppcoreguidelines-*,
9+
concurrency-*,
10+
-modernize-use-trailing-return-type,
11+
-cppcoreguidelines-avoid-magic-numbers,
12+
-llvm-header-guard,
13+
-readability-identifier-length,
14+
-readability-magic-numbers,
15+
-modernize-pass-by-value,
16+
-cert-err58-cpp,
17+
-hicpp-exception-baseclass
18+
19+
WarningsAsErrors: >
20+
clang-analyzer-*,
21+
bugprone-*,
22+
performance-*,
23+
cert-*,
24+
misc-*,
25+
concurrency-mt-unsafe,
26+
concurrency-thread-canceltype,
27+
cppcoreguidelines-pro-type-*,
28+
cppcoreguidelines-owning-memory,
29+
cppcoreguidelines-no-malloc,
30+
hicpp-noexcept,
31+
performance-no-int-to-ptr,
32+
performance-trivially-destructible,
33+
bugprone-exception-escape
34+
435
HeaderFilterRegex: '.'
5-
AnalyzeTemporaryDtors: false
6-
FormatStyle: none
7-
User: user
36+
AnalyzeTemporaryDtors: true
37+
FormatStyle: file
38+
User: user

.github/workflows/cpp_linter.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
step-summary: true
4949
database: build
5050
ignore: .github | build
51-
ignore-tidy: .github | MonitorDir/monitordir_win.cc | MonitorDir/monitordir_mac.cc
51+
ignore-tidy: .github | Client | Icmp| Server | MonitorDir/monitordir_win.cc | MonitorDir/monitordir_mac.cc | utils
5252

5353
- name: Fail fast?!
5454
if: steps.linter.outputs.clang-tidy-checks-failed > 0

Algorithm/Search/search.hpp

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88

99
// 顺序查找
1010
template<typename T>
11-
auto sequential_search(const std::vector<T> &v, const T &value) -> int
11+
auto sequential_search(const std::vector<T> &vec, const T &value) -> int
1212
{
13-
for (int i = 0; i < v.size(); ++i) { // 从头到尾遍历
14-
if (v[i] == value) { // 如果找到了,就返回下标
13+
for (int i = 0; i < vec.size(); ++i) { // 从头到尾遍历
14+
if (vec[i] == value) { // 如果找到了,就返回下标
1515
return i;
1616
}
1717
}
@@ -20,15 +20,15 @@ auto sequential_search(const std::vector<T> &v, const T &value) -> int
2020

2121
// 二分查找
2222
template<typename T>
23-
auto binary_search(const std::vector<T> &v, const T &value) -> int
23+
auto binary_search(const std::vector<T> &vec, const T &value) -> int
2424
{
2525
int low = 0; // 最小下标
26-
int high = v.size() - 1; // 最大下标
26+
int high = vec.size() - 1; // 最大下标
2727
while (low <= high) { // 当最小下标小于等于最大下标时
2828
int mid = (low + high) / 2; // 取中间下标
29-
if (v[mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
29+
if (vec[mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
3030
return mid;
31-
} else if (v[mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
31+
} else if (vec[mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
3232
low = mid + 1;
3333
} else { // 如果中间元素大于要查找的元素,就在左半部分查找
3434
high = mid - 1;
@@ -39,23 +39,23 @@ auto binary_search(const std::vector<T> &v, const T &value) -> int
3939

4040
// 斐波那契查找
4141
template<typename T>
42-
auto fibonacci_search(const std::vector<T> &v, const T &value) -> int
42+
auto fibonacci_search(const std::vector<T> &vec, const T &value) -> int
4343
{
44-
std::vector<int> fibonacci{1, 1}; // 斐波那契数列
45-
while (fibonacci.back() < v.size()) { // 生成斐波那契数列
44+
std::vector<int> fibonacci{1, 1}; // 斐波那契数列
45+
while (fibonacci.back() < vec.size()) { // 生成斐波那契数列
4646
fibonacci.push_back(fibonacci[fibonacci.size() - 1] + fibonacci[fibonacci.size() - 2]);
4747
}
4848
int low = 0; // 最小下标
49-
int high = v.size() - 1; // 最大下标
49+
int high = vec.size() - 1; // 最大下标
5050
int k = fibonacci.size() - 1; // 斐波那契数列的下标
5151
while (low <= high) { // 当最小下标小于等于最大下标时
5252
int mid = low + fibonacci[k - 1] - 1; // 取黄金分割点
53-
if (mid >= v.size()) { // 如果黄金分割点大于等于数组长度
54-
mid = v.size() - 1; // 就将黄金分割点设置为数组最后一个元素的下标
53+
if (mid >= vec.size()) { // 如果黄金分割点大于等于数组长度
54+
mid = vec.size() - 1; // 就将黄金分割点设置为数组最后一个元素的下标
5555
}
56-
if (v[mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
56+
if (vec[mid] == value) { // 如果中间元素等于要查找的元素,就返回下标
5757
return mid;
58-
} else if (v[mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
58+
} else if (vec[mid] < value) { // 如果中间元素小于要查找的元素,就在右半部分查找
5959
low = mid + 1;
6060
k -= 2;
6161
} else { // 如果中间元素大于要查找的元素,就在左半部分查找
@@ -68,13 +68,13 @@ auto fibonacci_search(const std::vector<T> &v, const T &value) -> int
6868

6969
// 线性索引查找
7070
template<typename T>
71-
auto linear_index_search(const std::vector<T> &v, const T &value) -> int
71+
auto linear_index_search(const std::vector<T> &vec, const T &value) -> int
7272
{
73-
std::vector<T> index; // 索引
74-
index.push_back(v[0]); // 第一个索引为第一个元素
75-
for (int i = 1; i < v.size(); ++i) { // 生成索引
76-
if (v[i] > index.back()) { // 如果当前元素大于索引的最后一个元素
77-
index.push_back(v[i]);
73+
std::vector<T> index; // 索引
74+
index.push_back(vec[0]); // 第一个索引为第一个元素
75+
for (int i = 1; i < vec.size(); ++i) { // 生成索引
76+
if (vec[i] > index.back()) { // 如果当前元素大于索引的最后一个元素
77+
index.push_back(vec[i]);
7878
}
7979
}
8080
int low = 0; // 最小下标
@@ -94,7 +94,7 @@ auto linear_index_search(const std::vector<T> &v, const T &value) -> int
9494

9595
// KMP查找
9696
template<typename T>
97-
auto kmp_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
97+
auto kmp_search(const std::vector<T> &vec, const std::vector<T> &pattern) -> int
9898
{
9999
std::vector<int> next(pattern.size()); // next数组
100100
next[0] = -1; // next数组的第一个元素为-1
@@ -109,11 +109,11 @@ auto kmp_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
109109
next[i] = k; // 将k赋值给next数组的当前元素
110110
}
111111
k = -1; // next数组的下标
112-
for (int i = 0; i < v.size(); ++i) {
113-
while (k > -1 && pattern[k + 1] != v[i]) { // 如果k大于-1且下一个元素不等于当前元素
112+
for (int i = 0; i < vec.size(); ++i) {
113+
while (k > -1 && pattern[k + 1] != vec[i]) { // 如果k大于-1且下一个元素不等于当前元素
114114
k = next[k];
115115
}
116-
if (pattern[k + 1] == v[i]) { // 如果下一个元素等于当前元素
116+
if (pattern[k + 1] == vec[i]) { // 如果下一个元素等于当前元素
117117
++k;
118118
}
119119
if (k == pattern.size() - 1) { // 如果k等于模式串的最后一个元素的下标
@@ -139,7 +139,7 @@ auto move_by_suffix(int j, const std::vector<int> &suffix, const std::vector<boo
139139
}
140140
// BM查找
141141
template<typename T>
142-
auto bm_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
142+
auto bm_search(const std::vector<T> &vec, const std::vector<T> &pattern) -> int
143143
{
144144
std::vector<int> bc(256, -1); // 坏字符哈希表
145145
for (int i = 0; i < pattern.size(); ++i) { // 生成坏字符哈希表
@@ -161,71 +161,71 @@ auto bm_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
161161
}
162162
}
163163
int i = 0;
164-
while (i <= v.size() - pattern.size()) { // 从头到尾遍历
164+
while (i <= vec.size() - pattern.size()) { // 从头到尾遍历
165165
int j = pattern.size() - 1;
166-
while (j >= 0 && v[i + j] == pattern[j]) { // 从后往前比较
166+
while (j >= 0 && vec[i + j] == pattern[j]) { // 从后往前比较
167167
--j;
168168
}
169169
if (j == -1) { // 如果模式串的所有元素都匹配了
170170
return i;
171171
}
172-
i += std::max(move_by_suffix(j, suffix, prefix), j - bc[v[i + j]]); // 将模式串向后移动
172+
i += std::max(move_by_suffix(j, suffix, prefix), j - bc[vec[i + j]]); // 将模式串向后移动
173173
}
174174
return -1; // not found
175175
}
176176

177177
// Sunday查找
178178
template<typename T>
179-
auto sunday_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
179+
auto sunday_search(const std::vector<T> &vec, const std::vector<T> &pattern) -> int
180180
{
181181
std::vector<int> bc(256, -1); // 坏字符哈希表
182182
for (int i = 0; i < pattern.size(); ++i) { // 生成坏字符哈希表
183183
bc[pattern[i]] = i;
184184
}
185185
int i = 0;
186-
while (i <= v.size() - pattern.size()) { // 从头到尾遍历
186+
while (i <= vec.size() - pattern.size()) { // 从头到尾遍历
187187
int j = 0;
188-
while (j < pattern.size() && v[i + j] == pattern[j]) { // 从前往后比较
188+
while (j < pattern.size() && vec[i + j] == pattern[j]) { // 从前往后比较
189189
++j;
190190
}
191191
if (j == pattern.size()) { // 如果模式串的所有元素都匹配了
192192
return i;
193193
}
194-
if (i + pattern.size() == v.size()) { // 如果模式串的最后一个元素在主串中不存在
195-
return -1; // not found
194+
if (i + pattern.size() == vec.size()) { // 如果模式串的最后一个元素在主串中不存在
195+
return -1; // not found
196196
}
197-
i += pattern.size() - bc[v[i + pattern.size()]]; // 将模式串向后移动
197+
i += pattern.size() - bc[vec[i + pattern.size()]]; // 将模式串向后移动
198198
}
199199
return -1; // not found
200200
}
201201

202202
// Rabin-Karp查找
203203
template<typename T>
204-
auto rabin_karp_search(const std::vector<T> &v, const std::vector<T> &pattern) -> int
204+
auto rabin_karp_search(const std::vector<T> &vec, const std::vector<T> &pattern) -> int
205205
{
206206
int pattern_hash = 0; // 模式串的哈希值
207207
for (int i = 0; i < pattern.size(); ++i) {
208208
pattern_hash += pattern[i];
209209
}
210210
int v_hash = 0; // 主串的哈希值
211211
for (int i = 0; i < pattern.size(); ++i) {
212-
v_hash += v[i];
212+
v_hash += vec[i];
213213
}
214214
int i = 0;
215-
while (i <= v.size() - pattern.size()) { // 从头到尾遍历
216-
if (v_hash == pattern_hash) { // 如果模式串的哈希值等于主串的哈希值
215+
while (i <= vec.size() - pattern.size()) { // 从头到尾遍历
216+
if (v_hash == pattern_hash) { // 如果模式串的哈希值等于主串的哈希值
217217
int j = 0;
218-
while (j < pattern.size() && v[i + j] == pattern[j]) { // 从前往后比较
218+
while (j < pattern.size() && vec[i + j] == pattern[j]) { // 从前往后比较
219219
++j;
220220
}
221221
if (j == pattern.size()) { // 如果模式串的所有元素都匹配了
222222
return i;
223223
}
224224
}
225-
if (i + pattern.size() == v.size()) { // 如果模式串的最后一个元素在主串中不存在
226-
return -1; // not found
225+
if (i + pattern.size() == vec.size()) { // 如果模式串的最后一个元素在主串中不存在
226+
return -1; // not found
227227
}
228-
v_hash += v[i + pattern.size()] - v[i]; // 将模式串向后移动
228+
v_hash += vec[i + pattern.size()] - vec[i]; // 将模式串向后移动
229229
++i;
230230
}
231231
return -1; // not found

Curl/file_utils.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void assertFileData(const std::string &filename, const std::string &data)
4040
EXPECT_EQ(fileData, data);
4141
}
4242

43-
auto formatBytes(double value, int precision) -> std::string
43+
auto formatBytes(int64_t value, int precision) -> std::string
4444
{
4545
std::vector<std::string> units = {"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
4646

Curl/file_utils.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ void removeFile(const std::string &filename);
88

99
void assertFileData(const std::string &filename, const std::string &data);
1010

11-
auto formatBytes(double value, int precision = 2) -> std::string;
11+
auto formatBytes(int64_t value, int precision = 2) -> std::string;

Curl/httpclient.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,20 @@ class HttpClient::HttpClientPrivate
2323
setHeaderCallback();
2424
}
2525

26-
void setVerbose()
26+
void setVerbose() const
2727
{
2828
assert(curl != nullptr);
2929
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
3030
}
3131

32-
void setHeaderCallback()
32+
void setHeaderCallback() const
3333
{
3434
assert(curl != nullptr);
3535
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, headerCallback);
3636
curl_easy_setopt(curl, CURLOPT_HEADERDATA, q_ptr);
3737
}
3838

39-
void setErrorCallback()
39+
void setErrorCallback() const
4040
{
4141
assert(curl != nullptr);
4242
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, q_ptr->d_ptr->errorBuffer.data());
@@ -46,6 +46,8 @@ class HttpClient::HttpClientPrivate
4646
{
4747
assert(curl != nullptr);
4848
for (const auto &[key, value] : std::as_const(headers)) {
49+
std::string data = key;
50+
data += ": " + value;
4951
this->headers = curl_slist_append(this->headers, (key + ": " + value).c_str());
5052
}
5153
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, this->headers);
@@ -66,7 +68,7 @@ class HttpClient::HttpClientPrivate
6668
headers = nullptr;
6769
}
6870

69-
void printError()
71+
void printError() const
7072
{
7173
if (!errorBuffer.empty()) {
7274
std::cerr << "Error: " << errorBuffer << std::endl;
@@ -91,7 +93,7 @@ class HttpClient::HttpClientPrivate
9193
{
9294
auto *client = static_cast<HttpClient *>(userdata);
9395
assert(client->d_ptr->file.is_open());
94-
client->d_ptr->file.write(ptr, size * nmemb);
96+
client->d_ptr->file.write(ptr, static_cast<std::streamsize>(size * nmemb));
9597
return size * nmemb;
9698
}
9799

@@ -111,7 +113,7 @@ class HttpClient::HttpClientPrivate
111113
auto *client = static_cast<HttpClient *>(userdata);
112114
auto &file = client->d_ptr->file;
113115
assert(file.is_open());
114-
file.read(ptr, size * nmemb);
116+
file.read(ptr, static_cast<std::streamsize>(size * nmemb));
115117
return file.gcount();
116118
}
117119

Curl/httpclient.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
class HttpClient : noncopyable
1212
{
13+
DISABLE_COPY_MOVE(HttpClient) // for clang-tidy
1314
public:
1415
using Headers = std::map<std::string, std::string>;
1516

Curl/httpclient_async.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
#include <utility>
1414
#include <vector>
1515

16-
class HttpClientAsync::HttpClientAsyncPrivate
16+
class HttpClientAsync::HttpClientAsyncPrivate : noncopyable
1717
{
18+
DISABLE_COPY_MOVE(HttpClientAsyncPrivate) // for clang-tidy
1819
public:
1920
struct Context
2021
{

0 commit comments

Comments
 (0)