├── LICENSE
├── README.md
├── 代码审查避雷指南
└── 新人code review典型问题.md
└── 命名指南大全
└── 给函数起个好名字—动词选择.md
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 gscheartA
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Improve-your-code
2 | 《改善丑陋的代码》——红桃A士视频分享系列
3 |
--------------------------------------------------------------------------------
/代码审查避雷指南/新人code review典型问题.md:
--------------------------------------------------------------------------------
1 | # 如何避免被code review毒打,总结cr中的典型问题
2 |
3 |
4 | # 1 命名不规范
5 |
6 |
7 | ## 典型问题:
8 | ### 1.取名过于简单,无法清晰表达含义
9 | ```
10 | //单字符,简短单词作为变量名
11 | bool flag = false;
12 | for(f in markedFiles){
13 | //handle each marked file
14 | }
15 | ```
16 | ### 2.命名风格不一,影响代码阅读
17 | ```
18 | //多种风格的方法名
19 | IsProcessRunning()
20 | CheckIfPageClosed()
21 | ```
22 | ### 3.没参照规范命名
23 |
24 |
25 | ## 建议:
26 | ### 1.遵循已有的命名规范:
27 | ### -若公司/团队对于命名有规范文档,应好好研究。
28 | ### -可以适当参照现有代码的命名风格。
29 | ### 2.命名要能够清晰展现有关的含义(好的命名的基本要求)
30 | ### -较长而清晰的命名优于简短而模糊的命名,不要过于追求简短。
31 | ### -为一个好的命名花费的思考是值得的。
32 | ### 3.命名技巧学习:
33 | ### -多阅读书籍、教程、知名源码等等,学习命名思路和技巧。
34 |
35 |
36 |
37 | # 2 注释不合规
38 |
39 |
40 | ## 典型问题:
41 | ### 1.修改代码不更新注释,造成误导
42 | ```
43 | //do something about A
44 | Function()
45 | {
46 | // do some actions about B
47 | }
48 | ```
49 | ### 2.无意义的注释(如日志型日志,废弃的代码)
50 | ```
51 | /*
52 | * Date: 1 Jan
53 | * Author: Hongtao
54 | * Change: Update this function for fixing bug : ...
55 | * ........
56 | */
57 | Function(){
58 | /*
59 | OldFlow();
60 | */
61 | NewFlow();
62 | }
63 | ```
64 | ### 3.过多篇幅的注释
65 | ```
66 | /*
67 | multi-lines
68 | */
69 | Function(){
70 | ......
71 | }
72 | ```
73 |
74 |
75 | ## 建议:
76 | ### 1.遵循已有的注释规范:
77 | ### -若公司/团队对于命名有规范文档,应好好研究。
78 | ### -可以适当参照现有代码的注释风格。
79 | ### 2.避免写出坏注释:
80 | ### -不达意的注释
81 | ### -含有误导的注释
82 | ### -与逻辑无关的注释
83 | ### 3.及时更新注释
84 | ### 4.清晰的代码是不需要太多注释说明的
85 |
86 |
87 | # 3 函数封装和复用
88 |
89 |
90 | ## 典型问题:
91 | ### 1.不使用公司/团队封装的工具库,自己重新实现
92 | ```
93 | //文件IO工具类的封装
94 | class FileUtility{
95 | Read(){}
96 | Write(){}
97 | Copy(){}
98 | Delete(){}
99 | ...
100 | }
101 | //字符串格式处理工具类的封装
102 | class StringUtility(){
103 | EncodeString()
104 | DecodeString()
105 | Foramt()
106 | ToUpper()
107 | ToLower()
108 | ...
109 | }
110 | ```
111 | ### 2.函数过长,缺乏提炼
112 | ```
113 | Function()
114 | {
115 | // do A
116 | ...
117 | // do B
118 | ...
119 | // do C
120 | ...
121 | ...
122 | }
123 | ```
124 | ### 3.重复代码不做复用
125 |
126 | ## 建议:
127 | ### 1.底层逻辑编码时,先看看是否被公司/团队进行过封装。
128 | ### -字符串等数据结构的处理
129 | ### -文件、日期等类型的处理
130 | ### -异步操作,事件绑定等处理
131 | ### 2.按照职责设计和提炼函数,尽量做到函数单一职责
132 | ### 3.相同逻辑的代码积极复用
133 |
134 | # 4 不合理的变量定义
135 |
136 |
137 | ## 典型问题:
138 | ### 1.变量定义不考虑解耦
139 | ```
140 | //方法体中的整型/字符串定义
141 | class WebpageLauncher(){
142 | public int LaunchLoginPage(){
143 | string loginUrl = "www.xxx.com/login"
144 | ......
145 | if(error){
146 | return 1001;
147 | }
148 | }
149 | public LaunchHelpPage(){
150 | string helpUrl = "www.xxx.com/help"
151 | ......
152 | if(error){
153 | return 1002;
154 | }
155 | }
156 | }
157 | ```
158 | ### 2.使用常量代替应该动态生成的内容
159 | ```
160 | const string systemPath = "C:\\";
161 | ```
162 |
163 |
164 | ## 建议:
165 | ### 1.使用字面量定义时,考虑能否解耦
166 | ### -类中使用的常量,可以定义为类中的静态常量
167 | ### -全局使用的常量,通常被集中定义在某些文件中(config、table、global)。
168 | ### 2.能够在运行时获取的内容(系统API、网络、文件),不应被定义在代码中。
169 |
170 |
171 |
172 |
--------------------------------------------------------------------------------
/命名指南大全/给函数起个好名字—动词选择.md:
--------------------------------------------------------------------------------
1 | # 函数中的动词选取
2 |
3 |
4 | # 选取原则1 避免滥用通用单词
5 |
6 | ## 案例1:万能的Get
7 | ## GetTotalAmount();
8 | ### 获取属性?
9 | ### 获取本地存储内容?
10 | ### 获取网络内容?
11 | ### 获取数据库内容?
12 | ### 获取计算后的内容?
13 | ### ......
14 |
15 |
16 | ## 案例2:万能的Add
17 | ## AddCharacter();
18 | ### 添加到头部?
19 | ### 添加到尾部?
20 | ### 从中间插入字符?
21 | ## ......
22 |
23 |
24 | ## 问题:
25 | ### 通用单词可以在很多场景下命名,但不能区分具体函数职责。
26 | ### 当函数本身的实现途径不同时,难以从函数名得到足够的信息。
27 |
28 |
29 | # 函数命名动词大全指南:
30 |
31 |
32 | ## 创建/销毁
33 |
34 |
35 | 动词 |
36 | 用途 |
37 | 示例 |
38 |
39 |
40 | Create |
41 | 创建实例,常用于实例化方法和工厂方法的命名 |
42 | CreateInstance |
43 |
44 |
45 | Initialize |
46 | 初始化实例的属性和设置,Initialize本身也可作为类方法用来初始化 |
47 | InitializeInstance,Initialize |
48 |
49 |
50 | Load |
51 | 加载配置,根据配置创建内容 |
52 | LoadFromConfig |
53 |
54 |
55 | Destroy |
56 | 销毁实例,常用语析构方法 |
57 | DestroyInstance |
58 |
59 |
60 | Uninitialize |
61 | 清理实例的属性和设置,通常和Initialize对应 |
62 | UninitializeInstance,Uninitialize |
63 |
64 |
65 |
66 |
67 | ## 获取/设置
68 |
69 |
70 | 动词 |
71 | 用途 |
72 | 示例 |
73 |
74 |
75 | Get |
76 | 常用于取属性的类方法命名,也可作为通用获取方法命名 |
77 | GetStartTime |
78 |
79 |
80 | Fetch |
81 | 通过网络请求获取内容 |
82 | FetchAllUsers |
83 |
84 |
85 | Calculate |
86 | 通过计算获取内容 |
87 | CalculateTotalAmount |
88 |
89 |
90 | Read |
91 | 读取(多用于文件,配置等) |
92 | ReadFile,ReadConfig |
93 |
94 |
95 | Query |
96 | 查询 |
97 | QueryRemainingAmount |
98 |
99 |
100 | Find |
101 | 查找(多用于数据库,集合等),和search相似 |
102 | FindOrder |
103 |
104 | Receive |
105 | 接收(多用于文件,消息等) |
106 | ReceiveNewMessage |
107 |
108 |
109 | Pull |
110 | 拉取 |
111 | PullLastestSourceCode |
112 |
113 |
114 | Set |
115 | 常用于设置属性的类方法命名,也可作为通用设置方法命名 |
116 | SetStartTime |
117 |
118 |
119 | Write |
120 | 写入(文件/配置等) |
121 | WriteFile,WriteConfig |
122 |
123 |
124 | Put |
125 | 放入 |
126 | PutUserWithId |
127 |
128 |
129 | Push |
130 | 存入,推送(通知) |
131 | PushNotification |
132 |
133 |
134 |
135 |
136 | ## 更新
137 |
138 |
139 | 动词 |
140 | 用途 |
141 | 示例 |
142 |
143 |
144 | Reset |
145 | 强调重置(标记,状态) |
146 | ResetTimer |
147 |
148 |
149 | Refresh |
150 | 用于命名刷新(多用于页面,缓存等) |
151 | RefreshCurrentPage |
152 |
153 |
154 | Update |
155 | 更新(多用于配置,状态等) |
156 | UpdateUserSetting |
157 |
158 |
159 |
160 |
161 | ## 添加/移除
162 |
163 |
164 | 动词 |
165 | 用途 |
166 | 示例 |
167 |
168 |
169 | Add |
170 | 用于通用添加方法命名 |
171 | AddNewStudent |
172 |
173 |
174 | Append |
175 | 强调在尾部添加(追加) |
176 | AppendCharacter |
177 |
178 |
179 | Insert |
180 | 强调插入(可以在任意位置) |
181 | InsertCharacter |
182 |
183 |
184 | Delete |
185 | 表示删除,和Remove相近 |
186 | DeleteDirectory |
187 |
188 |
189 | Remove |
190 | 表示移除,和Delete相近 |
191 | RemoveInvalidDeals |
192 |
193 |
194 |
195 |
196 | ## 启动/停止
197 |
198 |
199 | 动词 |
200 | 用途 |
201 | 示例 |
202 |
203 |
204 | Open |
205 | 开启(多用于开启状态,打开文件等) |
206 | OpenEnhanceMode |
207 |
208 |
209 | Start |
210 | 开始(强调开始某个流程) |
211 | StartPortListening |
212 |
213 |
214 | Launch |
215 | 发动/启动(多用于启动程序,服务) |
216 | LaunchAssistService |
217 |
218 |
219 | Close |
220 | 关闭(多用于关闭状态,关闭文件等) |
221 | CloseEnhanceMode |
222 |
223 |
224 | Stop |
225 | 停止(强调流程的终止) |
226 | StopPortListening |
227 |
228 |
229 | Pause |
230 | 暂停(强调流程的暂停,有可能后续会继续开启) |
231 | PausePageLoading |
232 |
233 |
234 | Finish |
235 | 完成(强调流程的完成) |
236 | FinishRequesting |
237 |
238 |
239 |
240 |
241 | ## 集合类型相关数据处理
242 |
243 |
244 | 动词 |
245 | 用途 |
246 | 示例 |
247 |
248 |
249 | Filter |
250 | 过滤,筛选(强调按照某些条件) |
251 | FilterByName |
252 |
253 |
254 | Merge |
255 | 合并(有时会带上合并规则) |
256 | MergeTwoConfig |
257 |
258 |
259 | Concat |
260 | 拼接(直接在结尾添加) |
261 | ConcatToArray |
262 |
263 |
264 | Split |
265 | 分割 |
266 | SplitInput |
267 |
268 |
269 | Deduplicate |
270 | 去重(去重完全相同的项) |
271 | DeduplicateList |
272 |
273 |
274 | Reverse |
275 | 颠倒,反向排列 |
276 | ReverseRecord |
277 |
278 |
279 | Sort |
280 | 排序(有时会带上排序规则) |
281 | SortDealsByAmount |
282 |
283 |
284 | Fill |
285 | 填充(一般会进行覆盖) |
286 | FillAmountList |
287 |
288 |
289 |
290 |
291 | ## 通用业务数据处理
292 |
293 |
294 | 动词 |
295 | 用途 |
296 | 示例 |
297 |
298 |
299 | Parse |
300 | 解析(解析成某些格式,解析提取某些内容) |
301 | ParseFromJson,ParseResult |
302 |
303 |
304 | Analyse |
305 | 分析(不一定能通过简单的方式获取) |
306 | AnalyseLocation |
307 |
308 |
309 | Convert |
310 | 类型转换(通常用于从一个类型转换到另一种类型) |
311 | ConvertToString |
312 |
313 |
314 | Format |
315 | 格式化数据 |
316 | FormatToLocaleString |
317 |
318 |
319 | Validate |
320 | 合法性/有效性的校验 |
321 | ValidateUserInputs |
322 |
323 |
324 | Ensure |
325 | 期待值的校验 |
326 | EnsureUserAge |
327 |
328 |
329 | Compose |
330 | 组成(一般由多项内容组成一个结果) |
331 | ComposeMessage |
332 |
333 |
334 | Encode |
335 | 编码(依赖约定的编码格式) |
336 | EncodeUrl |
337 |
338 |
339 | Decode |
340 | 解码(依赖约定的解码格式) |
341 | DecodeUrl |
342 |
343 |
344 | Encrypt |
345 | 数据加密(依赖约定的加密算法) |
346 | EncryptContent |
347 |
348 |
349 | Decrypt |
350 | 数据解密(依赖约定的解密算法) |
351 | DecryptContent |
352 |
353 |
354 | Backup |
355 | 备份(需要注意拷贝方式,避免误导) |
356 | BackupUserSettings |
357 |
358 |
359 | Restore |
360 | 恢复 |
361 | RestoreUserSettings |
362 |
363 |
364 | Import |
365 | 导入(通常用于按照特定格式的文件转换) |
366 | ImportFromFile |
367 |
368 |
369 | Export |
370 | 导出(通常用于转换成特定格式的文件) |
371 | ExportToFile |
372 |
373 |
374 | Compress |
375 | 压缩(依赖约定的算法) |
376 | CompressOversizedFile |
377 |
378 |
379 | Decompress |
380 | 解压缩(依赖约定的算法) |
381 | DecompressOversizedFile |
382 |
383 |
384 |
385 |
--------------------------------------------------------------------------------