用Helper对类的行为进行修饰以便复用(附:外三篇)

简介:

本文是 代码“中间地带”的封装与复用 的后续。

 

咱不谈设计模式这种“高档”货,也不谈M××,只谈怎么消除Copy+Paste,消除拖窗体设置属性这类耗时、易错的动作。

前些天和我徒弟聊天,他沾沾自喜的说他一天要写500行css,俺打击他说,啥时候他一天写到100行时才算悟了。

 

写代码就是一个由多到少的过程:

(1)见山是山时,一天能写1000行,大量的Copy+Paste,这叫代码迷宫

(2)见山不是山时,一天能写500行,Copy+Paste变成了大量的设计模式,这叫类的迷宫,Java程序尤其擅长这个,搞得我现在不敢看Java程序了。开个玩笑,重构到模式,实际上是从一种垃圾(代码迷宫)重构到另一种垃圾(类的迷宫)

(3)见山还是山时,一天能写100行,回归本源

 

先描述一个很常见的 Copy+Paste 场景:为客户端程序添加NotifyIcon,当关闭窗体时,窗体消失,缩小到托盘,双击托盘图标,则窗体又重现。

对于这一需求,msdn 的样例如下:

ContractedBlock.gif Code

 

于是,我们开发Client程序时,当需要这一功能,就把这样的代码复制过来,改吧改吧就完成了。

复制粘贴很恶心,一次两次还好,次数多了自己就烦了。并且这样一来,导致代码量膨胀——功能一多,一个Form的代码量就近千行,很不方便测试和维护。因此,有必要进行抽象和复用。

这种抽象,属于对类的局部行为进行修饰(设计模式放在括号里谈,不想看的可以忽略——它不同于Mediator,也不同于Wrapper,一时也想不出好的名字),就叫Helper了。单纯的Helper又体现不出具体的意图,俺就命名为FormConfig。下面是 FormConfig 的代码:

ContractedBlock.gif Code

 

使用起来很简单:

ContractedBlock.gif Code

 

其实这个还可以简化,因为毕竟还要声明一个FormConfig,再new一个,再Attach一下子,3行代码。进一步偷懒的话可以设计一个扩展方法,然后把FormConfig实例放在一个公共对象中进行管理,当Form退出时,再在公共对象中置空FormConfig。就不写代码了,简化到目前这个地步,俺已经满足了。

 

== 附外3篇 ==

 

下面这两篇和上面的这篇都是昨天晚上写的。第一篇是对这一段时间代码整理的总结,有点私人化。第二篇是讲通用验证码识别的一个思路,不是完整的文章,同时……又涉及点技术秘密,没办法完全透露。再附一篇完全搞笑的。

 

附1:代码整理的总结

 

搞了四个月的工作室,失败了,散了,好在成本严格控制住了,也没亏多少,最大的收获就是得到了证实——此路不通。

还是坚持当IT宅男,坚持向产品和高端转型,增强竞争优势。我希望投资回报是一条上升的线,而不是一条下降的线。

 

于是最近做的事情主要是整理代码和复习和学习数学。今后将玩数学了,主要做数学密集的应用。(看现在经济形势,10年内会新出现7000万白领,会减少7000万蓝领,蓝领的平均工资将于白领持平。国内又提供不了这么多白领岗位,IT界的竞争将无比的残酷。作为没有组织做后盾的IT宅男,俺必须早点布局。好在现在大部分大学生大学都是白混的,是数学白痴,和以前的俺一样)。

 

一、应用结构

 

1、  采用C-S结构,关键部分的计算放在S端,方便升级、收费。今后将引入P2P

2、  自己用的话,用WPF开发界面,客户用的,用Winform开发。核心代码尽量与UI无关。

3、  将不再承接Web开发为主的项目,不承接数据库开发为主的项目

 

二、项目结构

 

1、微观结构

 

bin

lib

release

src

 

2、宏观结构

 

 

1Orc基础库主要封装一些常用的类、扩展方法、Mediator,以及一些基础设施,顺带储存自己用的snippets

 

 

嘿嘿,俺自定义的snippet只有一个:

 

