当前位置: 首页 > news >正文

服装设计素材网站大全微信小程序格泰网站建设

服装设计素材网站大全,微信小程序格泰网站建设,多余菜单删掉wordpress,网站英文域名怎么查四、望文生义#xff0c;进而推敲组件的作用 先建立系统的架构性认识#xff0c;然后透过名称及命名惯例#xff0c;就可以推测出各组件的作用。例如#xff1a;当Winamp尝试着初始化一个Plug-In时#xff0c;它会呼叫这个结构 中的init函式#xff0c;以便让每个Plug-I…四、望文生义进而推敲组件的作用  先建立系统的架构性认识然后透过名称及命名惯例就可以推测出各组件的作用。例如当Winamp尝试着初始化一个Plug-In时它会呼叫这个结构 中的init函式以便让每个Plug-In程序有机会初始化自己。当Winamp打算结束自己或结束某个Plug-In的执行时便会呼叫quit函 式。  在阅读程序代码的细节之前我们应先试着捕捉系统的运作情境。在采取由上至下的方式时系统性的架构是最顶端的层次而系统的运作情境则是在它之下的另一个层次。  好的说明文件难求拼凑故事的能力很重要  有些系统提供良善的说明文件也许还利用UML充分描述系统的运作情境。那么对于阅读者来说从系统的分析及设计文件着手便是快速了解系统运作情境的一个途径。  但是并不是每个软件项目都伴随着良好的系统文件而许多极具价值的开放原始码项目也时常不具备此类的文件。对此阅读者必须尝试自行捕捉并适度地记录捕捉到的运作情境。  我喜欢将系统的运作情境比拟成系统会上演的故事情节。在阅读细节性质的程序代码前先知道系统究竟会发生那些故事是必备的基本功课。你可以利用熟悉或 者自己发明的表示工具描述你所找到的情境。甚至可以只利用简单的列表直接将它们列出。只要能够达到记录的目的对程序代码阅读来说都能够提供帮助。 或者你也可以利用UML中的类别图、合作图、循序图之类的表示方法做出更详细的描述。  当你能够列出系统可能会有的情境表示你对系统所具备的功能以及在各种情况下的反应都具备概括性的认识。以此为基础便可在任何需要的时候钻进细节处深入了解。  探索架构的第一步──找到程序的入口  在之前我们在一个开发项目中曾经需要将系统所得到的MP3音讯文件放至iPod这个极受欢迎的播放设备中。  虽然iPod本身也可以做为可移动式的储存设备但并不是单纯地将MP3档案放到iPod中就可以让iPod的播放器认得这个档案甚至能够加以播放。  这是因为iPod利用一个特殊的档案结构iTunes DB记录播放器中可供播放的乐曲、播放列表以及乐曲信息例如专辑名称、乐曲长度、演唱者等。为了了解并且试着重复使用既有的程序代码我们找到了一个Winamp的iPod插件Plug-In。  Winamp是个人计算机上极受欢迎的播放软件而我们找到的插件能让Winamp直接显示连接至计算机的iPod中的歌曲信息并且允许Winamp直接播放。  我们追踪与阅读这个插件的思路及步骤如下首先我们要先了解插件的系统架构。很明显的大概浏览过原始码后我们注意到它依循着WinAmp为 Plug-In程序所制定的规范也就是说它是实作成Windows上的DLL并且透过一个叫做 winampGetMediaLibraryPlugin的DLL函式提供一个名为winampMediaLibraryPlugin的结构。  当我们不清楚系统的架构究竟为何时我们会试着探索而第一步便是找到程序的入口。如何找到呢这会依程序的性质不同而有所差别。  对一个本身就是可独立执行的程序来说我们会找启动程序的主要函式例如对C/C来说就是main()而对Java来说便是static void main()。在找到入口后再逐一追踪摸索出系统的架构。  但有时我们所欲阅读的程序代码是类别库或函式库它只是用来提供多个类别或函式供客户端程序Client Program使用本身并不具单一入口此类的程序代码具有多重的入口──每个允许客户端程序呼叫的函式或类别都是它可能的入口。  例如对WinAmp的iPod Plug-In来说它是一个DLL形式的函式库所以当我们想了解它的架构时必须要先找出它对外提供的函式而对Windows DLL来说对外提供的函式皆会以dllexport这个关键词来修饰。所以不论是利用grep或gtags之类的工具我们可以很快从原始码中找 到它只有一个DLL函式这对我们而言真是一个好消息而这个函式便是上述的winampGetMediaLibraryPlugin。  系统多会采用相同的架构处理Plug-In程序  如果经验不够的话也许无法直接猜出这个函式的作用。  不过如果你是个有经验的程序人多半能从函式所回传的结构猜出这个函式实际的用途。而事实上当你已经知道它是一个Plug-In程序时就应该要明白它可能采用的就是许多系统都采用的相同架构处理Plug-In程序。  当一个系统采用所谓Plug-In形式的架构时它通常不会知道它的Plug-In究竟会怎么实作、实作什么功能。它只会规范Plug-In程序需要满足某个特定接口。当系统初始化时所有的Plug-In都可以依循相同的方式向系统注册合法宣示自己的存在。  虽然系统并不确切知道Plug-In会有什么行为展现但是因为它制定了一个标准的接口所以系统仍然可以预期每个Plug-In能够处理的动作类型。这些动作具体上怎么执行对系统来说并不重要。这也正是面向对象程序设计中的「多型」观念。  随着实务经验归纳常见的架构模式  我想表达的重点是当你「涉世越深」之后所接触的架构越多就越能触类旁通。只需要瞧上几眼就能明白系统所用的架构自然就能够直接联想到其中可能存在的角色以及角色间的关系。  像上述的Plug-In程序手法时常可以在许多允许「外挂」程序代码的系统中看到。所以有经验的阅读者多半能够立即反应知道像Winamp这样的系统应该是让每个Plug-In程序都写成DLL函式库。  而每个Plug-In的DLL函式库中都必须提供winampGetMediaLibraryPlugin()这个函式如果你熟悉Windows的程 序设计你会知道这是利用LoadLibrary()和GetProcAddress()来达成的一种多型手法。如果你熟悉设计模式你更会知道这是 Simple Factory Method这个设计模式的运用。  winampGetMediaLibraryPlugin()所回传的winampMediaLibraryPlugin结构正好就描述了每个Winamp Plug-In的实作内容。  善用名称可加速了解  利用gtags这个工具我们立即发现这个Plug-In它所定义的init、quit、PluginMessageProc这三个名称都是函式名称。这暗示在多型的作用下它们都是在某些时间点会由Winamp核心本体呼叫的函式。  名称及命名惯例是很重要的。看到「init」我们会知道它的作用多半是进行初始化的动作而「quit」大概就是结束时处理函式而 PluginMessageProc多半就是各种讯息的处理程序Proc通常是procedure的简写所以PluginMessageProc意指 Plugin Message Procedure了。  「望文生义」很重要我们看到函式的名称就可以猜想到它所代表的作用例如当Winamp尝试着初始化一个Plug-In时它会呼叫这个结构中的 init函式以便让每个Plug-In程序有机会初始化自己当Winamp打算结束自己或结束某个Plug-In的执行时便会呼叫quit函式。当 Winamp要和Plug-In程序沟通时它会发送各种不同的讯息至Plug-In而Plug-In程序必须对此做出回应。  我们甚至不需要检视这几个函式的内容就可以做出推测而这样的假设事实上也是正确的。  五、找到程序入口再由上而下抽丝剥茧  根据需要决定展开的层数或展开特定节点并记录树状结构然后适度忽略不需要了解的细节─这是一个很重要的态度。因为你不会一次就需要所有的细节阅读都是有目的的每次的阅读也许都在探索程序中不同的区域。  探索系统架构的第一步就是找到程序的入口点。找到入口点后多半采取由上而下Top-Down的方式由最外层的结构一层一层逐渐探索越来越多的细节。  我们的开发团队曾针对Winamp的iPod plug-in进行阅读及探索不仅找到入口点也找出、并理解它最根本的基础架构。从这个入口点可以往下再展开一层分别找到三个重要的组成及其意义  ● init()初始化动作  ● quit()终止化动作  ● PluginMessageProc()以讯息的方式处理程序所必须处理的各种事件  展开的同时随手记录树状结构  当我们从一个入口点找到三个分支后可以顺着每个分支再展开一层所以分别继续阅读init、quit、以及PluginMessageProc的内容并试着再展开一层。阅读的同时你可以在文件中试着记录展开的树状结构。  ● init()初始化动作  ● itunesdb_init_cc()建立存取iTunes database的同步对象  ● 初始化数据结构  ● 初始化GUI元素  ● 加载设定  ● 建立log檔  ● autoDetectIpod()侦测iPod插入的线程  ● quit()终止化动作  ● itunesdb_del_cc()终止存取iTunes database的同步对象  ● 关闭log檔  ● 终止化GUI元素  ● PluginMessageProc()以讯息的方式处理程序所必须面临的各种事件  ● 执行所连接之iPod的MessageProc()  这部分必须要留意几个重点。首先应该一边阅读一边记录文件。因为人的记忆力通常有限对于陌生的事物更是容易遗忘因此边阅读边记录是很好的辅助。  再者因为我们采取由上而下的方式从一个点再分支出去成为多个点因此通常也会以树状的方式记录。除此之外每次只试着往下探索一层。从init()来看你便会明白。以下试着摘要init()的内容  int init() {  itunesdb_init_cc();  currentiPodNULL;  iPods new C_ItemList;  …略  conf_file(char*)SendMessage(plugin.hwndWinampParent,WM_WA_IPC,0,IPC_GETINIFILE);  m_treeview GetDlgItem(plugin.hwnd LibraryParent,0x3fd);  //this number is actually magic …略  g_detectAll GetPrivateProfileInt(ml_ipod, detectAll,0,conf_file)!0;  …略  g_logGetPrivateProfileInt(ml_ipod,log,0,conf_file)!0;  …略  g_logfilefopen(g_logfilepath,a);  …略  autoDetectIpod();  return 0;  }  因为我们只试着多探索一层而目的是希望发掘出下一层的子动作。所以在init()中看到像「itunesdb_init_cc();」这样的函数调用动作时我们知道它是在init()之下的一个独立子动作所以可以直接将它列入。但是当看到如下的程序行  currentiPodNULL;  iPods new C_ItemList;  我们并不会将它视为init()下的一个独立的子动作。因为好几行程序才构成一个具有独立抽象意义的子动作。例如以上这两行构成了一个独立的抽象意义也就是初始化所需的数据结构。  理论上原来的程序撰写者有可能撰写一个叫做init_data_structure()的函式包含这两行程序代码。这样做可读性更高然而基于种种 理由原作者并没有这么做。身为阅读者必须自行解读将这几行合并成单一个子动作并赋予它一个独立的意义──初始化数据结构。  无法望文生义的函式先试着预看一层  对于某些不明作用的函式叫用不是望其文便能生其义的。当我们看到「itunesdb_init_cc()」这个名称时我们或许能从 「itunesdb_init」的字眼意识到这个函式和iPod所采用的iTunes database的初始化有关但「cc」却实在令人费解。为了理解这一层某个子动作的真实意义有时免不了要往前多看一层。  原来它是用来初始化同步化机制用的对象。作用在于这程序一定是用了某个内部的数据结构来储存iTunes database而这数据结构有可能被多线程存取所以必须以同步对象此处是Windows的Critical Section加以保护。  所以说当我们试着以树状的方式逐一展开每个动作的子动作时有时必须多看一层才能真正了解子动作的意义。因为有了这样的动作我们可以在展开树状结 构中为itunesdb_init_cc()附上补充说明建立存取itunes database的同步对象。这么一来当我们在检视自己所写下的树状结构时就能轻易一目了然的理解每个子动作的真正作用。 根据需要了解的粒度决定展开的层数  我们究竟需要展开多少层呢这个问题和阅读程序代码时所需的「粒度Granularity」有关。如果我们只是需要概括性的了解那么也许展开两层或三层就能够对程序有基础的认识。倘若需要更深入的了解就会需要展开更多的层次才行。  有时候你并不是一视同仁地针对每个动作都展开到相同深度的层次。也许你会基于特殊的需求专门针对特定的动作展开至深层。例如我们阅读 Winamp iPod plug-in的程序目录其实是想从中了解究竟应该如何存取iPod上的iTunes DB使我们能够将MP3歌曲或播放列表加至此DB中并于iPod中播放。  当我们层层探索与分解之后找到了parseIpodDb()从函式名称判断它是我们想要的。因为它代表的正是parse iPod DB正是我们此次阅读的重点也就达成阅读这程序代码的目的。  我们强调一种不同的做法在阅读程序代码时多半采取由上而下的方式而本文建议了一种记录阅读的方式就是试着记录探索追踪时层层展开的树状结构。你可 以视自己需要了解的深入程度再决定要展开的层数。你更可以依据特殊的需要只展开某个特定的节点以探索特定的细目。  适度地忽略不需要了解的细节是一个很重要的态度因为你不会一次就需要所有的细节阅读都是有目的的。每次的阅读也许都在探索程序中不同的区域而每次探索时你都可以增补树状结构中的某个子结构。渐渐地你就会对这个程序更加的了解。  六、阅读的乐趣透过程序代码认识作者  即便每个人的写作模式多半受到他人的影响程序人通常还是会融合多种风格而成为自己独有的特色如果你知道作者程序设计的偏好阅读他的程序代码就更得心应手。  阅读程序代码时多半会采取由上而下、抽丝剥茧的方式。透过记录层层展开的树状结构程序人可以逐步地建立起对系统的架构观而且可以依照需要的粒度Granularity决定展开的层次及精致程度。  建立架构观点的认识是最重要的事情。虽然这一系列的文章前提为「阅读他人的程序代码」但我们真正想做的工作并不在于彻底地详读每一行程序代码的细节 而是想要透过重点式的程序代码「摘读」达到对系统所需程度的了解。每个人在阅读程序代码的动机不尽相同需要了解的程度也就有深浅的分别。只有极为少数 的情况下你才会需要细读每一行程序代码。  阅读程序代码是新时代程序人必备的重要技能  这一系列的文章至此已近尾声回顾曾探讨的主题我们首先研究了阅读程序代码的动机。尤其在开放原始码的风气如此之盛的情况下妥善利用开放原始码所提供 的资源不仅能够更快学习到新的技术同时在原始码版权合适时还可以直接利用现成的程序代码大幅地提高开发阶段的生产力。所以阅读程序代码俨然成为 了新时代程序人必备的重要技能之一。  接着我们提到了阅读程序代码前的必要准备包括了对程序语言、命名惯例的了解等等。在此之后我们反复提起了「由上而下」的阅读方向的重要性。  由上而下的阅读方式是因为我们重视架构更胜于细节。从最外层的架构逐一向内探索每往内探索一层我们了解系统的粒度就增加了一个等级。当你识别出系统 所用的架构时便能够轻易了解在这个架构下会有的角色以及它们之间的动态及静态的关系。如此一来许多信息便不言可喻毋需额外花费力气便能够快速理 解。  好的名称能够摘要性地点出实体的作用  追踪原始码时固然可以用本来的方式利用编辑器开启所需的档案然后利用编辑器提供的机制阅读但是倘若能够善用工具阅读程序代码的效率及质量都能大大提升。在本系列文章中我们介绍了一些工具或许你还可以在坊间找到其他更有用的工具。  我在这一系列的文章中实际带着大家阅读、追踪了一个名为ml_pod的开放原始码项目。它是一个Winamp的iPod plug-in程序。在追踪的过程中我们试着印证这一系列文中所提到的观念及方法。我们采用逐渐开展的树状结构来记录追踪的过程并藉以建立起对系统的 概观认识。  就原始码的阅读来说之前的讨论涉及了工具面及技巧面。但还有一些主题不在这两个范畴之内例如善用名称赋予你的提示。名称做为隐喻 Metaphor的作用很大好的名称能够摘要性地点出实体的作用例如我们看到autoDetectIpod()自然而然能够想象它的作用在于自 动Auto侦测DetectiPod的存在。  我们在展开树状结构时有时候需要预看一层有时却不需要这么做便可得到印证。程序人都会有惯用的名称以及组合名称的方法倘若能够从名称上理解便毋 需钻进细节可以省去相当多的时间。例如当我们看到parseIpodDb()时便可以轻易了解它是剖析ParseiPod的数据库DB因 此便不需要立即钻进parseIpodDb()中查看底细。  尽管如此能否理解程序人命名的用意和自身的经验以及是否了解原作者的文化背景是息息相关的。  命名本身就是一种文化产物。不同的程序人文化就会衍生出不同的命名文化。当你自己的经验丰富看过及接触过的程序代码也多时对于名称的感受及联想的能力自然会有不同。  这种感受和联想的能力究竟应该如何精进很难具体描述。就我个人的经验多观察不同命名体系的差异并且尝试归纳彼此之间的异同有助于更快地提升对名称的感受及联想力。  转换立场理解作者的思考方式  除了工具及技巧之外「想要阅读程序代码得先试着阅读写这个程序代码的程序人的心。」这句话说来十分抽象或许也令人难以理解。  当你在阅读一段程序代码时或许可以试着转换自己的立场从旁观者的角度转换成为写作者的心态揣摩原作者的心理及处境。当你试着设身处地站在他的立场透过他的思考方式来阅读、追踪他所写下的程序代码将会感觉更加流畅。  许多软件项目都不是由单一程序人所独力完成。因此在这样的项目中便有可能呈现多种不同的风格。  许多项目会由架构师决定主体的架构及运作有既定实施的命名惯例及程序设计需要遵守方针。在多人开发的模式下越是好的软件项目越看不出某代码段究竟是由谁所写下的。  不过有些开放原始码的项目往往又整合了其他开放原始码的项目。有的时候也很难求风格的统一便会出现混杂的情况。好比之前提到的ml_pod项目因为程序代码中混合了不同的来源而呈现风格不一致的情况。  我在阅读非自己所写的程序代码时会观察原作者写作的习惯藉以对应到脑中所记忆的多种写作模型。在阅读的过程中读完几行程序代码我会试着猜想原作者 在写下这段程序代码时的心境。他写下这段程序代码的用意是什么为什么他会采取这样的写法顺着原作者的思考理路阅读自己的思考才能更贴近对方写作当时 的想法。  当你短暂化身为原作者时才能更轻易的理解他所写下的程序代码。  如果你能知道原作者的背景程序设计时的偏好阅读他的程序代码就更能得心应手了。  从程序代码着手认识作者独有的风格进而见贤思齐  我在阅读别人写下的程序代码时我会试着猜想原作者究竟是属于那一种「流派」呢每个人都有自己独特的写作模式即便每个人的写作模式多半受到他人的影 响──不论是书籍的作者、学习过程中的指导者或一同参与项目的同侪但每个程序人通常会融合多种风格而成为自己独有的风格。  面向对象的基本教义派总是会以他心中觉得最优雅的面向对象方式来撰写程序。而阅读惯用、善用设计模式的程序人所写下的程序代码时不难推想出他会在各种常见的应用情境下套用哪些模式。  有些时候在阅读之初你并不知道原作者的习性跟喜好甚至你也不知道他的功力。但是在阅读之后你会慢慢地从一个程序人所写下的程序代码开始认识他。  你或许会在阅读他人的程序代码时发现令人拍案叫绝的技巧或设计。你也有可能在阅读的同时发现原作者所留下的缺失或写作时的缺点而暗自警惕于心。这也算是阅读他人程序代码时的一项乐趣。     当你从视阅读他人的程序代码为畏途转变成为可以从中获取乐趣的时候我想你又进到了另一个境界。 ❤提问/互动请留言可直接在最底右下方写留言即可 ❤如果觉得写得不错请点击“订阅”每天更新全新的内容 ❤你们的喜欢和关注就是我最大的动力支撑转载于:https://www.cnblogs.com/lxxl1234/p/9267921.html
http://www.pierceye.com/news/233793/

