C#编码简单性之语义篇(如何编写简短的C#代码,随时更新)

简介:

 

以前写C++的时候曾经在自己网站上发表过一个编码“简单性”之文章,现在编写C#了才发现自己无意之间就会写下一些浪费屏幕的代码。
下面是自己编码中偶然发现的一些案例,欢迎中等水平的编程者参考。因为要积累案例,所以随时更新。

--------------------------------------------------------------------------------
从语义角度看编码简单性的“心法”就是:只要屏幕上有需要思量一下的代码,则一定有办法简化。
所谓语义,就是“用人的思维理解的代码的含义”。机器很容易懂a = b + c /3 * 2 ^3.14,但人就要想想这到底是想干什么。尤其如果新手写的程序,老手居然看不懂,那就是语义出了问题。

--------------------------------------------------------------------------------
案例1
这个是我一位朋友在研究生开卷考试中遇到的:编写一个函数求三个整数中的最大值。
因为当时刚学C++,所以他的答案可以变成另外一道题:这个函数的目的是什么?(如果不看函数名)
原来是:
public int Max(int a, int b, int c)
{
if (a > b)
{
if (a > c)
return a;
else
return c;
}
else
{
if (b > c) //有人还能把这里写成 c < b,也对,但更乱
return b;
else
return c;
}
}
 
正解是:
public int Max(int a, int b, int c)
{
return Max(Max(a, b), c);
}
public int Max(int a, int b)
{
return (a > b) ? a : b;
}
 
后者并没有节省多少代码,但却更容易理解,中真正亮点其实是Max(Max(a, b), c)中的两个Max,很好地用人类语言解释了自己想干什么。
案例2
01年做IC卡的时候遇到的一个:“卡号0X9999的顾客加入了卡组0X1234”原代码:
“蛮力”编码:
char cmd[46];
cmd[0]=0x04;
cmd[1]=0xF0;
cmd[2]=0x3C;
cmd[13]=0x99;
cmd[14]=0x99;
cmd[21]=0x12;
cmd[22]=0x34;
cmd[45]=0x00;
后来变成:
char *cmd=“04F03C……9999……1234……00”
当然要处理一下才能给卡片读取。
这个符合做IC卡的人的习惯(他们喜欢暴露的人能阅读的指令),但不符合编VC++的人的喜欢,所以后来有了:
AddICtoCG(9999, 1234)
以及符合测试人员的纯TXT伪码:
IC9999 CG1234
乃至伪码群:
nIC11 CG21 PG12 P140
n CG34 PG22 P143
n CG45 P23
n PG13 P121
这些简化工作花费了大约1周的时间(包括一个将伪码群编辑器,以及将分解为单条指令发送给IC卡的软件),但后来的工作因此变得非常简单。
案例3
同期的工作,生成或解析授权码流。原代码:
szData[0] = szData[0] & (0xFF - 0x03) + nType & 0x03;
……以下省略大约1000行
非常疯狂的一段代码,但却由一位非常丰富经验的程序员写成(他是我们在1.5年里筛选4000份简历后找到的最好的前5个人之一,他后来解释说想先调试通过了,再封装。所以老虎也有打盹的时候啊),结果是2个月的工作被完全放弃。
2周后变成:
新代码大约有400行,其中CPack 和CKit的加起来是110行,开发时间是原来的1/4。
改好这段代码后,我们定了个制度:所有代码完成后均必须交由上级经理检查后方可进入代码库。这个工作的工作量庞大,但公司之后若干年上市了,市场占有率为国内的60%。6年后聚会的时候提到了我原来编写的7个模块,很高兴地知道其中5个还在使用和维护,因为整体上它们都很短小简单易于后继者理解。
总结一下就是代码整体上是写给人看的而不是写给机器看的,不能以编译通过来作为判断标准。
从语义的角度理解代码简单性,就是无论代码长短,放眼望去就知道在干什么,就是简单的代码。
nCPack Pack(szData);
nPack << CKit(nType, 3) //程序说:我要把码流的Type占3bit放进码流去。
n << CKit(nLength, 4) //程序说:我要把码流长度占4bit放进码流去。
n << CKit(bReserved, 1) //程序说:为了对齐字节,跳过一位吧。
n << CKit(nCode, 16)
n……
n << CKit(dwCRC, 32);

本文转自火星人陈勇 51CTO博客,原文链接:http://blog.51cto.com/cheny/1100072

相关文章
|
2月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
156 2
|
2月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
97 2
|
2月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
43 0
|
2月前
|
存储 C#
C#使用哈夫曼编码实现压缩与解压
C#使用哈夫曼编码实现压缩与解压
40 0
|
4月前
|
物联网 C# Windows
看看如何使用 C# 代码让 MQTT 进行完美通信
看看如何使用 C# 代码让 MQTT 进行完美通信
649 0
|
4月前
|
开发者 C# Android开发
Xamarin 与 .NET:解锁现代化移动应用开发的超级武器——深入探讨C#与.NET框架如何赋能跨平台应用,实现高效编码与卓越性能
【8月更文挑战第31天】Xamarin 与 .NET 的结合为开发者提供了强大的平台,用于构建现代化移动应用。通过 C# 和 .NET 框架,Xamarin 可以实现一次编写、多平台运行,覆盖 iOS、Android 和 Windows。这种方式不仅节省了开发时间和成本,还保证了应用的一致性和高质量。Xamarin 是一个开源框架,专为跨平台移动应用开发设计,允许使用 C# 语言和 .NET 核心库构建原生应用,并访问各平台特定功能。微软维护的 Xamarin 是 Visual Studio 生态系统的一部分,极大地提高了开发效率。
93 0
|
4月前
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
59 0
|
4月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
117 0
|
4月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
481 0
|
4月前
|
C#
C# 跳过值班时间代码逻辑
C# 跳过值班时间代码逻辑
36 0