美文网首页
[化学反应抽取][重构]重构SectionCreator

[化学反应抽取][重构]重构SectionCreator

作者: kuzu | 来源:发表于2019-08-17 17:05 被阅读0次

源程序来自于Daniel Lowe的patent-reaction-extraction项目

问题:

在分析代码的时候发现创建具备作用域范围的List<ExperimentalSection>时,ExperimentalSectionCreator对象中包含的处理流程复杂且难以看懂。存在以下问题:

  1. 流程复杂不利于修改
  2. 不利于替换具体的处理逻辑
  3. 不利于收集运行信息

分析

对源码有兴趣可以通过文章顶部的链接直接去仓库找到dan2097.org.bitbucket.reactionextraction.ExperimentalSectionsCreator。作者在处理传入的headingsAndParagraphs时,使用大量分支判断,方法来回跳转增加不必要的阅读难度,同时又出现很多不必要的语句重复。

SectionCreator.png

经过分析,在这里其实作者将专利文档做了如下分类

  • 标题
  • 次要标题
  • 行内标题
  • 段落

其中,次要标题只影响步骤的组装,其他三类需要专门的处理步骤。

这时,作者的写法就暴露出不少问题。
首当其冲就是不利于拓展,如果我们需要增加一种分类呢?加在哪里,如何复用他的方法都是问题。
其次不能利用多线程,由于Section的组装依赖于列表顺序,否则无法按照段落情况划分Section的范围,这里只能单线程顺序执行。但是其中多次涉及分类和打标签这种无关与顺序的步骤,而这些操作都是调用第三方工具且耗时不短,顺序调用带来大量不必要的延时,完全可以将这些对数据的预处理提前,并发执行之后再利用CountDownLatch控制结果都到达后向下执行。

解决方案

首先要抛弃作者的这种写法。对于不同的分类编写专门的处理器,然后利用责任链模式,将这些处理器串起来。每个处理器只关心自己能否处理当前DOM元素,不能处理就交给下一个处理器,能处理就直接返回结果,不再向后方传递。这样,如果我们需要增加分类,只要向责任链添加新的处理器即可,同时还可以通过调整进入责任链的顺序实现对处理流程的编排控制。如此实现算法和流程的分离,也有利于收集不同处理器的输入输出数据,便于调试分析。
其次,增加预处理机制,对于后续步骤中必须存在且无关顺序的公共步骤,提前到顺序处理之前,然后利用多线程做并行处理。

修改后.png

相关文章

  • [化学反应抽取][重构]重构SectionCreator

    源程序来自于Daniel Lowe的patent-reaction-extraction项目 问题: 在分析代码的...

  • vscode使用指南(代码重构)

    重构 抽取方法 抽取变量 重命名符号

  • 重构——抽取方法

    到处都是重复的代码?方法体又臭又长看不懂?快来试试抽取方法(Extract Method)吧,保证药到病除! 何为...

  • IDEA常用快捷键三

    一、重构 1.重构变量 同步修改变量名称:SHIFT+F6 2.重构方法 修改方法:CTRL+F6 二、抽取 1....

  • idea如何重构与抽取

    重构: 重命名(变量重新命名) 抽取: 抽取参数(静态变量,成员变量,局部变量) 抽取函数(重复代码抽取)

  • Mac OS X IDEA 抽取代码块

    IDEA 在Mac 上抽取方法1-点击菜单的的形式Refactor(重构) - Extract(抽取)- Met...

  • 代码重构专题(转载)

    代码重构(一):函数重构规则代码重构(二):类重构规则代码重构(三):数据重构规则代码重构(四):条件表达式重构规...

  • 重构代码之美

    什么是重构; 为什么要重构; 什么时候重构; 怎样避免重构的现象; 重构的难点在哪里; 如何来实施代码重构; 重构...

  • 代码重构的场景总结

    核心思想:拆细、公用 重构可以是修改变量名、重新安排目录这样简单的物理重构,也可以是抽取子函数、精简冗余设计这样稍...

  • 代码重构的场景总结

    核心思想:拆细、公用 重构可以是修改变量名、重新安排目录这样简单的物理重构,也可以是抽取子函数、精简冗余设计这样稍...

网友评论

      本文标题:[化学反应抽取][重构]重构SectionCreator

      本文链接:https://www.haomeiwen.com/subject/ddqksctx.html