最近阅读了一套ERP开发框架的源代码,对开发框架的理解又深入一层,也为其将知识点运用的如此灵活而自叹不如。

郎咸平教授说,国际金融炒家对国际金融知识的理解与运用程序,是不可想像的。1997年的亚洲金融危机,国际金融炒家对香港的攻击是卖空港币,但是最后却反应到股票市场,惨败。同理,开发高手将系统的知识点,运用的相当灵活,你完全没有想过可以按这种方式做出程序,灵活简便,维护方便。

1  .NET组件自动重命名

在Windows Forms开发,经常遇到一件头疼的事情是一个Form界面有很多控件,而这些控件的名称(Name)很难维持命名统一。比如,开发规范里面说,要给所有的Button命名为以btn开发。如果界面中有二个按钮,确定和取消,那么可以按照规范,为之命名为btnOK,btnCancel。再扩展到其它的控件,都应该遵守这样的前缀命名法。

经过整理,形成下面的表格规范

控件 前缀 举例
Button btn btnOK
ListView lst lstProject
Label lbl lblUserName
Combox cmb cmbProjectType
TextBox txt txtUserId
CheckBox chk chkEnable
GridView grid gridProduct

当一个页面中有很多控件时,如何保证控件命名,还是这样的规范呢?

一种办法是有专门的代码检查,俗称Review,经常的花时间去改善代码,维护代码。从基本的命名上检查,修改,以符合规范。另一种方法就是我从高手的代码中学到的,解释如下。

当你给一个按钮绑定资料库字段或是修改它的Label/Text/Caption属性时,加入设计时支持,用这个名字来替换无规律的命名。比如,拖一个按钮Button控件到窗体中,它的名称是Button1, 这时修改它的Text=OK, 回车确认。这里我截获了控件的属性修改事件,于是修改控件Button1的名字为btnOK。数据绑定属性也是一样,截获绑定的数据成员的名称,再依据它来修改控件的名称,比如下面的一段代码所示

private Foundation.WinUI.Misc.Label lblDbPassword;
private Foundation.WinUI.Editors.TextEditor txtDbUser;
private Foundation.WinUI.Misc.Label lblDbUser;
private Foundation.WinUI.Editors.TextEditor txtDbDatabase;
private Foundation.WinUI.Misc.Label lblDbDatabase;
private Foundation.WinUI.Editors.TextEditor txtDbServer;
private Foundation.WinUI.Misc.Label lblDbServer;
private Foundation.WinUI.Misc.GroupBox grpConnectionParameter1;
private Foundation.WinUI.Editors.Grid grid;

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

对这些控件的名称,我没有任何的修改,只是对它绑定数据属性,框架会自动根据数据源的属性名称,进行修改,所以看起来规范程度高,完全不需要人为的来执行规范。设想一下,当系统中的窗体很多,控件数量大的时候,这种智能的命名方法是多么的有效率,将代码规范贯彻到底。

这则技巧的实现方法是注册组件改变事件(ComponentChanged),如下面的代码所示

this.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService
 
 

2 .NET Remoting 服务器端对象自动化配置

先来看一下,基本的.NET Remoting是如何配置开发的。

先开发服务器对象,即是要暴露给客户端的对象

