Naming Conversion & Case Style 命名规范
前言
写代码有 2 个点很重要
第一是表达 (不要词不达意)
要达到这点, 就要多参考其它人如何表达.
第二是一致性 (一样的东西就用一样的写法)
要达到这点就要建立规范
以前的笔记
命名规范 naming conversion, camel case, pascal case, hyphen 等等
ASP.NET Core – Case Style Conversion
Case Style
pascal case = PascalCase
camel case = camelCase
kebab case = kebab-case (通常是 lower case)
snake case = snake_case
upper case = UPPERCASE
lower case = lower case
title case = Blog Title
以下是我自己的规范和学习笔记
Url Case Style
Url 用 kebab-case
query params 用 snake_case (oauth) 或 camelCase (gmail),
我选 camelCase 因为 ASP.NET Core 用 action parameter 来获取 route param 而它是 camelCase
Folder and File Case Style
参考一些开源库:
.NET = PascalCase
Angular = forlder: kebab-case, file: snake_case
Angular Material = kebab-case
React = forlder: kebab-case, file: camelCase
Vue = folder: kebab-case, file: PascalCase or camelCase
Me = need url access: kebab-case, 前端: kebab-case, 后端: PascalCase,
Folder and File Path Naming Conversion
参考:
What is the naming standard for path components?
FileRootFullPath = C:\Project\Hydro\wwwroot\uploaded-files\image.jpg
FileFullPath = wwwroot\uploaded-files\image.jpg (从 Project 走起, 而不是 C drive, 不一定是 wwwroot, 这里只是一个 example)
FileName = image.jpg
FileNameWithoutExtension = image
Extension = .jpg
DirectoryName = uploaded-files (和 .net 有分歧)
DirectoryRootFullPath = C:\Project\Hydro\wwwroot\uploaded-files
DirectoryFullPath = wwwroot\uploaded-files
RelativePath = ./ or ../
AbsolutePath = ~/abc/xyz
DirectoryPath = "abc\xyz"
Folder vs Directory
folder 通常是用在 UI 上, 程序基本上都会叫 directory(目录). 参考: stackoverflow – What is the difference between a directory and a folder?
C# Case Style
class name = PascalCase
property name = PascalCase
enum = PascalCase
filed = camelCase
private field = _camelCase
variable = camelCase
parameter = camelCase
local function = PascalCase
Tuple
调用和定义都可以是 PascalCase or camelCase.
如果调用的时候是当 object 用, 那么 property 就应该是 PascalCase. 如果是当解构 variables 用, 那就是 camelCase 合理些.
关键点是, 定义的时候用 PascalCase, 调用 property ok, variables 就 rename, 也 ok.
定义用 camelCase, 调用 property 就坏掉了.
所以定义的时候用 PascalCase 会好一点, 但如果可以确定使用时是 variables, 那我觉得定义时用 camelCase 也是可以的. 比如用 Tuple 做 Action 的 parameters 的时候.
ASP.NET Core Case Style
async method should suffix?
Razor Pages use async suffix
Web API don't use async suffix
Razor Pages handler
官网的例子是
/external-login?handler=AccessDenied
/customer?handler=delete
单字就 lowercase, 多字就 PascalCase
我个人觉得, 统一用 PascalCase 会更好.
JS / TS Case Style
class name = PascalCase
enum = PascalCase
property name = camelCase
variable = camelCase
parameter = camelCase
custom dom event name = lowercase (follow 原生)
localStorage key = camelCase
其它:
可传递函数 endswith Fn e.g. compareFn (这个是 follow Angular 的, 以前我是放 compareFunc 的)
要不要 window prefix ? window.setTimeout or just setTimeout ?
如果用 TypeScript 的话,setTimeout 和 window.setTimeout 是不一样的,window.setTimeout 返回的是 number 类型,setTimeout 返回的是 NodeJS.Timeout。
所以我目前的做法是用之前先 F12 看看
如果 NodeJS 有而且和 window 一样类型那些,那我就不写 prefix window。
如果 NodeJS 没有,或者类型和 winodw 不同,那就 prefix window。
想通过 eslint 管理, 可以参考这个 Github – Is there a rule that requires "window." when accessing global?
SQL Case Style
database name = PascalCase
table name = PascalCase (Singular)
column name = PascalCase
query = UPPERCASE
variable = PascalCase
trigger name for redundacy = TR_TableName_AfterInsert_ForRedundancy_TableName_ColumnName (第 1 个 table name 是被监听的, 第 2 个是冗余 table)
trigger name for cascade = TR_TableName_InsteadOfDelete_ForCascade_TableName (第 1 和第 2 table name 是一样的)
抽象的 array 和 object 命名
EPPlus 叫 foreach (var item in collection)
有些人叫 foreach (var obj in objects)
有些人叫 foreach (var data in dataList)
我选 EPPlus
HTML Id and Class Name
kebab-case
其它
cachedInfo (Angular Component)
cloned element (Angular Component)
sortingDisabled (Angular Component)
a 乘 b 我用 multiply 而不是 times (C# decimal.Multiply vs big.js times)
FileName and fileName 而不是 Filename and filename (Angular 两个都用但是 FileName/fileName 占多数, C# 用的也是 FileName)
Google Analytics event name = lower kebab-case
DateCreated, CreatedBy, DateModified, ModifiedBy (from Windows)
操作符号的命名
equals (Google Ads), equal to (Excel), =
not equals (Google Ads), not equal to (Excel), <> (Excel), !=, ≠ (alt 2260 | 8800, 都不可以的话就 看这里, copy 比较快)
contains
does not contain (结尾没有 s, Google Ads style)
starts with ^ (正则)
ends with $ (正则)
less than <
less than or euqal to <= (Google Ads, Excel), ≤
greater than >
greather than or equal to >= (Google Ads, Excel), ≥
between 0..2 (double dot, Dynamics 365 style), 0–2 (en dash), 0-2 (hyphen)
null, empty
个人觉得倾向 Excel 会不错
符号和命名
[] = brackets = square brackets
() = parentheses = round brackets
{} = culy brackets
<> = angle brackets or chevrons
- hyphen
– en dash (alt + 0150)
— em dash (alt + 0151)
° degree (alt + 0176)
² power 2 (alt 0178)
³ power 3 (alt 0179)
ⁿ power n (alt 252)
≥ greater than or equal (alt 242)
≤ less than or equal (alt 243)
trademark
trademark
≼ class extends
→ function return
の 之
ɵ theta,Angular 用它表示 internal 变量和函数
oData vs odata
它的名字是 OData, 遇到要 camelCase 的时候就变成 oData 但是看上去又有点怪, 于是就可能是 odata
查了一下源码发现 2 个他们都有用. 统一用 odata 吧.
当遇上 Acronym / Initialism 缩写
遇到 Acronym 缩写, 比如 NASA, RAM, ZIP 非常的烦.
很难 convert 的漂亮和有规范.
我们好好分析一下到底该怎样做,有哪些方便会收到影响.
眼睛分割
SystemIO, PersonDTO 如果缩写是在最后. 那么你会发现它没有那么碍眼.
CADDesigner, PersonDTOValidator 在前面和中间就非常碍眼, 关键就是分割不到.
CADDesigner DD 要分开,但是 2 个都大写, 眼睛就分不开了
PersonDTOValidator OV 要分开, 一样的问题.
可还原性
CADDesigner to TitleCase = CAD Designer (right)
Cad Designer to TitleCase = Cad Designer (wrong)
在转 TitleCase 的时候, 如果没有保留全大写, 转换结果是不理想的
Asp.net Core 默认行为
ASP.NET Core – Case Style Conversion
转 camelCase 时, 它会处理前面的缩写, 但后面的不会, .
CADDesigner -> cadDesigner, but PersonDTO -> personDTO
大家的建议
C# naming conventions for acronyms
如果是 2 个字母, 那么就保留大写, 比如 IO, 超过 2 个字母就变大小写
还有
目前的结果是
Acronym 在后面, 保留大写, 转换美美, 分割美美
Acronym 在中间, 保留大写, 转换美美, 分割丑丑
Acronym 在前面 camelCase, 一定是小写, 转换丑丑, 分割美美
Acronym 在前面 PascalCase, 保留大写, 转换美美, 分割丑丑
总结
在后面, 建议保留大写. 可转换, 分割也 ok
在中间, 可转换, 可分割, 2 选一, 平手
在前面, 如果是 camelCase 那转换是不可能的了, 只能是选可分割.
所以统一的话, 就是选可分割,但是不可转换 (TitleCase), 它的硬伤就是 camelCase 一定是小写开头, 缩写全都变小了, 可能不可还原了.
ID vs Id
微软的 SQL Server example 使用 ID
EF Core 用 Id
其它参考
我选 Id
lowercase vs lowerCase
ASP.NET Core Identity
RequireLowercase,RequireUppercase
JavaScript string extensions
.toLowerCase,.toUpperCase
双方不统一。我 follow 双方吧。
各大名词
有些名词是不规范的, 但如果遇到要自动 convert 的话, 建议还是 follow 规范比较方便. 这些是比较纠结的
YouTube: PascalCase: YouTubePlayer, camelCase : youtubePlayer (参考: Angular YouTube Player 源码)
我最讨厌这种不能 convert 的字, 所以我一律用 Youtube 而不是 YouTube
WhatsApp: PascalCase: WhatsApp, camelCase: whatsapp, camelCase: whatsAppNumber
它用在 kebab-case 的地方是 whats-app, 虽然很多人会用 whatsapp 但是不能 convert 很麻烦的, 所以我个人依然用 whats-app
Times vs Multiply
在用 big.js 时,它有 2 个一样功能的方法。
new Big(11).times(12);
new Big(11).mul(12);
mul 是 times 的别名
mul 是 alias 意味着 times 应该是 default 比 mul 多人使用,但是 mul 的人数肯定也不少,不然干嘛搞 alias。
C# 有个方法是
decimal.Multiply(11, 12);
我 research 了一下,最后看到了这个解释。
well, times is generally used in between two numbers, like "three times six" and multiply is usually used before them, so you would say "multiply three and six". you can put the two together and say " multiply three times six".
所以
new Big(11).times(12);
比较合理,而 C# 的 decimal.Multiply 也是对的。
Naming Conversion & Case Style 命名规范的更多相关文章
- Spring mvc 4系列教程(二)——依赖管理(Dependency Management)和命名规范(Naming Conventions)
依赖管理(Dependency Management)和命名规范(Naming Conventions) 依赖管理和依赖注入(dependency injection)是有区别的.为了将Spring的 ...
- 【翻译】苹果官网的命名规范之 Naming Properties and Data Types
苹果官方原文:Naming Properties and Data Types 前言:纯属练习英语和学习.翻译错误和不通顺的地方敬请谅解和指正.O(∩_∩)O 属性和数据类型的命名 本节讲述了属性定义 ...
- Python下划线与命名规范
Python下划线与命名规范 先看结论,节省只想知道答案你的宝贵时间: _xxx 不能用于from module import * 以单下划线开头的表示的是protected类型的变量.即保护类型只能 ...
- JS的组成部分、引入页面的方法以及命名规范
JS的组成部分.引入页面的方法以及命名规范 一.页面是由三部分组成 1)html标签(超文本标记语言) 2)css样式(层叠样式表) 3)javascript脚本编程语言(动态脚本语言) 二.将c ...
- 前端开发规范:命名规范、html 规范、css 规范、js 规范
上周小组的培训内容是代码可读性艺术,主要分享如何命名.如何优化代码排版,如何写好的注释.我们都知道写出优雅的代码是成为大牛的必经之路. 下面感谢一位前端开发小伙伴总结的前端开发规范,通过学习相关开发规 ...
- 前端开发规范:命名规范、HTML 规范、CSS 规范、JavaScript 规范
一个好的程序员肯定是要能书写可维护的代码,而不是一次性的代码,怎么能让团队当中其他人甚至一段时间时候你再看你某个时候写的代码也能看懂呢,这就需要规范你的代码了.我是有一点强迫症的人,上周我们后端给我了 ...
- 前端开发规范之命名规范、html规范、css规范、js规范
在学习编程的时候,每次看到那些整齐规范的代码,心里顿时对这个程序员表示点点好感,有时,比如看到自己和朋友写的代码时,那阅读起来就是苦不堪言,所以,一些基本的开发规范是必须的,是为了自己方便阅读代码,也 ...
- Java命名规范
驼峰法则: 将所有字母都小写(包括缩写),然后将单词的第一个字母大写. 每个单词的第一个字母都大写,来得到大驼峰式命名. 除了第一个单词,每个单词的第一个字母都大写,来得到(小)驼峰式命名. 为避免歧 ...
- JavaScript知识点总结(命名规范,变量的作用域)
命名规范 有人说JavaScript的宽容性是这个语言最糟糕的方面之一.比如说想把2个数字加在一起,JavaScript会把其中一个数字解析成字符串,那么就会得到一个奇怪的字符串,而不是2个数字的和. ...
- 浅谈Android编码规范及命名规范
前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...
随机推荐
- 基于MindSpore实现BERT对话情绪识别
本文分享自华为云社区<[昇思25天学习打卡营打卡指南-第二十四天]基于 MindSpore 实现 BERT 对话情绪识别>,作者:JeffDing. 模型简介 BERT全称是来自变换器的双 ...
- redis复制replica
通过查看log信息即可观察主机是否与从机正确连接,一般来说主机上有succeeded就是可以了 可以通过info replication查看自己的身份 role:master connected_sl ...
- 什么是web3 为什么web3很重要
中心化网络已经帮助数十亿人融入了互联网,并在其上创建了稳定.可靠的基础设施. 与此同时,少数中心化巨头几乎垄断了互联网,甚至可以为所欲为. Web3 是摆脱这一困境的方案. 不同于科技巨头垄断的传统互 ...
- 第一讲:日志系统:一条sql更新语句是如何执行的?
目录 第一讲:日志系统:一条sql更新语句是如何执行的? 回顾 抛出问题: 提出思路: 重要的日志模块:redo log 重要的日志模块:binlog 为什么会有两份日志呢? 这两种日志有以下三点不同 ...
- 【RabbitMQ】03 订阅模式
Pub / Sub 订阅模式 特点是 一条消息可以给多个消费者接收了 首先创建订阅模式生产者发生一些代码变动: package cn.dzz.pubSub; import com.rabbitmq.c ...
- pyqt报错、python报错:src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没有那个文件或目录
报错信息: -DNDEBUG -fwrapv -O2 -Wall -fPIC -O2 -isystem /home/devil/anaconda3/envs/91/include -fPIC -O2 ...
- 使用ChatGPT时的信息安全问题
ChatGPT由于其在对话方面的AI性能的卓越表现已经远远超越了同类的产品,因此赢得了国际科研领域的极大重视,并且也得到了广大用户的支持,但是在人们尽情使用的时候往往忘记了关于ChatGPT的信息安全 ...
- 有没有使用过MindSpore的,体验怎么样啊?
看到了一个帖子: https://www.zhihu.com/question/386352303/answer/3160948468 ================================ ...
- 如何在X86_64系统上运行arm架构的docker容器——(异构/不同架构)CPU下的容器启动
近期使用华为的人工智能集群,其中不仅要求异构加速端需要使用昇腾的硬件,更是要求CPU是arm架构的,因此就导致在本地x86电脑上难以对云端的arm版本的镜像进行软件安装和打包操作,为此我们需要在x86 ...
- 宝塔环境安装redis
参考: http://www.bt.cn/Help/Find?id=92 步骤: 1. 在安装宝塔时 PHP 版本选 7.0: 2. 安装 redis:wget http://125.88.182.1 ...