zoukankan      html  css  js  c++  java
  • 用Helper对类的行为进行修饰以便复用(附:外三篇)

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

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

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

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

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

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

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

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

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

    Code

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

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

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

    Code

    使用起来很简单:

    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只有一个:

     

    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:江湖

     

    版权所有,欢迎转载
  • 相关阅读:
    开源代码分析工具 good
    Qt5---ftp上传功能(使用组合的办法实现功能,QNetworkAccessManager自动管理分片上传,用QLoggingCategory屏蔽SSL警告)
    QT---基于WinPcap的局域网络管理工具(主机扫描、包过滤、ARP攻击、端口扫描)
    unity资源
    MVC5 EF6 Bootstrap3 HtmlHelper
    轻量级IOC框架Guice
    CloudNotes:一个云端个人笔记系统
    WeChatAPI 开源系统架构详解
    基础查询扩展
    ASP.NET 5 Hello World
  • 原文地址:https://www.cnblogs.com/xiaotie/p/1601456.html
Copyright © 2011-2022 走看看