业务建模

2023-05-16

业务建模是OOAD的重要组成部分,简单的说,业务建模就对业务领域问题进行结构化的描述。这个描述将会直接指导最终生成的软件,业务模型是否具有扩展性,业务模型是否能够正确的反映需求,都将影响最终软件的质量。 1. 业务建模 1.1 为什么要业务建模? 我们把业务建模这个概念放在了最后的部分,因为面向对象是业务建模的基础。面向对象是一种用计算机语言模拟现实生活的技术。而传统的语言是基于时序的,是计算机观点的语言,和人们熟悉的社会观点是不同的。在软件发展初期时,这并不是什么很大的问题,但是当软件规模越来越大,变化的速度越来越快的时候。人们发现两种观念有了冲突。例如,订单这个对象是人类社会的一个普遍的商业名词,它是相当稳定的。所不同的只是处理规则有所不同,但在传统的语言中,订单的名词并不是关心的重点,关心的重点反而放在了订单的处理时序上。偏偏这部分的处理是不稳定的,所以就引发了变化的问题。而面向对象采用现实世界系统的思考方式,侧重于建立订单这个类型,并构造订单类型的体系,然后再建立规则。所以,他和现实世界的变化频度是基本一致,变化起来也就比较容易。 我们之前曾多次讨论了面向对象的抽象。我们知道,面向对象用于描述现实世界,他的抽象级别还太低了。所以,后来有了组件技术。组件技术提倡松耦合、粗粒度的构建方式,但是他在本质上和面向对象并没有什么太大的差异。而业务建模的关键,就是如何利用面向对象技术来描述现实世界。 1. 2 业务建模和数据库建模 很多人都经历过基于数据的应用,在需求分析完毕后,立刻建立数据模型,基于数据模型构建应用。这是这种应用的典型做法。利用先进的工具,能够达到很高的开发速度,所以这种方法在CS方式的软件中被大量采用。这种方法的基本思想是使用数据库来表示业务模型。但是我们需要深入的来思考这个问题,是不是数据库能够完全胜任这一点呢?我们就最广泛使用的关系型数据库来进行讨论。 我们知道,关系型数据库的基本原理是集合论。通过定义二维表和使用笛卡儿乘积定义二维表之间的关系来完成设计。这和我们现实生活有一定的类似之处,这是很自然的一件事情,因为数学本身就来源于生活,而软件的基础理论是数学。对于数据来说,它本身并没有很多意义,你能够说明下面这个字符串的意义吗? "香港XX贸易有限公司" 答案是不能,但是通过数据库的表名称和表字段的定义,我们可以大致推算出他的应用范围: 表名:客户列名:中文名称"香港XX贸易有限公司" 我们知道,这个字符串表示了客户的中文名称。但是遗憾的是,这种的定义仍然不够精确,应该承认,它有用,但是意义并不大,对业务没什么帮助。真正对业务有帮助的描述应该是: "香港XX贸易有限公司"是本公司的10大客户之一,我们需要给其比较好的优惠。"香港XX贸易有限公司"的应付款已经到期,必须降低该客户的信用评级。 这些事情是数据库没有办法做的。当然,现在数据库技术的发展一日千里,很多数据库都用不同的技术来帮助客户在数据库上进行业务规则的处理。但是数据库不擅长处理的东西,并没有必要强制在数据库上实现。这些事情,应该由面向对象来进行处理。因为面向对象是数据和操作的完美结合,但是面向对象有一个缺陷,就是持久化的能力很低,所以,数据库仍然是面向对象的最佳合作伙伴。因此,我们有了ORMapping技术,后来又有了JDO的技术。这些都是为了强化面向对象和关系型数据库之间的沟通而设计的,因为他们两者的设计理论不同,所以天生存在很大的隔阂,非得借助中间层次的帮助。而在敏捷方法论中,也专门有研究数据库方面的技术,这表现了数据库技术的重要程度。 1.3 共性和差异性 业务建模中,寻找、区分不同事物之间的共性和差异性是非常关键的。两个业务实体,之间不可能只有共性,如果那样的话,那就只会剩下一个业务实体了;反过来,他们之间也不可能只有差异性,世间万物,皆有关联。退一万步说,他们至少都属于某个组织的业务实体,都是业务实体,这也是他们的共性。在业务模型中进行正确的分析,能够为之后的面向对象建模打下坚实的基础。如果这一步做的不好,你会发现,你是在使用面向对象的技术来编写面向对象过程的代码。 1. 4 不要把表和业务实体混为一谈 对于业务建模而言,业务实体是非常重要的。几乎所有的业务模型,都表现为不同业务实体之间的某种协作关系。Jill Nicola在他的业务对象建模和协作模式一文中,提出了4种的协作类型,并演化出12种协作模式。应该说,他的用意,是对业务模型进行分类,其目标和GOF的设计模式一书是类似的。但是业务模型面对着的,是大千世界中的各种现象,要将它们归类整理,谈何容易。所以,Jill Nicola也仅仅是只能够提出一个思路,但这对业务建模者来说,是很有价值的。 很多开发人员容易把表和业务实体混起来,但它们之间并没有什么联系。正如上文讨论业务建模和数据库建模的关系一样,数据库只是实现业务模型持久化特性的一种手段。把业务实体一对一映射到表,有时候是对的,有时候则不对。业务实体的设计一定是从需求开始,到领域模型,而表设计是基于数据库的处理原则。一个订单实体,在数据库中可能会有两张表,一张是订单、一章是订单子目。很多时候,业务实体的粒度要大于表,但也不一定,例如在ORMapping中,就常常把一个继承树映射到单个表中。所以它们两者之间没有必然的联系。在业务建模时,就单纯的考虑业务实体的设计,在数据库建模时,就单纯的考虑表设计,不要混淆两者。 1. 5 警惕CRUD类型的设计 这个问题产生的本质是数据库设计和业务模型设计的冲突。从数据库的观点来看,任何一种业务都不外乎新增记录、修改记录、删除记录、查询记录。所以象PowerBuilder那样的工具,能够凭借优秀的数据窗体的处理能够里雄踞一方。但是这个观点是业务建模中十分忌讳的,为什么呢?对任何一项业务来说,对记录的处理都不是问题的根本。新增一条记录必定伴随着一项业务的发生,例如销售了一件产品,新注册了一个用户。这种对用户来说才是有意义的,用户并不关心记录的处理,他们只关心业务问题。所以,当你的业务模型如果充满了CRUD的设计,这说明你看待业务模型的角度有问题,你仍然停留在从关系数据库看待业务的层次上。 在软件开发过程中,这个问题需要引起注意。单纯的CRUD方法往往意味着需求没有被正确地理解,模型可能遗漏了需求。我们想象一个新增订单记录的AddOrder方法,一个订单需要填写哪些要素?新增订单时是否需要检查客户的信用记录?是否需要检查产品的库存?现实生活中的业务规则很复杂,不可能如此的简单。那么,现在你可以检查看看你的系统,是否存在着大量的CRUD设计? 1. 6 尽可能使设计贴近现实世界 这一点并不是绝对的,例如,理论上人的生日是不能够调整的,但是在软件的世界中,需要提供修改生日的方法来修正录入的错误。这个问题可以这样理解。对于软件系统来说,并不存在创建人这样的业务模型,这是生命的秘密,不是软件系统能够模拟的。真正有意义的业务模型应该是建立档案,招聘新员工这样的业务模型,因此修改档案和修改员工资料都是允许的。 1. 7 显式接口和隐式接口 想象一个用户管理模型提供特定客户的接口,不同的搜索条件使用不同的参数: Customer getCustomer(int customerID)Customer getCustomer(string customerName) 面向对象能够很好支持重载特性,因此,这种方式声明的接口是相当优雅的。对用户来说,接口是统一的,编译器能够提示你使用合适的重载方法,并帮助你检查类型。问题在于,有一些条件具有相同的参数类型,这就和重载的要求背离了,例如: Customer getCustomer(string customerName)Customer getCustomer(string customerAddr) 这个时候,我们就需要改变一下思路,把接口变成显式定义的: Customer getCustomerByName(string customerName)Customer getCustomerByAddr(string customerAddr) 当方法数量比较少的时候,这种显式接口也很有优势,因为方法名清晰的表示了其意图,用户不需要太多的帮助就能够使用适当的方法。所以我们这里看到方法名的设计是很重要的,而在团队内部保持方法名风格的一致同样是很重要的。 如果获取客户这个方法有十几中的过滤条件,我们发现,显示接口的方法是有问题的,方法列表太多,用户难以使用,而选择逻辑也开始分散,不容易进行扩展。如果说,一个业务方法复杂到了这种程度,我们认为值得多投入一些时间对方法进行改进。我们的思路是把显式接转换为隐式接口,并把过滤条件这个概念进行抽象。请注意我们这么做的理由,方法的目的是相同的,都是获取客户,但是它们的过滤条件不同,所以我们为了提高抽象性,我们把过滤条件的共性表述出来,这就是过滤条件本身。这就是面向对象的威力,不论是任何的事物,都可以在某个程度上进行抽象。所以我们引入了一个新的过滤对象,CustomerFilter。注意,我并不把它命名为Filter,因为我认为过滤是一个通用的特性,很多的对象都具有这种特性,所以,我希望在条件成熟的时候能够从CustomerFilter抽取出一个基类出来,能够将其用于OrderFilter的设计。所以我的命名为将来留有余地,但是我现在并不实现它,因为重构和自动测试技术能够帮助我很快将Filter实现出来,对这一点我毫不担心。罗里罗嗦讲了这么多,我们来看看最后的方法是什么样子的: Customer getCustomer(CustomerFilter customerFilter) 显示接口和隐式接口在设计中大量存在,你无法下结论说哪一种方法比较好,任何一种方法都有其存在的价值。我们做的是根据情况来进行分析,以决定使用哪一种方法。 那么,过滤器是如何实现的呢?过滤器实现中最重要的是就是过滤规则由谁实现。同样的,这里的设计同样是一种权衡。最标准的做法是使用正则表达式,例如"Name Like M*",这样,过滤器本身只是提供了表达式的叙述,至多再进行语法的检查而已,接受过滤器的类需要负责实现过滤功能。很多的系统中都提供了类似的操作,因此,设计时可以充分的利用它们。 在Martin Folwer的分析模式一书中,提到了另一种过滤器的设计思路,把过滤规则封装在过滤器中,由于过滤规则封装在过滤器中,所以过滤器必须提供一个查询方法: isIncluded(Customer aCustomer) 每一次,提供Customer的类需要向过滤器询问,这个客户在过滤器中吗?过滤器回答。这种做法的好处是提供了更大的灵活性,可以实现非常复杂的过滤规则。但是这种过滤规则会生成复杂的过滤器类,这并不是一个好消息。你可以使用简单的Case语句,或是子类化等方法来实现过滤策略。 2. 规范 业务建模不存在一个规范,不同人、不同问题,最后的设计结果一定不同。目前大家比较接收的方式是通过模式的形式来记录、讨论一个业务模型。例如,我们考虑银行的操作人员处理一项业务,这种过程活动就可以使用经典的Participant-Transaction模式来进行描述: 某种角色处理了某个交易,而这个交易和相关的人员都需要记录下来,这种情况适合采用Participant-Transaction模式来解决。模式针对某个特定环境的特点使之很适合用在业务建模中,业务建模的规范确定之后,还可以给出特定技术平台下的实现,从而达到规范代码的目的。 3. 组织 业务建模的组织问题和重用的组织问题极为类似。 4. 过程 最初的模型就保持一个稳定的状态是不太现实的。所以,把大量的时间花费在完善业务模型上并不是一个好的做法。在项目开始的时候,参与项目的双方的配合程度低,相互不能够理解对方的工作,开发方无法理解要处理的问题域,需求方也弄不清楚软件的最后模样。水源已经脏了,下游再怎么清理也是有限的。在这种情况下,你认为领域模型能有多大的稳定性? 但是,如果业务模型不能够快速的确定下来,就会对后续的活动产生影响。所以,在开发过程中,对原先设计和代码的重构能力是非常重要的。具体的说,就是在需求变化或更加明确的情况下,需要对原先错误或不足的设计及代码进行修改,但在添加或修改原有软件的同时,能够保证原先的功能和质量不受影响。所以,为什么迭代的思路不容易贯彻,就是因为后续的变更对之前的架构容易产生影响。而在一个应用中,业务模型往往是整个软件的核心,所以软件重构的能力直接表现为业务模型重构的能力。 对于我们来说,业务模型一方面要尽可能的稳定,少变化,另一方面我们又要求业务模型能够进行快速的变化,以适应需要。所以业务模型设计对过程提出了几点要求: 4.1 针对业务模型构建自动化测试网 我们说过,业务模型是软件设计的核心。任何底层的问题都会反馈到业务模型上来,而业务模型和需求非常的接近,因此测试用例的设计难度比较低。我们知道,测试工作最难的就是如何权衡测试工作量和软件质量的关系,把测试的力量集中在业务模型上,能够有不错的效果(这并不是说其它的部分不需要测试,单元测试的主要思路是测试一切可以测试的东西)。但是这种测试也需要付出额外的代价,最典型的是测试环境的建立,由于是业务模型测试,不可能象单元测试那样容易,所以需要有周全的测试数据和测试计划。这项工作应该放到业务模型的类设计中,成为进度的一部分。如果是业务模型的关联性很大,还要从整体上考虑。 4.2 保持设计的统一 业务模型往往是关联性很强的,而这个趋势将会越来越明显。为什么ERP会如此的复杂,就是因为业务关联性非常的复杂。所以,尽可能在业务建模活动中投入少而精的力量,保持统一的设计风格。这一点很重要,如果设计思路不统一,会对业务模型产生很大的影响。 4.3 审核 由于业务模型的重要程度,因此建议在每一次迭代初期加强对业务模型的审核。尤其是评估业务模型变化对软件设计的影响。 4.4 进度估算 同样的,进度估算同样可以以业务模型为基础进行。因为业务模型的粒度适中,所以进度的分配和统计相对比较容易进行。 参考资料 Design Patterns: Elements of Reusable Object-Oriented Software. Gamma, E. Helm, R. Johnson and J. Vlissides Addison-Wesley 1995. 中文版:《设计模式:可复用面向对象软件的基础》,李英军等译,机械工业出版社2000 年9 月。 J2EE核心模式 Deepak Alur, John Crupi, Dan Malks 牛志奇等译,机械工业出版社。 Effective Java Programming Language Guide. Joshua Bloch 2002 中文版:《Effective Java》潘爱民译,机械工业出版社2003年1月。 [Kel+96b] Wolfgang Keller, Jens Coldewey: Relational Database Access Layers: A Pattern Language, Proceedings PLoP /’96, Allerton Park 1996. [BMR+96] Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal: Pattern-Oriented Software Architecture - A System of Patterns; John Wiley & Sons Ltd., Chichester, England, 1996; ISBN 0-471-95869-7 [Fow97] Martin Fowler: Analysis Patterns- Reusable Object Models; Addison-Wesley Publishing Company, Reading, Massachusetts , 1997; ISBN 0-201-89542-0 [Fowler, roles] Fowler, Martin. Dealing with Roles, http://www.awl.com/cseng/titles/0-201-89542-0/awweb.htm [Fer00b] E. B. Fernandez and X. Yuan. "Analysis patterns for the order and shipment of a product", Procs. of PloP 2000. http://jerry.cs.uiuc.edu/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