public class MyObject:MarshalByRefObject
{
public int Add(int a,int b)
{
return a+b;
}
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

服务器端把它激活,供客户端连接进来调用

[STAThread]
static void Main(string[] args)
{
RemotingConfiguration.Configure("RemoteServer.exe.config");
Console.ReadLine();
}
 

因为这样的代码很节省,所以还需要在配置文件中作出如下的配置

<configuration>
<system.runtime.remoting>
<application name="RemoteServer">
<service>
<wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject"
mode="Singleton" />
</service>
<channels>
<channel ref="tcp" port="9999"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

客户端代码,调用.NET Remoting服务

[STAThread]
static void Main(string[] args)
{
RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
Console.WriteLine(app.Add(1,2));
Console.ReadLine();
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

同样,还是需要作出配置才能使上面的代码生效。

<configuration>
<appSettings>
<add key="ServiceURL" value="tcp://localhost:9999/RemoteObject.MyObject"/>
</appSettings>
</configuration>

 

我提出问题,如果要增加一个服务器端对象MyObjectB,对上面的代码,需要修改几个地方?

增加代码(服务实现和服务接口的调用)是必须的部分,不可少,另外需要修改的地方:

1  服务器端的配置文件,增加服务接口

2  客户端的配置文件,增加对服务的引用

但是,开发高手给的答案是零修改,增加一个服务,对服务端或客户端不需要作出任何的修改。

如何做到这一点呢,著名的.NET通讯组件RemObjects ,它提供了一个通用的GUI工具,用于根据服务端的接口,生成客户端的代码,依照这一点思路。我们可以考虑做一个工具。增加一个服务器端对象后,为了让它暴露出来可用,要修改的地方是两个配置文件,所以,我只需要当有新的服务器端对象要暴露出来时,运用这个GUI工具,自动完成二个配置文件的修改,即可达到零修改。而且用工具的好处是不会出错,即方便又有效率。

我以为这两个思路确实不错,能让系统的可读性增强,又提高工作效率。

阅读开发高手的代码 分享二则.NET开发框架的技巧的更多相关文章

  1. 【好程序员笔记分享】——iOS开发之纯代码键盘退出

    -iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之纯代码键盘退出(非常简单)     iOS开发之纯代码键盘退出 前面说到了好几次关于键盘退出的,但 ...

  2. Android开发高手课NOTE

    最近学习了极客时间的<Android开发高手课>很有收获,记录总结一下. 欢迎学习老师的专栏:Android开发高手课 内存优化 卡顿的原因 频繁 GC 造成卡顿.物理内存不足时系统会触发 ...

  3. JAVA基础代码分享--DVD管理

    问题描述 为某音像店开发一个迷你DVD管理器,最多可存6张DVD,实现碟片的管理. 管理器具备的功能主要有: 1.查看DVD信息. 菜单选择查看功能,展示DVD的信息. 2.新增DVD信息 选择新增功 ...

  4. .net之工作流工程展示及代码分享(三)数据存储引擎

    数据存储引擎是本项目里比较有特色的模块. 特色一,使用接口来对应不同的数据库.数据库可以是Oracle.Sqlserver.MogoDB.甚至是XML文件.采用接口进行对应: public inter ...

  5. Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享

    Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑&qu ...

  6. 外贸建站之图片预加载JS代码分享

    外贸建站之图片预加载JS代码分享 function preloadimg() { setTimeout(function() { new Image().src = "images/2017 ...

  7. SharePoint 压缩打包文件代码分享

    前言 最近碰到这样一个需求,用户需要批量打包下载sharepoint文档库中的文档,所以,就需要开发一个打包下载的服务. 然后,把打包的代码分享给大家,也许会有需要的人. static void Ma ...

  8. Android开发中使用代码删除数据库

    更多信息参考:Android开发中使用代码删除数据库 在Android开发中,如果用到数据库,就会有一个很麻烦的问题,就是有时候需要删除数据库很麻烦,要打开Android Device Monitor ...

  9. Tinyhttpd - 超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client(Qt也有很多第三方HTTP类)

    - 2. Tinyhttpd tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Htt ...

随机推荐

  1. HttpClient请求网络数据的Post请求

    new Thread(){            public void run() {                                try { //获得输入框内容          ...

  2. SQL保留关键字不能用作表名

    com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'User' 附近有语法错误. 一看就是SQL语句错误,发现控制台console上打印出来的S ...

  3. coreseek实战(四):php接口的使用,完善php脚本代码

    coreseek实战(四):php接口的使用,完善php脚本代码 在上一篇文章 coreseeek实战(三)中,已经能够正常搜索到结果,这篇文章主要是把 index.php 文件代码写得相对完整一点点 ...

  4. ABP的工作单元

    http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work 工作单元位于领域层.   ABP的数据库连接和事务处理: 1,仓储类 ASP ...

  5. lsslot

    lsslot 命令 用途 显示动态可重新配置的插槽(比如热插拔)及其特性. 语法 lsslot -c ConnectorType [ -a | -o | -l DeviceName | -s Slot ...

  6. Hibernate框架—简介

    ORM对象/关系数据库映射 ORM全称Object/Relation Mapping,对象/关系数据库映射,可以理解成一种规范.该框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射. ORM ...

  7. who is the middle

    Description FJ is surveying his herd to find the most average cow. He wants to know how much milk th ...

  8. Java实现批量下载《神秘的程序员》漫画

    上周看了西乔的博客“西乔的九卦”.<神秘的程序员们>系列漫画感觉很喜欢,很搞笑.这些漫画经常出现在CSDN“程序员”杂志末页的,以前也看过一些. 后来就想下载下来,但是一张一张的点击右键“ ...

  9. 再见Unity3d的死循环

    前两天看见http://www.manew.com/thread-89909-1-1.html这篇译文之前几个小时刚好解决了一个莫名的死循环问题,然后忍不住要把另外一种方法告诉蛮友们.这个方法不需要知 ...

  10. C# 数据类型与PostgreSQL 数据类型映射

    Npgsql 是基于ADO.NET 的PostgreSQL 数据驱动. Npgsql 官方 已经提供C# 数据类型与PostgreSQL数据类型的对应映射 地址: http://www.npgsql. ...