中文代码命名神器

3 篇文章 0 订阅
订阅专栏
3 篇文章 0 订阅
订阅专栏

你是否还在为代码命名而纠结不已?

here are only two hard things in Computer Science: cache invalidation and naming things.-- Phil Karlton

代码命名

那么如何更好的命名呢? 是否有好的工具可以支持我们命名呢?网上搜索一圈没有发现满意的,于是自己动手丰衣足食,https://jadepeng.gitee.io/code-naming-tool/。

使用方法: 打开网页后,在中文输入框中输入 中文命名,然后回车即可。也可以直接在英文输入框输入英文,搜索候选。

现有的工具

unbug.github.io/codelf/ 提供了一个选择,作者先调用有道、百度等翻译,然后调用searchcode搜索代码,从搜索的代码中提取变量名。

codeif

界面做的很酷,但是推荐出来的变量名称质量参差不齐,失去了参考意义。

新的思路

我们常说以史为鉴,换一个思路,我们可以从优秀的开源库中去吸收他们命名的经验,看看他们是如何命名的,来供我们参考。

实现思路:
1. 从spring、apache等代码库,读取变量、方法、类名称
2. 根据关键词匹配出候选命名
3. 候选结果排序

工具

获取优秀命名

要获取命名,首先想到的是读取代码库,需要先下载代码,然后解析 ———— 工作量巨大,PASS。

那怎么做呢,换个角度,可以通过java的反射来实现。

首先添加一个辅助库:

<dependency>
            <groupId>org.reflections</groupId>
            <artifactId>reflections</artifactId>
            <version>0.9.12</version>
        </dependency>

然后初始化Reflections,FilterBuilder可以用来过滤类库,我们设置"org",“javax”,“com”,“io”, 基本上囊库了主要的开源类库,比如spring,apache等.

 List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
        classLoadersList.add(ClasspathHelper.contextClassLoader());
        classLoadersList.add(ClasspathHelper.staticClassLoader());

        Reflections reflections = new Reflections(new ConfigurationBuilder()
                .setScanners(new SubTypesScanner(false), new ResourcesScanner())
                .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
                .filterInputsBy(new FilterBuilder().includePackage("org","javax","com","io")));

然后,可以通过reflections.getSubTypesOf(Object.class);来获取相关的class了,注意,我们初始化一个Map<String, Integer> name2count = new HashMap<String, Integer>();用来存储代码命名以及对应的出现次数。