业务建模 的相关文章

  • Java内部类的作用

    推荐一 定义 放在一个类的内部的类我们就叫内部类 二 作用 1 内部类可以很好的实现隐藏 一般的非内部类 xff0c 是不允许有 private 与protected权限的 xff0c 但内部类可以 2 xff0e 内部类拥有外围类的所有元
  • Dom4J解析xml文档

    1 DOM4J简介 DOM4J是 dom4j org 出品的一个开源 XML 解析包 DOM4J应用于 Java 平台 xff0c 采用了 Java 集合框架并完全支持 DOM xff0c SAX 和 JAXP DOM4J 使用起来非常简单
  • Eclipse 汉化插件

    汉化Eclipse xff08 1 xff09 下载Eclipse 对应版本的汉化包 下载链接 xff1a http download csdn net detail w57w57w57 7768469 xff08 2 xff09 在ecl
  • 使用java语言,利用多线程调用WebService进行数据处理

    http blog chinaunix net uid 20680669 id 3447319 html
  • excel VBA编程之:单元格保护

    ActiveSheet Unprotect Password 61 34 123 34 Cells 1 4 61 i 此处放上需要处理的代码 ActiveSheet Protect DrawingObjects 61 True Conten
  • vbs宏:excel读取多个文件并合并为一个文件

    Sub MergeFiles Dim p f m amp sh As Worksheet Set sh 61 ActiveSheet Application ScreenUpdating 61 False sh UsedRange Clea
  • vba日期和时间函数汇总和代码

    第一 xff0c vba日期和时间函数的基本用法 Excel中vba日期函数和时间函数分别是DATE和TIME VBA提供了三个无参数函数 xff1a Date Time Now xff0c 分别返回当前电脑系统的日期 时间 日期 43 时
  • 管道过滤器模式(Pipe and Filter)与组合模式(出处:http://haolloyin.blog.51cto.com/1177454/348277)

    之前在 benjielin 前辈的博客中看到 管道过滤器 xff08 Pipe And Filter xff09 模式 xff08 http bj007 blog 51cto com 1701577 345677 xff09 xff0c 当
  • 管道过滤器(Pipe-And-Filter)模式(出处:http://bj007.blog.51cto.com/1701577/345677)

    按照 POSA 面向模式的软件架构 里的说法 xff0c 管道过滤器 xff08 Pipe And Filter xff09 应该属于架构模式 xff0c 因为它通常决定了一个系统的基本架构 管道过滤器和生产流水线类似 xff0c 在生产流
  • 数据库架构的演变

    最近看了很多公司架构的演变的文章 xff0c 发现其中的基本思路和架构演变都很类似 xff0c 这里也总结一下数据库架构的演变以及演变背后的思路 单主机 最开始网站一般都是由典型的LAMP架构演变而来的 xff0c 一般都是一台linux主
  • 如何下载Android源代码

    Android已经火了很长时间了 xff0c 虽然做手机开发也有两年了 xff0c 但是一直没有深入接触到Android 前些天想下载Android源代码来看看 xff0c 没想到http android git kernel org九月初
  • Web数据库

    http baike baidu com link url 61 Tib3flBuOBsLy4IoMAxXt2z36Ms77 mQe85MBq7kJh0XfG7oluhlEinX3Maomb2mboXIcedxDEWvGPIDtNQfxa
  • 大型网站系统架构的演化

    前言 一个成熟的大型网站 xff08 如淘宝 京东等 xff09 的系统架构并不是开始设计就具备完整的高性能 高可用 安全等特性 xff0c 它总是随着用户量的增加 xff0c 业务功能的扩展逐渐演变完善的 xff0c 在这个过程中 xff
  • 架构设计案例分析-高速公路收费运营管理平台

    本文旨在通过对某省高速公路联网收费运营管理平台的架构设计过程进行案例分析 xff0c 描述架构设计的决策过程 1 业务背景 某省的高速公路分为近百个路段 xff0c 不同的路段归属不同的公司建设与运营 xff0c 造成了车辆在跨越不同路段时
  • 图片服务架构演进

    现在几乎任何一个网站 Web App以及移动APP等应用都需要有图片展示的功能 xff0c 对于图片功能从下至上都是很重要的 必须要具有前瞻性的规划好图片服务器 xff0c 图片的上传和下载速度至关重要 xff0c 当然这并不是说一上来就搞
  • 应用系统架构设计

    我们在做着表面上看似是对于各种不同应用的开发 xff0c 其实背后所对应的架构设计都是相对稳定的 在一个好的架构下编程 xff0c 不仅对于开发人员是一件赏心悦目的事情 xff0c 更重要的是软件能够表现出一个健康的姿态 xff1b 而架构
  • 用三层架构与设计模式思想部署企业级数据库业务系统开发

    1 1关于架构 架构这个词从它的出现后 就有许许多多的程序员 架构师们激烈地讨论着它的发展 xff0c 但是架构一词的出现 xff0c 却是随着三层架构的出现才出现的 当然 xff0c 目前应用三层架构开发也正是业界最关注的主题 那么这里我
  • KickStart安装教程

    KickStart安装教程 PXE概念介绍 xff1a PXE技术与RPL技术不同之处为RPL是静态路由 xff0c PXE是动态路由 RPL是根据网卡上的ID号加上其他记录组成的一个Frame xff08 帧 xff09 向服务器发出请求
  • DHCP的基本实现原理

    DHCP是一个局域网的网络协议 xff0c 使用UDP协议工作 xff0c 主要有两个用途 xff1a 给内部网络或网络服务供应商自动分配IP地址 xff0c 给用户或者内部网络管理员作为对所有计算机作中央管理的手段 xff0c 在RFC

随机推荐

  • 详解Windows PE(Windows预安装环境)

    Windows PE Windows PreInstallation Environment Windows PE 直接从字面上翻译就是 Windows预安装环境 xff0c 微软在2002年7月22日发布 xff0c 它的原文解释是 xf
  • Kickstart的高级应用

    Pre 和Postinstall 脚本 kickstart本身提供了一些对系统的基本调整和设置 xff0c 例如设置root密码 xff0c 设置时区等等 但是它不能做某些更细致的调整 xff0c 比如通过chkconfig禁止某些服务 x
  • SMTP错误码/建议解决方法

    SMTP错误码 建议解决方法 错误总表 420 1 Timeout Communication Problem Encountered During Transmission Thie Is a Novell Groupwise Smtp
  • Kickstart+NFS+DHCP+TFTP+PXElinux实现CentOS的网络自动安装

    Linux Kickstart无人值守安装 一 基本原理 PXE Pre boot Execution Environment 是由Intel设计的协议 xff0c 它可以使计算机通过网络启动 协议分为client和server两端 xff
  • 流程制造行业信息系统 架构

    流程制造行业信息系统 架构 执笔人 xff1a 郑玉堂 一 流程制造业信息技术应用的重要性 经济全球化趋势已经给各国经济发展带来越来越深刻的影响 xff0c 各国制造企业在世界市场上进行着日益激烈和残酷的竞争 剧烈的和不可测的市场环境变化
  • OpenGL纹理映射的几个问题

    今天在绘制颜色表的时候 xff0c 出现两个小问题 xff1a 目的是根据一个特定的颜色表 xff0c 用图像方式将颜色表绘制出来 xff0c 根据给定的颜色表 xff0c 我应该绘制出如下的图像才对 xff1a 1 我的颜色表绘制出来的图
  • 将自己写的经常复用的类封装成dll/lib的方法

    如果你的工作长期与某个领域相关 xff0c 比如说长期做直接体绘制 DVR 方面的开发 xff0c 那么你可能经常使用自己的传递函数类 xff0c 如果每一个工程你都把传递函数类的 h和 cpp文件添加进去会比较麻烦 xff0c 其实 xf
  • 从体数据分割谈解决问题之方法

    从体数据分割谈解决问题之方法 一 艰辛历程 xff1a 由于最近在做基于分割信息的体数据可视化时需要得到体数据的分割信息 每个体素的标识数据 xff0c 标识了每个体素属于什么组织 xff0c 为了得到体数据的分割信息我费了不找周折 下面是
  • 求大数的阶乘的位数:PKU :1423:Big Number

    题目描述 xff1a Description In many applications very large integers numbers are required Some of these applications are usin
  • 某人的ACM经历

    ACM经历总结 转帖 首先 xff0c 我想说的就是 xff0c 我是一个很普通的ACMer xff0c 高中没有参加过任何计算机和数学竞赛的经历 xff0c 也没有ben那样过人的天资 xff0c 努力至今也未能取得什么成绩 xff0c
  • PKU2051(优先队列求法)

    题意参见 xff1a http acm pku edu cn JudgeOnline problem id 61 2051 其实这个题目可以理解成os上的进程调度 xff1a 有一些进程 xff0c 每个进程有一个唯一的id和一个执行周期
  • 花钱要区分“投资”行为或“消费”行为(转载)

    在著名的美国第一学府哈佛大学 xff0c 经济学的第一堂课 xff0c 只教二个概念 第一概念 xff1a 花钱要区分 投资 行为或 消费 行为 xff1b 第二概念 xff1a 每月先储蓄30 工资 xff0c 剩下来才消费 有关专家做了
  • 时间管理也要区分“投资行为”与“消费行为”(转载)

    10 年前甲和乙是本科的同学 xff0c 在社会工作5 年后 xff0c 不约而同积蓄了30 万元人民币 5 年前 xff0c 他们都花掉了这30 万元 甲去通州购买了一套房 乙去买了一辆 奥迪 5 年后的今天 xff1a 甲的房子 xff
  • ZooKeeper的选举机制详解

    1 xff09 半数机制 xff1a 集群中半数以上机器存活 xff0c 集群可用 所以 Z ookeeper适合安装奇数台服务器 2 xff09 Zookeeper虽然在配置文件中并没有指定M aster和 S lave 但是 xff0c
  • 写了个幷查集的模板类...

    下面的概念介绍主要参考了 xff1a http www cnblogs com cherish yimi archive 2009 10 11 1580839 html xff0c 根据这个介绍 xff0c 自己写了个稍微通用一点的模板 x
  • PKU_1611(幷查集解法)

    题目来源 xff1a http poj org problem id 61 1611 采用幷查集的思路 xff0c 将同一个组的的学生合并为一个集合 xff0c 最后看那些学生跟student0属于同一个集合即可 下面是我的AC代码 xff
  • POJ2524(并查集)

    题目来源 xff1a http poj org problem id 61 2524 Description There are so many different religions in the world today that it
  • POJ_2236(并查集)

    题目 xff1a Description An earthquake takes place in Southeast Asia The ACM Asia Cooperated Medical team have set up a wire
  • 技术管理中的几个问题

    前几天跟朋友聊天时 xff0c 朋友说他刚刚从一家知名软件公司面试出来 xff0c 朋友去面试的是一家公司的技术管理岗位 xff0c 所以在面试的时候被问及的问题也偏重于技术管理方面的问题 xff0c 在与朋友的聊天中将这几个问题归纳了一下
  • 业务建模

    业务建模是OOAD的重要组成部分 xff0c 简单的说 xff0c 业务建模就对业务领域问题进行结构化的描述 这个描述将会直接指导最终生成的软件 xff0c 业务模型是否具有扩展性 xff0c 业务模型是否能够正确的反映需求 xff0c 都