更好的设计接口

一些程序具有清晰的设计,并且对新功能进行编码非常容易。 其他程序是拼凑而成的拼布,几乎无法理解的片段,错误修复和胶水。 如果必须为此类程序编写新功能,则最好改写它们。
但是,我怀疑有一个中间立场在当今的干净代码和自动化测试套件中很常见:您拥有一个设计清晰的好的程序,但是当您开始实施新功能时,您意识到这是非常合适的,你不确定为什么。 该怎么办?
我最近在Eclipse Virgo中实现了一个功能,该功能引起了这个问题,我希望能对如何进行工作有所启发。 让我们来看看。
新功能
我一直在改变处女座内核将自己与应用程序隔离的方式。 以前,Equinox支持嵌套的OSGi框架,通过将应用程序置于嵌套框架(“用户区域”)中并与内核共享选定的包和服务,可以很容易地将内核与应用程序隔离。 但是,为了支持OSGi标准的一组框架挂钩,已撤消了嵌套框架支持。 这些挂钩使您可以控制或至少限制捆绑软件,软件包和服务的可见性-所有这些都在一个框架中。
因此,我开始着手在框架挂钩上重新使用处女座。 未来看起来不错:最终可以将这些钩子用于实现多个用户区域,甚至可以重做处女座中实现应用程序作用域的方式。
初步实施
处女座内核中有一个捆绑包负责区域支持,因此我着手重新设计它以使用框架挂钩。 几周后,内核及其所有测试运行正常。 但是,考虑到我编写框架挂钩的基本方法,使用挂钩实现多个用户区域和重做应用程序作用域的愿景已退居二线。 我可以选择忽略此选项,然后叫“ YAGNI!” (您将不需要它!)。 但是我可以确定,一旦将分支合并到master中,必要的概括将使优先级列表下降。 而且,如果我曾经优先考虑泛化工作,那我会忘记很多当时脑海中嗡嗡作响的东西。
后退
因此,第一步是提出一个合适的抽象模型。 几年前,当我们在OSGi联盟中讨论嵌套框架时,我有一些想法:将框架划分为成束的组,然后使用单向连接将这些组连接在一起,这将使某些包和服务可见从一组到另一组。
使用处女座术语,我开始定义如何将框架划分为区域,然后使用包,服务和包过滤器将区域连接在一起。 最初,人们很想避免图形中出现循环,但是很快就清楚了,循环是无害的,并且对于建模Virgo现有的内核和用户区域确实是必需的,而后者需要通过适当的过滤器相互连接。
干净的抽象
很快,我对带有过滤器的图形的类型有了一个很好的主意,因此很容易获得编码,然后将其重构为合理的形状。 但是我对捆绑包和包的过滤将如何相互作用几乎一无所知。 过去,我发现从这样的起点进行重构会浪费大量时间,尤其是在编写测​​试并且需要重新进行测试的情况下。 代码具有更改的惯性,因此通常最好推迟编码,直到我更好地理解为止。
为了获得清晰的抽象和清晰的理解,同时避免“分析麻痹”,我编写了这些连接区域的正式规范 。 这实质上是图形状态及其上操作的数学模型。 这种模型使系统的属性可以在代码中实现之前被发现。 我的朋友和同事史蒂夫·鲍威尔(Steve Powell)热衷于审查规范并提出一些简化建议,不久之后,我们有了一个正式的规范,该规范具有一些相当好的代数性质,可以过滤和组合区域。
为了使您感觉到这些属性的外观,请看下面的示例,该示例说“组合”两个区域(用于描述两个区域的组合外观时使用),然后进行过滤等同于首先过滤两个区域,然后组合结果:
作为一个视觉思想家,为了使正式的规范对非数学家更有用,我还一路上画了很多照片。 这是区域的示例图:
新的实施
我定义了RegionDigraph(“ digraph”是“有向图”的缩写)接口,实现了该接口,并定义了一套单元测试,以提供良好的代码覆盖率。 然后,我根据区域图实现了新的框架挂钩集合,然后删除了旧的框架挂钩和代码,以支持回顾过去形成的区域成员资格概念欠佳的概念,并以区域图为基础的新框架挂钩代替了它。 。
我真的需要吗(IRDNI?)
花了一段时间才使所有内核集成测试再次运行,主要是因为需要配置用户区域,以便将系统捆绑包(属于内核区域)中的软件包与一些新服务(例如区域图)一起导入服务。
当出现问题时,我可以退后一步,根据底层图形进行思考。 通过在Region和RegionDigraph实现类上编写适当的toString方法,该模型变得更易于在调试器中可视化。 这给了我希望,如果出现其他问题,我将有更多的机会调试它们,因为我可以理解底层模型。
在此过程中出现了两个重要问题,都与处女座部署应用程序时使用“附带状态”有关。
首先是需要将捆绑包描述临时添加到用户区域。
第二个是在诊断解析器错误时需要尊重区域图。 在部署和诊断故障时,这相对简单。 当转储解决方案故障状态以进行脱机分析时,它不太直接:区域图也需要转储,因此也可以在脱机分析中使用。
这些问题在最初的框架挂钩实现中将很难解决。 第一个问题将涉及一些相当随意的代码来记录和删除用户区域中的捆绑包描述。 第二种方法将更加棘手,因为存在一个定义不明确且过于静态的区域成员资格概念,如果不像粗暴的黑客入侵一样,就无法将其纳入州立垃圾场。 但是使用区域图,很容易创建一个临时的“ coregion”来包含临时包的描述,并且在状态转储旁边捕获该图应该很简单。
好的,所以我确信该区域图正在增加其重量,并且不是一堆YAGNI。 但是前几天有人挑战我,问“为什么框架挂钩必须如此复杂?”。
不必要的复杂性?
好吧,首先,区域图可确保在五个框架挂钩(捆绑包查找,捆绑包事件,服务查找,服务事件和解析器挂钩)之间保持一致的行为,尤其是在过滤行为,系统捆绑包的处理和传递依赖项(即跨多个)上多于一个区域的连接)。 这种一致性应导致更少的错误,更一致的文档,并易于用户理解。
其次,区域图比基于静态区域成员资格概念的钩子要灵活得多:在创建用户区域之后 ,可以将捆绑软件添加到内核中,应用程序范围应该相对简单,可以在区域方面进行返工,从而提供范围和区域一致的语义(更少的错误,更好的文档等),并且多个用户区域应该相对易于实施。
第三,区域图应该是实现多捆绑应用程序概念的良好基础。 在OSGi联盟中,我们目前正在讨论如何在处女座,Apache Aries,Paremus Service Fabric和其他地方标准化多捆绑应用程序结构。 确实,我将其视为可以用来实现某些基本种类的多捆绑应用程序的概念证明。 作为一个很好的副产品,区域图的发展导致修复了多个Equinox错误,并对框架挂钩规范进行了一些澄清。
下一步
我在撰写此图的时候,区域图正沿着处在3.0线中的处女座储存库“荡漾”。 但是,这个项目开始产生更广泛的影响。 上周,我向OSGi联盟的企业专家组作了关于区域图的介绍 。 引起了很多兴趣,随后甚至讨论了是否应在Equinox中实现该功能,以便该功能可以在处女座以外的其他项目中使用。
后记(2010年3月30日)
 