Set<Class<? extends Object>> allClasses =
                reflections.getSubTypesOf(Object.class);
        Map<String, Integer> name2count = new HashMap<String, Integer>();
        for (Class<?> clazz : allClasses) {
            System.out.println(clazz.getName());
            try {
                appendToNameMap(name2count, clazz.getSimpleName());

                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {
                    String name = field.getName();
                    appendToNameMap(name2count, name);
                }
                Method[] methods = clazz.getMethods();
                for (Method method : methods) {
                    String name = method.getName();
                    appendToNameMap(name2count, name);
                    // parameters
                    Parameter[] parameters =  method.getParameters();
                    for (Parameter param : parameters) {
                        name = param.getName();
                        appendToNameMap(name2count, name);
                    }
                }
            }catch(Throwable t)
            { }

其中appendToNameMap:

 private static void appendToNameMap(Map<String, Integer> name2count, String name) {
        // filter
        if(name.contains("-") || name.contains("_")|| name.contains("$")){
            return;
        }

        if (!name2count.containsKey(name)) {
            name2count.put(name, 1);
        } else {
            name2count.put(name, name2count.get(name) +1);
        }
    }

最后把结果存储到文件,作为我们的资源。

FileUtils.writeAllText(JSON.toJSONString(name2count), new File("name2count.txt"));

可以到https://gitee.com/jadepeng/code-naming-tool/blob/master/vars.js查看结果。

命名推荐

命名推荐,还是遵循,先翻译,然后根据翻译结果搜索并召回。

其中翻译直接调用网易有道的,但是搜索如何搞定呢?

最简单的方法,肯定是分词,然后建立索引,lucene是标配。但是上lucene就要上服务器,PASS!

我们来找一个浏览器端的lucene,google 后选定flexsearch.

flexsearch

flexsearch github上有6.5k star,因此优先选择。

下面来看具体的实现。

建立索引

初始化FlexSearch,然后将之前获取的代码命名建立索引。

 var index = new FlexSearch({
            encode: "advanced",
            tokenize: "reverse",
            suggest: true,
            cache: true
        })
        var data = []
        var i = 0
        for (var name in names) {
            var indexName = name.replace(/([A-Z])/g, " $1")
            data[i] = {
                "name": name,
                "count": names[name]
            }
            index.add(i++, indexName)
        }

这里有个小技巧,name.replace(/([A-Z])/g, " $1") 可以将驼峰命名拆分成单词。
同时data数组会保存所有的命名和响应的出现次数。

搜索候选

先翻译,然后将翻译结果给FlexSearch搜索。

function searchFromIndex(value) {
        var results = index.search(value, 25)
    
        results = results.map(function (i) {
            return data[i]
        })
    
        results = results.sort(function (a, b) {
            return b.count - a.count
        })
        return results
    }

先搜索,出来的结果是data中的index序号,转换为list对象,然后按照count倒排。

tips: 理论上,翻译的结果可以去除一些停用词,搜索效果应该更好,这里先放着。

显示结果

对结果进行格式化:

function formatSuggestion(item){
    return `${item.name} <span class='tips'>代码库共出现${item.count}次 (相关搜索: <a target='_blank' href='https://unbug.github.io/codelf/#${item.name}'>codelf</a> &nbsp; <a target='_blank' href='https://searchcode.com/?q=${item.name}&lan=23'>searchcode</a>)</span>`;
}

增加到codelf 和 searchcode的链接,显示结果如下:

搜索结果

开源地址

  • github: https://github.com/jadepeng/code-naming-tool
  • gitee: https://gitee.com/jadepeng/code-naming-tool

命名工具地址: https://jadepeng.gitee.io/code-naming-tool/

欢迎大家体验使用,欢迎fork并贡献代码。

后续展望

当前仅仅用到了翻译+搜索,还有很多可以优化的地方:

  • 搜索去停用词
  • 从文本语义相似度层面去推荐
  • 专业术语支持
gridsome-plugin-flexsearch:使用FlexSearch将闪电般的快速搜索添加到Gridsome
05-05
网格体插件flexsearch 使用FlexSearch将闪电般的快速搜索添加到Gridsome- 目录: 安装 要求Node版本> = 12.x,并且至少需要Gridsome v0.7.3 ,版本>= 0.1.21要求Gridsome> 0.7.15 。 yarn add gridsome-plugin-flexsearch # or npm i gridsome-plugin-flexsearch gridsome.config.js module . exports = { // ... plugins : [ { use : 'gridsome-plugin-flexsearch' , options : { searchFields : [ 'title' ] , collections : [
中文莫尔斯电码表.txt
07-19
 中文电码表采用了四位阿拉伯数字作代号,从0001到9999按四位数顺序排列,用四位数字表示最多一万个汉字、字母和符号。汉字先按部首,后按笔划排列。字母和符号放到电码表的最尾。后来由于一万个汉字不足以应付户籍...
云文档托管方案分析
Rain_Mic的博客
11-14 1121
文章目录一、前言二、网页生成器的选择2.1 VuePress2.2 Sphinx2.3 Docusaurus2.4 结论三、支持全文搜索3.1 VuePress 自带插件3.1.1 vuepress-plugin-fulltext-search3.1.2 vuepress-plugin-flexsearch3.2 第三方免费搜索服务 Algolia DocSearch3.3 结论四、生成 PDF 文档的方案4.1 使用 Sphinx4.2 mdpdf4.3 markdown-pdf4.4 Pandoc +
神器在手,代码命名从此高大上!
张巧龙的博客
09-28 700
有一些小伙伴,在进行变量命名的时候,对于自己熟悉的英文,可能还会用英文命名一下,如果需要命名的部分不会用英文表达,或许就直接用拼音了。比如,项目中需要命名一个变量叫做温度...
探索 Cerebro Codelf:一款智能代码查找与命名工具
最新发布
gitblog_00024的博客
03-27 367
探索 Cerebro Codelf:一款智能代码查找与命名工具 项目地址:https://gitcode.com/carlos-wong/cerebro-codelf Cerebro Codelf 是一个基于 Cerebro 插件系统的强大工具,旨在帮助开发者快速找到所需的代码片段,以及为变量和函数提供合适的命名建议。它集成了多个开源代码搜索引擎,如 GitHub、Stack Overflow、G...
编程英文命名参考网站
kuilaurence的博客
11-06 3370
遇到一个词组需要规范命名,可以参考 https://unbug.github.io/codelf/ 示例:缓存
中文编程命名
乘风龙王的开发博客
03-06 1202
本人不喜欢英语(四级没过...), 所以一直用中文代码, 除了关键字和别人写的库, 剩下的都是中文. 说实话, 我看着满屏的中文觉得挺舒服的. 久而久之也发明了一套中文编程命名法, 以中文为主, 英文用来做标记提高可读性. 偷懒原则 有时候为了偷工减料, 可以使用一些比较短的名字. 比如: int a, b, c;//偷了个懒 变量/常量 变量名统一用v开头命名. 常量我分成
中文电码库(很全的)!
04-11
中文电码库(很全的)!
中文电码查询翻译工具
03-30
一款中文标准电码查询工具, 可以双向互译,并能管理译本
moers.rar_莫尔斯电码
07-13
想学习下莫尔斯电码的,可以详细看看此文档。
flexsearch:用于Browser和Node.js的下一代全文搜索库
02-03
预览v0.7.0-rev2 在转到主分支之前,新版本的预览在分支“ 0.7.0”中可用了一个月(或在需要时提供更多)。 当您可以在这段时间内在现有项目中测试即将发布的版本的集成并给我一些反馈时,这将非常有帮助。 迁移功能分支实际上存在一些大问题,因此我将按其依赖项将它们一一发布: 发布组A(已发布) 源转换为本地ES6模块 生产就绪的本机ES6模块(在“ dist / module /”内) 新的捆绑器,更好的定制 改进的基准套件 改善性能 较小的文件大小 WebWorker不可用(将返回到D组) 发行组B(已发行) 完全分离特定语言的逻辑(那是最大的问题) 新语言处理程序 语言包由一个字符集模型(编码器,拆分)和一个语言模型(词干,停用词)组成 发行组A / B(rev2) 通过控制反转支持超可定制的编码器管道 默认提供可定制的通用管道 所有高级编码器的性能均得到极大提升 结合正则表达式(匹配器,词干分析器)可大大提高性能 支持高性能的soundex编码(latin:soundex) 发布组C(未发布) 新的核心由“文档模型”和“索引模型”组成(这
自主创作的代码编写变量命名工具
04-11
利用百度翻译api,基于python制作的一款涉及驼峰法、下划线法常用变量命名的生成小工具。
批量重命名(源代码
11-05
批量重命名(源代码
批量命名工具 v1.0.2.zip
07-13
批量命名工具是一款文件批量重命名工具,可以帮你完成一个文件夹内所有文件的批量命名,界面非常简洁,使用方便。 批量命名工具功能介绍: 1.支持给一个文件夹内的所有文件的文件名后加文字 2.支持给文件名第几位加文字 3.支持文件名前减几位 4.支持文件名后减几位 5.支持文件名第几位开始减去几位 6.支持含有某些文字的文件名删除这些文字 软件截图
flexsearch-server:适用于Node.js的高性能FlexSearch服务器(集群)
02-05
适用于Node.js的高性能FlexSearch Server 可在此处找到FlexSearch的完整文档: 集群(垂直缩放) FlexSearch Server实际上使用Node.js群集和连接池来平衡所有通过工作进程的传入负载。 工作者的性能提升取决于索引的复杂性以及查询花费的时间。 在大多数情况下,残疾工人的表现要好得多,例如: 单线(每秒请求数) 簇(每秒请求数) 查询时间<10> 1000毫秒 114 1041 注意: 10毫秒的查询时间已经基于较大的索引。 分片/复制(水平缩放) 基本上,当前代码库具有在水平方向上也进行缩
matlab摩尔斯电码
03-19
微信小程序详细图文教程 泉州大白网络科技 目录 一.微信小程序申请 二....1.申请服务器 2.部署服务器 3.域名申请和配置 三....一....申请,并认证(未认证不能发布,认证需要300元,目前只支持企业认证)详细见官网说明。...
前端技术周刊 2019-02-11 Serverless
weixin_34059951的博客
02-12 81
前端技术周刊 2019-02-11 前端快爆 Chrome 72 的安卓版正式启用了Trusted Web Activity 功能,可以使得一个 PWA 应用能够在 Google Play Store 中得以被分发。
程序员还在为变量取名苦恼,那是因为你不知道,这个变量命名神器
成长的足迹
11-30 9947
作为程序员,变量命名应该是我们编程的开端,也是我们每天都必须需要做的事情。变量命名规范的重要性,相信大家都知道非常重要。
MFC 输入中文,输出摩尔斯电码
05-29
我们可以将中文字符与摩尔斯电码一一对应,然后将输入的中文字符串进行遍历,逐个将中文字符转换为对应的摩尔斯电码,最终输出整个字符串的摩尔斯电码序列。 以下是一个简单的示例代码: ```c++ void ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 酷狗歌曲缓存kgtemp转mp3工具 75703
  • OFFICE 文档转换为html在线预览 14526
  • 开源工具软件XMusicDownloader——音乐下载神器 4377
  • 中文代码命名神器 2193
  • weex官方demo weex-hackernews代码解读(下) 1374

分类专栏

  • 移动开发 3篇
  • 后台开发 2篇
  • 开源程序 3篇

最新评论

  • 开源工具软件XMusicDownloader——音乐下载神器

    Doren ring star: 太有用了。现在网上很多音乐都要用会员

  • 酷狗歌曲缓存kgtemp转mp3工具

    #Page#: 又不行了,能继续解密吗?

  • OFFICE 文档转换为html在线预览

    javaxiaobai18: 求代码

最新文章

  • 比Selenium更优秀的playwright介绍与未来展望
  • 开源基于docker的任务调度器pipeline,比`quartzs` 更强大的分布式任务调度器
  • 开源工具软件XMusicDownloader——音乐下载神器
2024年1篇
2021年1篇
2020年1篇
2019年1篇
2017年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

4617作文网周公解梦梦见旧衣服造梦西游破解版内购破解版沈姓小孩起名周公解梦梦见绿色的蛇哆啦a梦简笔画步骤图解诗词起公司名大全梦幻花园破解版在哪下周口市公共交易资源中心周易起名称网给姓胡的起名字姓魏起名字男孩免费工艺品公司起名的海南梦册解码查询周公解梦吉凶书使用琛起名字周易六十四卦灵签薛姓姑娘起名参考萱字起名大全属龙的女孩取名周易钻探公司起名神也佑我起个名字现代周公解梦大全查询12319周岁办什么信用卡容易下来怎么根据生辰八字起名确定笔画数店铺起名起名字给游戏角色起名属猪宝宝取名起名大全禁忌周易起名测试分析打评分周易生辰八字取名app梦到着火是什么意思周公解梦淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男子给前妻转账 现任妻子起诉要回网友建议重庆地铁不准乘客携带菜筐月嫂回应掌掴婴儿是在赶虫子重庆警方辟谣“男子杀人焚尸”国产伟哥去年销售近13亿新的一天从800个哈欠开始男孩疑遭霸凌 家长讨说法被踢出群高中生被打伤下体休学 邯郸通报男子持台球杆殴打2名女店员被抓19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警两大学生合买彩票中奖一人不认账德国打算提及普京时仅用姓名山西省委原副书记商黎光被逮捕武汉大学樱花即将进入盛花期今日春分张家界的山上“长”满了韩国人?特朗普谈“凯特王妃P图照”王树国3次鞠躬告别西交大师生白宫:哈马斯三号人物被杀代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了房客欠租失踪 房东直发愁倪萍分享减重40斤方法“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火手机成瘾是影响睡眠质量重要因素考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼网友洛杉矶偶遇贾玲呼北高速交通事故已致14人死亡西双版纳热带植物园回应蜉蝣大爆发男孩8年未见母亲被告知被遗忘张立群任西安交通大学校长恒大被罚41.75亿到底怎么缴沈阳一轿车冲入人行道致3死2伤奥运男篮美国塞尔维亚同组周杰伦一审败诉网易国标起草人:淀粉肠是低配版火腿肠外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万杨倩无缘巴黎奥运男子被猫抓伤后确诊“猫抓病”春分“立蛋”成功率更高?记者:伊万改变了国足氛围奥巴马现身唐宁街 黑色着装引猜测

4617作文网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化