ContractedBlock.gif Code

 

2OrcSmart库计划包括

aOrc.SmartImage,对常用的图像处理、分析、识别算法进行封装,基于AForge.NetOpenCV进行开发,并新添一些这两个库尚未实现的算法。目前基本成型。

bOrc.SmartText,对常用的文本分析,NLP算法进行封装,这个库现在还是一个空架子,还未行动。

Orc.SmartCore被我归入Orc基础库里面,这个主要实现常用统计计算和机器学习算法。

 

3Orc协议库对常用协议进行实现与封装,目前实现了QQ2005-2007的协议,YMsg协议,封装了MSNP协议。今后将主要针对基于httpWeb应用进行封装。

 

4OrcEntity库,封装常用实体类。

 

5Forsaken库主要针对3D应用,基于XNA,目前还是空架子,还未行动(一没时间,二外部环境还不成熟)。嘿嘿,主要目标是3D仿真。

 

三、第三方库选择:

(1)       使用nunit 进行单元测试(nunitvs自带的单元测试好用很多)

(2)       使用log4net 记录日志

(3)       使用protobuf 进行序列化

(4)       图像处理库:AForge.NetOpenCVEmgu CV

(5)       数学库:MathNet.Iridium

 

附2:通用验证码识别的一个思路

 

要实现通用的验证码程序,我认为应该具备以下2点:

(1)       不需要切割

(2)       不需要分离背景和前景

 

下面是我的思路:

(1)       边缘检测获得边缘

(2)       计算样本的ShapeContext,因为要考虑到干扰线,ShapeContext没法归一化

(3)       计算测试图片的ShapeContext(也可以是其它的描述子,但我感觉对于验证码来说,ShapeContext更好用一些,抗干扰能力更强一些。也可以计算不同Scale下的ShapeContext,来解决样本和测试图片中字符大小不一致的问题)

(4)       将测试图片的ShapeContext存入多维索引中,便于查询

(5)       对于样本,设定一个匹配的阈值,为每个点寻找测试图片中的匹配点(每个寻找2-3个匹配点),这样,所有的匹配点会在2D空间内呈现一种分布,这种分布会有0个或数个聚集区,每一个聚集区就是一个候选区,通过聚类算法寻找聚集区

(6)       假定图片中有一个字符W,这个字符既可以匹配W,又可以匹配V,甚至能匹配IL这两个字符,因此应该设计一个筛选算法

 

附3:江湖

 

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2009/11/12/1601456.html如需转载请自行联系原作者

 

xiaotie 集异璧实验室(GEBLAB)

相关文章
|
26天前
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
21 2
|
1天前
|
前端开发 JavaScript
怎样使用接口引用数据
怎样使用接口引用数据
|
9天前
|
编译器 C语言 C++
【C++专栏】C++入门 | 类和对象 | 类的引入、struct&class的区别、类的定义
【C++专栏】C++入门 | 类和对象 | 类的引入、struct&class的区别、类的定义
12 0
|
2月前
|
编译器 C语言 C++
【c++】类和对象 - 类的引入和定义
【c++】类和对象 - 类的引入和定义
【c++】类和对象 - 类的引入和定义
|
2月前
|
C++
C++:类的补充知识
C++:类的补充知识
18 0
|
5月前
|
测试技术
面向对象的 ABAP 里,全局类和局部类有什么区别,以及各自的使用场合试读版
面向对象的 ABAP 里,全局类和局部类有什么区别,以及各自的使用场合试读版
29 1
|
10月前
|
编译器 C++
C++ :类 和 对象 ※重点※(二)
C++ :类 和 对象 ※重点※(二)
51 0
|
10月前
|
编译器 C++
C++ :类 和 对象 ※重点※(一)
C++ :类 和 对象 ※重点※
33 0
backtrader_源码学习_findbases函数用于发现两个类之间有多少继承的类
backtrader_源码学习_findbases函数用于发现两个类之间有多少继承的类
59 0
C++ 继承与派生中的赋值兼容规则问题探究
C++ 继承与派生中的赋值兼容规则问题探究
133 0
C++ 继承与派生中的赋值兼容规则问题探究