区域图在处女座中运行良好。 我们必须重新设计管理控制台的基础功能,因为在用户区域中不再有代表内核软件包和服务的“代理”捆绑包。 为了更好地表示从用户区域到内核的连接,需要升级处女座内部的运行时工件模型以直接了解区域。 这是3.0行中正在进行的工作。
同时,Equinox的提交者Tom Watson正在与我合作,将区域有向图代码移至Equinox。 基本原理是确保框架挂钩的多个用户可以共存(通过使用region digraph API而不是直接使用框架挂钩)。
Tom对处女座的Digraph代码做出了一些重大更改,包括持久性支持。 当处女座转储解析失败状态时,它也会转储区域图。 转储的有向图在以后读回,并用于提供解析钩子以分析转储状态,从而确保实时解析器和转储状态分析之间的一致性。
参考:在Mind the Gap博客上,我们的JCG合作伙伴 Glyn Normington 努力寻求更好的设计 。

翻译自: https://www.javacodegeeks.com/2012/08/stumbling-towards-better-design.html

更好的设计接口

更好的设计接口_陷入更好的设计相关推荐

  1. div+css静态网页设计——迪斯尼公主滚动特效(7页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:电影网站设计--迪斯尼公主滚动特效(7页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游 ...

  2. HTML5期末大作业:鲜花超市网站设计——鲜花超市(4页) HTML+CSS+JavaScript HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:鲜花超市网站设计--鲜花超市(4页) HTML+CSS+JavaScript HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 作品介绍 1.网页作品简介 ...

  3. HTML5期末大作业:婚庆网站设计——红色的婚庆(18页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:婚庆网站设计--红色的婚庆(18页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电 ...

  4. HTML+CSS网页设计期末课程大作——XXXXX (X页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作

    HTML+CSS网页设计期末课程大作--XXXXX (X页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商 ...

  5. HTML5期末大作业:甜品奶茶网站设计——甜品奶茶店(19页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作

    HTML5期末大作业:甜品奶茶网站设计--甜品奶茶店(19页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电 ...

  6. HTML+CSS+JS——动漫风二次元论坛(2页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:动漫网站设计--动漫风二次元论坛(2页) HTML5网页设计成品_学生DW静态网页设计. 文章目录 HTML5期末大作业:动漫网站设计--动漫风二次元论坛(2页) HTML5网页 ...

  7. HTML5期末大作业_影视网站设计——_指环王:护戒使者(13页) TML+CSS+JavaScript 学生DWHTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:影视网站设计--"指环王:护戒使者(13页) TML+CSS+JavaScript 学生DWHTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常 ...

  8. HTML5期末大作业:影视网站设计——“指环王:护戒使者(13页) TML+CSS+JavaScript 学生DWHTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:影视网站设计--"指环王:护戒使者(13页) TML+CSS+JavaScript 学生DWHTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常 ...

  9. HTML5期末大作业:电影网站设计——迪斯尼公主滚动特效(7页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:电影网站设计--迪斯尼公主滚动特效(7页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游 ...

最新文章

  1. Codeforces Round #524 (Div. 2) F
  2. 一文彻底理解Java单元测试
  3. Android中的线性布局
  4. 浏览器老是自动跳出广告垃圾网页
  5. 关于PageRank的一些见解
  6. Android使用SVG矢量图打造酷炫动效!
  7. 锁表的进程和语句,并杀掉
  8. mongo 让字段自增或自减
  9. java 反射技术实例,什么是反射技术?Java中最常用的反射技术实例
  10. 【机器学习】隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现
  11. js验证身份证号是否合法
  12. “华为电气—艾默生”系——成就A股最多上市公司的创业群体
  13. HTTP协议为什么是无状态的?无状态指的是什么
  14. Android通过wifi输出声音,SoundWire – 将手机变成电脑的音箱,通过 WiFi播放电脑内的声音...
  15. Google将推出Android手机版Voice应用程序
  16. Kotlin use函数的魔法
  17. 这本书押中了2022北京高考作文题
  18. [ACM]人见人爱A^B
  19. 爬虫学习5——requests进阶(cookie登录、防盗链、
  20. 文本主题模型之潜在语义分析(LSA)

热门文章

  1. UNIX环境高级编程——1.UNIX基础知识
  2. ViewPager2
  3. 欧拉图与半欧拉图的判断
  4. F 分布的定义和概率密度函数
  5. 再探https与重放攻击
  6. Python中取余、除法、取整的操作逻辑
  7. Java线程池设置多少线程合适
  8. 缓冲区溢出攻击(详细解析)
  9. java获取两个时间之间的所有日期、月份、年份,返回列表
  10. PreferenceFragment的简单使用