相关文章:

  • 合肥网站seo技术软件开发工程师简历模板
  • org的域名网站在线取公司名字 免费
  • 网站开发有哪几个阶段百度网站官网怎么做
  • 微信网站名域名访问网站怎么下载
  • 网站源码怎么预览建站技巧
  • 织梦网站会员功能化妆品网站建设描述
  • 手机app软件定制马鞍山seo
  • 重庆网站建设 九度互联响应式网站开发工具
  • 句容市建设工程管理处网站wordpress联系表格
  • 电商网站建设流程新能源汽车价格一览表
  • 实验室网站建设的调查报告海报设计图片手绘图
  • 征求网站建设买正品东西哪个网最好
  • 网站建公司生存响应式网站特点
  • 关于公司建设网站的意义网站后台html页面
  • 麻花星空影视传媒制作公司网站朋友帮忙做网站 费用多少
  • 海口网站建设呢做健身推广网站
  • 哈尔滨网站搜索优化苏州网站建设主页
  • 35互联网站建设怎么样设计工作室宣传文案
  • php做的网站如何该样式云服务器产品介绍
  • 个人网站建设论文绪论上海it公司有哪些
  • 建设网站推广广告图郑州妇科医院哪家好些
  • 自己网站wordpress主题怎么wordpress 功能块
  • 网站制作咨询电话网站建设技术员分为前端 后端
  • 9元建站节建材 团购 网站怎么做
  • 河南城乡住房和建设厅网站公司微信网站建设方案模板下载
  • 西安制作公司网站的公司邯郸市三建建筑公司网址
  • 网站建设工作目标惠州网站网站建设
  • 就业创业网站建设微信app下载安装旧版本
  • 沧州网站备案年栾洪全单页做网站教程
  • 网站开发的疑虑做门窗投标网站