• GoF著作中未提到的设计模式


    如何提高阅读源代码的效率

      记得在开源流行之前,我看过的代码紧限于所参与的项目,能有个几万行就不错哩。后来很多优秀开源项目都相继蹦出来了,阅读的代码量那叫一个大呀!不得不看。我现在掉到android这个大坑里,每天都要看很多源代码。以前做过J2EE,看Struts2、Lucene、OSWorkflow、iText等项目的源码,动机有三:文档不足、找问题的原因、好奇。当时有个项目用到了Dojo,这家伙可以说是源码最多的开源Javascript框架了,文档却严重不足,也没什么人用,只能看源码了。  

      要想快速并高效地阅读源码,一定要有好方法,不然看着会挺费劲,当然,用什么方法取决于具体的情况。我就把自己总结的方法给大家show一下,互相交流交流:

    1、一边阅读代码一边写注释。这是我用过的最好的方法,对代码理解得更深入,看一些重要代码或者特别难懂的代码时挺有用。更何况,注释也是一种文档嘛。

    2、一边阅读代码一边绘制UML。这个方法适用于类之间的关系较复杂和调用层次较深的情况,我一般都是先绘制顺序图,然后为顺序图中的类绘制关系图。

    3、通过Debug来跟踪程序的主要执行过程,这样就可以分清主次了,阅读的时候更有针对性。

    4、类的快速阅读。先弄清楚它在继承链中的位置,看看它的内部状态,也就是成员变量,一般来说,类的对外接口都是对成员变量的访问、加工、代理等,然后看看它的对外接口,也就是公有成员函数,识别核心的一个或多个函数,这时候你应该可以大概了解这个类的职责或作用了。可能这个类是某个设计模式中的一个组成部分,所以,设计模式的掌握对代码的快速阅读也是很有帮助的。

    5、带着问题去阅读。比如想了解android中的消息机制,那么看看Looper、Handler、MessegeQueue这几个类就可以了,其他的不要去看,要不然就跑题了。

      下面列几个阅读源码时所处的情景,在特定场景下用哪些方法:
         不太熟悉业务逻辑,还不是很清楚它是干啥的,可以用3、5。
         代码量很大,有几十万行,甚至百万行,可以用2、3、5。
         你无法看见程序的运行过程,比如没有用户界面,也有可能是无法运行的,可以用3、5。
         设计复杂,用了大量的设计模式,调用链很深,可以用1、2、3、4、5。
         时间有限,没有那么多时间让你看源码,可以用3、5。

    记得在使用MindManager之前,考虑问题的解决办法的过程经常会被各种事件打断,回过头来再继续时总会有些偏差,甚至忘记了之前想到的关键地方,所以,有时候也会一边想一边记,但总觉得这个过程不够高效,一段时间后,记录的内容连自己也看不懂,有的根本就找不到了,无形的价值随之流失。
      其实我也一直在找可替代的方法,尤其是类似的软件,感觉都不太合适,大多数都是些类似便筏、网络笔记本的工具。无意中见到一位同事边看电子书边做笔记,所使用的软件让我眼前一亮,它能以树状层次呈现所有节点或者步骤,有点类似平时看到的大纲,不过它的结构更清晰、更灵活,而且每个节点可以关联图片、文档、详细说明等资源。这类软件叫思维导图软件,我下载了一个功能比较强大的,它就是MindManager,界面的风格非常像office系列软件。

      它的使用很简单,当新建一个导图后,先确定主要或核心主题的内容,然后就可以从该主题中扩展出更多的子主题,每个主题可以关联各种图标,比如紧急程度、重要性、完成进度等,每个主题的内容一般都是概要信息,简短明晰,如果需要为这个主题做一些解释,那么可以为它增加注释。

     


      使用MindManager一段时间后,思考问题的过程也有了提高,变得更加清晰,更加有条理。

    在我们日常工作中,经常需要让多个应用程序窗口同时可见(并且相互不遮挡),例如在比较两个文档或者边看电子书边做笔记时,可以让它们水平方向上各占屏幕的一半。如果显示器比较大,我们可以把屏幕划分成几块,然后在各个区域放置需要同时可查阅的窗口,这样可以充分利用屏幕空间,而且同时可以干好几件事情。
      不过,很多人都是通过手动拖拽来实现这一目的,首先要找到目标窗口,然后移动到指定位置,最后调整大小,过程比较繁琐。第一步可以通过上篇文章介绍的方法快速进行,后面两步就可以用本篇文章介绍的GridMove搞定。
      GridMove是一款小巧的软件,安装后没有界面,启动后只会在系统托盘中显示一个蓝色的网格状图标,GridMove默认提供了几种常用的屏幕区域划分模板,我们可以从中选择适合自己的。操作方法很简单,用鼠标左键选中目标窗口标题栏中的标题或者用鼠标中键选中标题栏的任意位置(不松手)片刻后,屏幕上会出现一个网格,网格中的每一个区域都有数字编号,然后拖动目标窗口到指定的网格区域松手即可。更快的方式是用快捷键将目标窗口快速地放到指定的网格区域中,快捷键就是Windows键加上网格区域的编号,比如Win+1快捷键就是把目标窗口放到1号区域上。所以,通过使用AutoHotKey和GridMove,把某个窗口以指定大小放到指定位置完全可以用快捷键完成,速度也很快,几秒钟就可以完成。
      如果GridMove提供的屏幕划分模板不符合要求,也可以自定义模板,所有的模板文件都位于安装目录的Grids文件夹下,定义一个模板很简单,GridMove的帮助中有简单的说明,定义完模板后重启GridMove,并选择刚才自定义的模板即可

     当我们打开电脑做一些事后,任务栏中就会有若干已打开应用程序的窗口,在它们之间切换,绝大部分人使用下面两种方式:

        1、使用Tab键

        2、直接用鼠标在任务栏中找到目标窗口再点击
      第一种方式效率更高一些,尤其是在当前窗口与上一个窗口切换的情况下,应该没有比使用Tab键更好的方法了。在我们工作的过程中,总会有那么几个固定使用的应用程序,比如IDE、浏览器、文本编辑器、邮箱客户端、即时通信工具、帮助文档等。如果我们能直接按下某个快捷键就能切换到目标窗口该多好啊,而且在该窗口不存在时直接打开相应的应用程序,这也算是一种快速打开应用程序的好方法。 使用AutoHotKey就能达到这个目的。刚开始的时候需要适应一段时间,要把应用程序所对应的各个快捷键烂熟于心,以后打开或切换窗口就是一种本能反应 了,对提高工作效率还是很有帮助的。
      AutoHotKey是一个Windows下的热键脚本语言,功能很强大,我也只是用到了它的皮毛而已,比如快速完成单词、切换窗口,有兴趣的同志们可以详细了解一下。
      首先,需要下载AutoHotKey,地址是http://dl.pconline.com.cn/html_2/1/65/id=39876%26pn=0.html
      安装完了之后,我们就有可执行的环境了,要实现快速切换窗口的目的,必须使用AutoHotKey的脚本语言写一个脚本,下面就是脚本的内容:
     
    #NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
    SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
    SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
    SetTitleMatchMode 2

    Activate(t)
    {
    IfWinActive,%t%
    {
    WinMinimize
    return
    }
    SetTitleMatchMode 2
    DetectHiddenWindows,on
    IfWinExist,%t%
    {
    WinShow
    WinActivate
    return 1
    }
    return 0
    }

    ActivateAndOpen(t,p)
    {
    if Activate(t)==0
    {
    Run %p%
    WinActivate
    return
    }
    }

    #a::ActivateAndOpen("Microsoft Outlook","outlook.exe")
    #b::ActivateAndOpen("UltraEdit","C:\Program Files\UltraEdit\UltraEdit.exe")
    #c::Activate("UltraEdit")

      这里简单地说一下,开头的几行是初始化语句,然后定义了两个函数:Activie和ActiveAndOpen,后者会调用前者。Activie的作用是激活指定标题(通过参数t传递,也可以是标题的一部分,只要能唯一识别该窗口即可)的窗口,如果当前窗口已经是待激活的窗口,那么隐藏它,如果窗口不存在的化,并不会打开相应的应用程序,也就是什么都不做,而ActivieAndOpen会在指定窗口不存在的情况下打开相应的应用程序,它的第一个参数是窗口标题,第二个参数就是应用程序的全路径。这两个函数定义后面的3条语句就是调用的示例,每一行就是一次函数调用,第一个字母#表示用Windows键作为快捷键的基本键,因为这个键本身所关联的快捷键比较少,所以建议大家都用这个键,第二个字母就是要和Windows键组合的键,比如#a就代表 Win+a作为快捷键,两个冒号后面定义的是要用这个快捷键做什么,这里我们的目的就是调用前面定义的两个函数之一,比如第一行用Win+a打开Outlook邮箱,如果还未打开就会启动它。把脚本内容拷贝到记事本中,保存成后缀为ahk的文件,然后点击这个文件,就可以在托盘中看到一个字母为H的绿色图标,至此,我们就可以通过预定义的快捷键进行窗口切换了。
      如果要修改脚本的内容,直接在托盘的H图标上点击右键,选择Edit This Script,编辑完后保存,再从右键菜单中选择Reload This Scipt让修改后的脚本生效。


    GoF著作中未提到的设计模式(6):Specification

    posted @ 2011-09-15 18:00 West_Link 阅读(901) | 评论 (1) 编辑

    GoF著作中未提到的设计模式(5):Object Pool

    posted @ 2011-09-05 11:19 West_Link 阅读(1527) | 评论 (11) 编辑

    GoF著作中未提到的设计模式(4):Double Dispatch

    posted @ 2011-07-26 10:13 West_Link 阅读(1298) | 评论 (2) 编辑

    GoF著作中未提到的设计模式(3):Null Object

    posted @ 2011-07-08 09:44 West_Link 阅读(1730) | 评论 (13) 编辑

    GoF著作中未提到的设计模式(2):Interceptor

    posted @ 2011-06-22 09:45 West_Link 阅读(1247) | 评论 (13) 编辑

    GoF著作中未提到的设计模式(1): Archetype

    posted @ 2011-06-16 10:27 West_Link 阅读(1405) | 评论 (9) 编辑

  • 相关阅读:
    Codeforces 1439B. Graph Subset Problem (思维,复杂度分析)
    石子游戏(nim游戏+按位考虑)
    Codeforces 1437F Emotional Fishermen(思维,dp)
    Codeforces Round #671 (Div. 2) (A~E)
    Java就业企业面试问题ssh框架
    DUBBO初探搭建DUBBO开发环境
    Spring容器组建注解@Component和Resouces实现完全注解配置
    jUnit 4 在 s2sh 中的应用
    4.5、常量、作用域、内置全局变量
    Java 诗词纵向转换字符流输出
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2242022.html
Copyright © 2020-2023  润新知