当前位置: 首页 > news >正文

冷算法:自动生成代码标识符(类名、方法名、变量名)

竟然有小伙伴喜欢在编写代码时使用随机字符当作类名、方法名、变量名,例如这一篇博客里的代码:使用 Resharper 特性 - 林德熙。既然随机,那也随机得像一些啊!于是我改进了标识符的随机算法,使得生成的标识符更像真实单词的组合。


看看标识符的生成效果吧!0、2、4……行是 PascalCase,即首字母大写的;1、3、5……行是 camelCase 即首字母小写的。

自动生成的标识符
▲ 是不是感觉甚至能读出来?

嗯嗯,因为生成规则中考虑到了辅音和元音的组合,而且……嗯……还考虑到了部件出现的概率。

比如一个单词中的音节数,单音节概率 44%,双音节概率 31%,三音节概率 19%,四音节概率 6%。而这样的概率是通过一个幂函数来实现的。具体来说,是下面这个函数:

音节数

好吧,把我的源码放出来:

public class RandomIdentifier
{
    private readonly Random _random = new Random();

    public string Generate(bool pascal)
    {
        var builder = new StringBuilder();
        var wordCount = _random.Next(2, 4);
        for (var i = 0; i < wordCount; i++)
        {
            var syllableCount = 4 - (int) Math.Sqrt(_random.Next(0, 16));
            for (var j = 0; j < syllableCount; j++)
            {
                var consonant = Consonants[_random.Next(Consonants.Count)];
                var vowel = Vowels[_random.Next(Vowels.Count)];
                if ((pascal || i != 0) && j == 0)
                {
                    consonant = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(consonant);
                }

                builder.Append(consonant);
                builder.Append(vowel);
            }
        }

        return builder.ToString();
    }

    private static readonly List<string> Consonants = new List<string>
    {
        "q","w","r","t","y","p","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m",
        "w","r","t","p","s","d","f","g","h","j","k","l","c","b","n","m",
        "r","t","p","s","d","h","j","k","l","c","b","n","m",
        "r","t","s","j","c","n","m",
        "tr","dr","ch","wh","st",
        "s","s"
    };

    private static readonly List<string> Vowels = new List<string>
    {
        "a","e","i","o","u",
        "a","e","i","o","u",
        "a","e","i",
        "a","e",
        "e",
        "ar","as","ai","air","ay","al","all","aw",
        "ee","ea","ear","em","er","el","ere",
        "is","ir",
        "ou","or","oo","ou","ow",
        "ur"
    };
}

而使用方法,则是简单的一个调用:

var identifier = new RandomIdentifier();
var pascal = _identifier.Generate(true);
var camel = _identifier.Generate(false);

传入 true 生成首字母大写的版本,传入 false 生成首字母小写的版本。

相关文章:

  • WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则
  • Git 更安全的强制推送,--force-with-lease
  • 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)
  • 理解 C# 项目 csproj 文件格式的本质和编译流程
  • 如何创建一个基于命令行工具的跨平台的 NuGet 工具包
  • 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包
  • 如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference)
  • 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译
  • C# 中那些可以被重载的操作符,以及使用它们的那些丧心病狂的语法糖
  • 神器如 dnSpy,无需源码也能修改 .NET 程序
  • Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • 微软 Windows 系统检测网络连通性(用于显示感叹号)竟然是通过访问一个特殊网址来实现的
  • 如何根据一个绝对文件路径生成一个相对文件路径
  • 如何使用 MSBuild Target(Exec)中的控制台输出
  • 《Java编程思想》读书笔记-对象导论
  • Angular 2 DI - IoC DI - 1
  • cookie和session
  • CSS 三角实现
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • PHP 7 修改了什么呢 -- 2
  • SpiderData 2019年2月16日 DApp数据排行榜
  • springMvc学习笔记(2)
  • vue:响应原理
  • 模型微调
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 以太坊客户端Geth命令参数详解
  • ionic异常记录
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (13)Hive调优——动态分区导致的小文件问题
  • (23)Linux的软硬连接
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (pojstep1.1.2)2654(直叙式模拟)
  • (独孤九剑)--文件系统
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (七)Knockout 创建自定义绑定
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (一)VirtualBox安装增强功能
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)从 Java 代码到 Java 堆
  • .Net环境下的缓存技术介绍
  • @vue/cli脚手架
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [Asp.net mvc]国际化
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体
  • [C++]STL之map
  • [C++提高编程](三):STL初识
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • [LeetCode]—Add Binary 两个字符串二进制相加
  • [ListView.View=List]的垂直滚动条
  • [one_demo_2]使用正则表达式过滤字符串