├── 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 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
动词用途示例
Create创建实例,常用于实例化方法和工厂方法的命名CreateInstance
Initialize初始化实例的属性和设置,Initialize本身也可作为类方法用来初始化InitializeInstance,Initialize
Load加载配置,根据配置创建内容LoadFromConfig
Destroy销毁实例,常用语析构方法DestroyInstance
Uninitialize清理实例的属性和设置,通常和Initialize对应UninitializeInstance,Uninitialize
65 |
66 | 67 | ## 获取/设置 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 |
动词用途示例
Get常用于取属性的类方法命名,也可作为通用获取方法命名GetStartTime
Fetch通过网络请求获取内容FetchAllUsers
Calculate通过计算获取内容CalculateTotalAmount
Read读取(多用于文件,配置等)ReadFile,ReadConfig
Query查询QueryRemainingAmount
Find查找(多用于数据库,集合等),和search相似FindOrder
Receive接收(多用于文件,消息等)ReceiveNewMessage
Pull拉取PullLastestSourceCode
Set常用于设置属性的类方法命名,也可作为通用设置方法命名SetStartTime
Write写入(文件/配置等)WriteFile,WriteConfig
Put放入PutUserWithId
Push存入,推送(通知)PushNotification
134 |
135 | 136 | ## 更新 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 |
动词用途示例
Reset强调重置(标记,状态)ResetTimer
Refresh用于命名刷新(多用于页面,缓存等)RefreshCurrentPage
Update更新(多用于配置,状态等)UpdateUserSetting
159 |
160 | 161 | ## 添加/移除 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 |
动词用途示例
Add用于通用添加方法命名AddNewStudent
Append强调在尾部添加(追加)AppendCharacter
Insert强调插入(可以在任意位置)InsertCharacter
Delete表示删除,和Remove相近DeleteDirectory
Remove表示移除,和Delete相近RemoveInvalidDeals
194 |
195 | 196 | ## 启动/停止 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 |
动词用途示例
Open开启(多用于开启状态,打开文件等)OpenEnhanceMode
Start开始(强调开始某个流程)StartPortListening
Launch发动/启动(多用于启动程序,服务)LaunchAssistService
Close关闭(多用于关闭状态,关闭文件等)CloseEnhanceMode
Stop停止(强调流程的终止)StopPortListening
Pause暂停(强调流程的暂停,有可能后续会继续开启)PausePageLoading
Finish完成(强调流程的完成)FinishRequesting
239 |
240 | 241 | ## 集合类型相关数据处理 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 |
动词用途示例
Filter过滤,筛选(强调按照某些条件)FilterByName
Merge合并(有时会带上合并规则)MergeTwoConfig
Concat拼接(直接在结尾添加)ConcatToArray
Split分割SplitInput
Deduplicate去重(去重完全相同的项)DeduplicateList
Reverse颠倒,反向排列ReverseRecord
Sort排序(有时会带上排序规则)SortDealsByAmount
Fill填充(一般会进行覆盖)FillAmountList
289 |
290 | 291 | ## 通用业务数据处理 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 |
动词用途示例
Parse解析(解析成某些格式,解析提取某些内容)ParseFromJson,ParseResult
Analyse分析(不一定能通过简单的方式获取)AnalyseLocation
Convert类型转换(通常用于从一个类型转换到另一种类型)ConvertToString
Format格式化数据FormatToLocaleString
Validate合法性/有效性的校验ValidateUserInputs
Ensure期待值的校验EnsureUserAge
Compose组成(一般由多项内容组成一个结果)ComposeMessage
Encode编码(依赖约定的编码格式)EncodeUrl
Decode解码(依赖约定的解码格式)DecodeUrl
Encrypt数据加密(依赖约定的加密算法)EncryptContent
Decrypt数据解密(依赖约定的解密算法)DecryptContent
Backup备份(需要注意拷贝方式,避免误导)BackupUserSettings
Restore恢复RestoreUserSettings
Import导入(通常用于按照特定格式的文件转换)ImportFromFile
Export导出(通常用于转换成特定格式的文件)ExportToFile
Compress压缩(依赖约定的算法)CompressOversizedFile
Decompress解压缩(依赖约定的算法)DecompressOversizedFile
384 |
385 | --------------------------------------------------------------------------------