如何阅读他人代码(二)

原文为繁体中文,地址:http://www.ithome.com.tw/itadm/article.php?c=47828

下文为经过Google翻译过的简体中文版,有翻译不准确的地方,请参照原文一起阅读:


阅读他人的程式码( 2 -摸清架构,便可轻松掌握全貌

在本文中,我们的重点放在:要了解一个系统,最好是采取由上至下的方式。先试着捕捉系统架构性的观念,不要过早钻进细节,因为那通常对于你了解全貌,没有多大的帮助。阅读程式码不需要从第一行读起,我们的目的并不是在于读遍每一段程式码。

基于许多原因,程式人需要阅读其他人所写成的程式码。而对程式设计2.0时代的程式人来说,最正面的价值在于,能读懂别人程式的人,才有能力从中萃取自己所需的程式,借以提高生产力。 

阅读程式码的目的,在于了解全貌而非细节
 
想要读懂别人程式码的根本基础,便是了解对方所用的程式语言及命名惯例。有了这个基础之后,才算是具备了基本的阅读能力。正如我之前提到的 想要读懂法文写成的小说,总不能连法文都不懂吧。阅读程式码和阅读文学作品,都需要了解撰写所用的语言及作者习用的语汇。
 

但我们在阅读文学作品通常是采循序的方式,也就是从第一页开始,一行一行地读下去,依循作者为你铺陈的步调,逐渐进到他为你准备好的世界里。阅读程式码却大大不同。我们很少从第一行开始读起,因为除非它是很简单的单执行绪程式,否则很少这么做。因为要是这么做,就很难了解整个系统的全貌。是的,我们这边提到了一个重点,阅读程式码的目的在于了解系统的全貌,而不是在于只是为了地毯式的读遍每一段程式码。
 

就拿物件导向程式语言所写成的系统来说,整个系统被拆解,分析成为一个个独立的类别。阅读个别类别的程式码,或许可以明白每项类别物件个别的行为。但对于各类别物件之间如何交互影响,如何协同工作,又很容易陷入盲人摸象的困境。这是因为各类别的程式码,只描述个别物件的行为,而片段的阅读就只能造就片面的认识。
 

由上而下厘清架构后,便可轻易理解组成关系
 
如果你想要跳脱困境,不想浪费大量时间阅读程式码,却始终只能捕捉到对系统片段认识,就必须转换到另一种观点来看待系统。从个别的类别行为着手,是由下至上(自下而上)的方法;在阅读程式码时,却应该先采由上至下(自上而下)的方式。对程式码的阅读来说,由上至下意谓着,你得先了解整个系统架构。
 

系统的架构是整个系统的骨干,支柱。它表现出系统最突出的特征。知道系统架构究竟属于那一种类型,通常大大有益于了解系统的个别组成之间的静态及动态关系。有些系统因为所用的技术或框架的关系,决定了最上层的架构。例如,采用的Java Servlet/ JSP的技术的应用系统,最外层的架构便是以J2EE的(或起码的J2EE中的Web容器)为根本。
 

使用的Java Servlet/ JSP的技术时,决定了某些组成之间的关系。例如, Web容器依据web.xml中的内容载入所有的Servlets ,听众,以及过滤器。每当语境发生事件(例如初始化)时,它便会通知监听类别。每当它收到来自客户端的请求时,便会依循设定的所有过滤器链,让每个过滤器都有机会检查并处理此一请求,最后再将请求导至用来处理该请求的Servlet的。
 

当我们明白某个系统采用这样的架构时,便可以很容易地知道各个组成之间的关系。即使我们还不知道究竟有多少Servlets ,但我们会知道,每当收到一个请求时,总是会有个相对应的服务器来处理它。当想要关注某个请求如何处理时,我应该去找出这个请求对应的服务器。
 

了解架构,必须要加上层次感
 
同样的,以爪哇写成的网页应用程式中,也许会应用诸如Struts的之类的的MVC框架,以及像Hibernate的这样的资料存取框架。它们都可以视为最主要的架构下的较次级架构。而各个应用系统,甚至有可能在Struts的及休眠之下,建立自有的更次级的架构。
 

也就是说,当我们谈到架构这样的观念时,必须要有层次感。而不论是那一层级的架构,都会定义出各自的角色,以及角色间的关系。对阅读者来说,相较于直接切入最细微的单一角色行为,不如了解某个特定的架构中,究竟存在多少角色,以及这些角色之间的互动模式,比较能够帮助我们了解整个系统的运作方式。
 

这是一个很重要的关键,当你试着进到最细节处之前,应该先试着找出参与的角色,及他们之间的关系。例如,对事件驱动式的架构而言,有3个很重要的角色。一个是事件处理的分派器(事件调度) ,一个是事件产生者(事件发生器) ,另一个则是事件处理器(事件处理程序)
 

事件产生器产生事件,并送至事件分派器,而事件分派器负责找出各事件相对应的事件处理器,并且转交该事件,并命令事件处理器加以处理。像的图形用户界面的Windows应用程式,便是采用事件驱动式的架构。
 

当你知道此类的应用程式皆为事件驱动式的架构时,你便可以进一步得知,在这样的架构下会有3种主要的角色。虽然也许还不清楚整个系统中,究竟会需要处理多少事件的类型,但对你而言,已经建立了对系统全貌最概观的认识。
 

虽然你还不清楚所有的细节,但诸如确切会有那些事件类型之类的资讯,在此刻还不重要 不要忘了,我们采取的是由上而下的方式,要先摸清楚主建筑结构,至于壁纸的花色怎么处理,那是到了尾声时才会做的事。
 

探索架构的第一件事:找出系统如何初始化
 
有经验的程式人,对于时常被运用的架构都很熟悉。常常只需要瞧上几眼,就能明白一个系统所用的架构,自然就能够直接联想到其中会存在的角色,以及角色间的关系。然而,并不是每个系统所用的架构,都是大众所熟悉,或是一眼能够望穿的。这时候,你需要探索。目标同样要放在界定其中的角色,以及角色间的静态,动态关系。
 

不论某个系统所采用的架构是否为大部分人所熟知的,在试着探索一个系统的长相时,我们应该找出来几个答案,了解在它所用的架构下,下列这件事是如何被完成的:一,系统如何初始化,二,与这个系统相接的其他系统(或使用者)有那些,而相接的介面又是什么;三,系统如何反应各种事件,四,系统如何处理各种异常及错误。
 

系统如何初始化是很重要的一件事,因为初始化是为了接下来的所有事物而做的准备。从初始化的方式,内容,能知道系统做了什么准备,对于系统会有什么行为展现,也就能得窥一二了。之所以要了解与系统相接的其他系统(或使用者) ,为的是要界定出系统的边界。其他的系统可能会提供输入给我们所探索的系统,也可能接收来自这系统的输出,了解这边界所在,才能确定系统的外观。
 

而系统所反应的事件类型,以及如何反应,基本上就代表着系统本身的主要行为模式。最后,我们必须了解系统处理异常及错误的方式,这同样也是系统的重要行为,但容易被忽略。之前,我们提到必须先具备一个系统的语言基础,才能够进一步加以阅读,而在本文中,我们的重点放在:要了解一个系统,最好是采取由上至下的方式。先试着捕捉系统架构性的观念,不要过早钻进细节,因为那通常对于你了解全貌,没有多大的帮助。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值