网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.javaCC学习笔记.
.使用Annotations设计一个MVC框架.
.用 JDOM 简化 XML 编程.
.Spring与WebLogicServer的集成.
.理解Java赋值和参数传递机制.
.用Java创建带图标和缩进的JCombo.
.如何学习Hibernate.
.Eclipse Tanghan Plugin帮助文件.
.用JBuilder9制作EXE文件不公开秘.
.学习Struts提供的和Form相关的标.
.手机上实现任意角度翻转算法[适用.
.分享——一个简单的MP3播放器的制.
.TotalSize 属性.
.一个相当经典的RMI实例源代码及详.
..NET真的战胜了J2EE吗?.
.详细介绍什么是实时JAVA.
.按位“与”运算符 (&).
.一个用java.util.zip创建和读取z.
.网络-两远程客户端之间的通讯原理.
.Javascript实例教程(7) 利用Java.

.NET2005提供的Code Snippets看代码复用

发表日期:2008-1-5



  首先说明这里的代码复用指的是狭义的源代码的复用,而不是广义的黑盒复用和白合复用所指的代码复用,所以文中所说的代码复用都默认都是指前者所指的源代码的复用。
  
  我们知道在程序设计中复用代码并不是一件轻易的事情,其实每段代码的编写,都是通过一定的思考的,当然考虑的程度与其解决的问题的难度有关。我们很忌讳在一个工程中重复使用相同的源代码,假如出现这样的情况很多时候就是程序结构设计本身的不合理了。可是对于一个developer或一个prodUCt team,源代码的逻辑(主要是执行逻辑,而不是业务逻辑)在不同项目或同一项目不同版本中很可能需要复用,而这种复用很多时候又是很难抽象成广义的代码复用的。于是我们不得不ctrl+c & ctrl+v,这是一个好办法,也确实能为我们节省很多的时间,可是这样同时也会带来很多的问题。假如被复用的代码是近期所写的,我们一般对其很熟悉,ctrl+v时心理也很有底。可是对于编写了很久的代码,我们在ctrl+v就不得不考虑一下代码是不时完全合适被复用了。更多的时候我们还需要对复用代码做一些小的修改,最简单的修改莫过于把变量名改来适合当前代码的上下文。
  
  假如有这样复用过代码的人可能会有一种感觉,我总是不知道哪个源码文件里的代码snippet是我觉得解决这个逻辑最好的@_@,因为每次ctrl+v后或多或少又会把代码做一些小的改动,或是修补不足或是增加功能。非凡是修补了不足后假如能保留下来以做再次复用就好了,可是很多时候这些越来越优秀的代码snippet却仍然分布在某个项目的某个文件中。于是我们发现有些小工具可以用来帮助我们保存代码snippet,比如前些天有人开发的类似CodeLib什么的。
  
  今天在用VS.NET 2005的时候,发现tools菜单里有一个Code Snippets Manager(或者用Ctrl+k,Ctrl+b呼出)。打开看了一下,第一感觉就是一个代码模版治理嘛,看看了些预置的snippet,居然都是些很简单的类似if语句结构、for语句结构、do语句结构、while语句结构等,觉得真是没有意思,难道微软要我们用鼠标来编程吗?继续往后翻,发现了几个比较复杂的snippets,有的有一屏那么多的代码。其实代码多少不是snippet的重要的问题了,而是这些snippet在插入IDE后,可以根据其在文件里的命令定义,产生如下图所示的自动添补提示功能:
  
.NET2005提供的Code Snippets看代码复用

  在图中黄底黑字区域内编辑完后按Tab,其下面的虚线框里的内容会同步的更新。这样的功能为我们收集并复用源代码提供了很便利的支持,这个snippet是以XML格式保存的,只是whidbey beta1里面还没没有提供snippet文件的可视化编辑器,不过xml本身在VS.NET里也不难写。上图示例的代码文件如下:
  
  <CodeSnippet Format="1.0.0">
  <Header>
    <Title>"named" iterator / indexer pair</Title>
    <Shortcut>iterindex</Shortcut>
    <Description>Implement a "named" iterator / indexer pair, using a nested class</Description>
    <SnippetTypes>
      <SnippetType>EXPansion</SnippetType>
    </SnippetTypes>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>type</ID>
        <Default>ElementType</Default>
        <ToolTip>Type to return from iterator / indexer</ToolTip>
      </Literal>
      <Literal>
        <ID>name</ID>
        <Default>MyView</Default>
        <ToolTip>Name of the iterator/indexer pair</ToolTip>
      </Literal>
      <Literal Editable="false">
        <ID>outer</ID>
        <Default>MyOuterClass</Default>
        <Function>ClassName()</Function>
      </Literal>
      <Literal Editable="false">
        <ID>SystemCollectionsGenericIEnumeratorG</ID>
        <!-- Function>ShortName(System.IEnumerator)</Function -->
        <Default>System.Collections.Generic.IEnumerator</Default>
      </Literal>
      <Literal Editable="false">
        <ID>SystemNotImplementedException</ID>
        <!-- Function>ShortName(System.NotImplementedException)</Function -->
        <Default>System.NotImplementedException</Default>
      </Literal>
    </Declarations>
    <Code Language="csharp" Format="CData"><![CDATA[public $name$Impl $name$
    {
      get
      {
        return new $name$Impl(this);
      }
    }
  
    public class $name$Impl
    {
      readonly $outer$ _outer;
  
      internal $name$Impl($outer$ mc)
      {
        this._outer = mc;
      }
  
      // A Length property isn't required, but it's often useful.
      public int Length { get { return 1; } }
  
      public $type$ this[int index]
      {
        get
        {
          //
          // TODO: implement indexer here
          //
          // you have full Access to $outer$ privates.
          //
          $end$throw new System.NotImplementedException();
          return default($type$);
        }
      }
  
      public $SystemCollectionsGenericIEnumeratorG$<$type$> GetEnumerator()
      {
        // TODO: provide an appropriate implementation here
        for (int i = 0; i < this.Length; i++)
        {
          yield return this[i];
        }
      }
    }]]>
  </Code>
  </Snippet>
  </CodeSnippet>
  有了这个snippet的治理支持和方便的使用方法后,基本就解决了我前面提到源代码复用里面版本控制和变量名修改的问题。
  
  其实这个snippet的使用还有一个积极的意义,我们知道编写相同的逻辑过程是枯燥的,我们都喜欢编写新的逻辑过程,即使新的逻辑更难更复杂,反而更有挑战。但是我们又不能避开很多程序逻辑的复用,在我们以一种类似"厌恶"的情绪重复着那些程序逻辑时,保证代码的正确性真是一场噩梦。
上一篇:设计自己的printpreviewdialog 人气:563
下一篇:.Net下调用SQL Server2000中存储过程 人气:1272
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