首页 文章 精选 留言 我的

精选列表

搜索[撒谎模式],共10000篇文章
优秀的个人博客,低调大师

UML和模式应用(2):迭代、进化和敏捷

学习笔记:1小时 一、迭代 建模(构件UML草图。。。)的目的是为了理解,而非文档。 迭代开发是OOA、OOD称为最佳实践的核心。 敏捷实践是有效应用UML的关键。 UP是相对流行的、示范性的的迭代方法。 相对于顺序或瀑布声明周期,迭代和进化式开发对系统及早的引入了编程和测试,并重复这一循环。这种情况通常在没有确定所有详细需求的情况下开始,同时使用反馈来明确和改进演化中的规格说明。 在迭代开发中,依赖于短时快速的开发步骤、反馈和改写来不明确需求和设计。研究实践证明,迭代方法与较高的成功率、生产率和低缺陷率具有关系。 二、UP 软件开发过程描述了构造、部署以及维护软件的方式。 统一过程(UP)是一种流行的构造面向对象系统的迭代软件开发过程。RUP是对统一过程的详细精化,并且被广泛采纳。 UP对于采用OOA/D的项目来说是相对流行的迭代过程。 UP是通用的,是被公认为最佳实践。 UP是十分灵活和开发的,并且鼓励引进其他迭代方法中的有用实践,诸如XP、重构和持续集成等实践。 三、迭代和进化式开发 迭代开发是UP和大多数其他现代方法中的关键实践。在这种声明周期方法中,开发被组织为一系列固定的短期小项目,称为迭代;每次迭代都产生过测试、继承并可执行的局部系统。每次迭代都有各自的需求分析、设计、实现和测试驱动。 迭代声明周期急于对经过多次迭代的系统进行持续扩展和精化,并以循环反馈和调整为核心动力,使之最终成为适当的系统。随着时间和迭代次数的递进,下次同增量式地发展完善,因此这一方法也被成为迭代和增量开发。因为反馈和调整使规格说明和设计不断进化,所以这种方法也称为迭代和进化式开发。 迭代接受变更。瀑布式过程在实现之前,企图全面和正确地规格化、冻结软件的需求集和设计,最终与软件开发中不可避免的变更发生抗争。与其相反,迭代和进化式开发抱以接受变更和改写的态度,并以此为真正的本质的驱动力。 迭代的有点: 减少项目是失败的可能性,提高生产率,降低缺陷率。 在早期缓解高风险(技术、需求、目标、可用性等等)。 早期可见的进展。 早期反馈、用户参与和调整,会产生更接近涉众需求的精化系统。 可控复杂性;团队不会被“分析瘫痪”和长期且复杂的步骤所淹没。 以此迭代中的经验可以被系统地用于改进开发过程本身,并如此反复进行下去。 一般来说,迭代周期范围为2~6周。小步骤、快速反馈和调整是迭代开发的主要思想,迭代时间过长会破坏迭代开发的核心动机并增加项目风险。太短时间(比如一周)不足以获得有意义的产品和反馈。 瀑布模型最失败的地方是假设软件规格说明是可预知和稳定的,并且能在项目开始时就正确定义,同时,具有低变更率。----实际这种假设就是错误的。任何有项目开发经验的人都知道:变更对于软件项目来说是永恒的。 四、敏捷方法及观点 UP提倡风险驱动与客户驱动相结合的迭代计划。这意味着早期的迭代目标要能够识别和降低最高风险,并且能构造客户最关心的可视化特性。 风险驱动迭代开发更为明确地包含了以架构为中心迭代开发的实践,意味着早期迭代要致力于核心架构的构造、测试和稳定。因为没有稳定的架构就会带来高风险。 五、敏捷方法及其观点 敏捷开发通常应用实践定量和进化式开发、使用自适应计划、提倡增量交付并包含其他敏捷性(快速和灵活的响应变更)的价值和实践。 由于特定实践的多样性,因此不可能很精确定义敏捷方法。然而,具备进化式精化的计划、需求和设计的短时间定量迭代是这些方法所公有的基本实践。除此之外,它们还倡导反映简易、轻量、沟通、自组织团队等更多敏捷性的实践和原则。 敏捷宣言: 个体和迭代,超越过程和工具 工作的软件,超越完整的文档 客户协助,超越合同谈判 响应变更,超越履行计划。 本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/101179,如需转载请自行联系原作者

优秀的个人博客,低调大师

事件驱动架构(EDA)和观察者模式

事件驱动架构Event Driven Architecture (EDA) 是一种低耦合可分布式的架构,它通常处理异步信息流。 通常可以把事件看作是业务领域中发生的一个变化。因此,在代码中我们需要定义事件,并且实例化该事件。在.net中,事件可以看作行为的结果。必然有事件发生者和接收者,触发事件的对象为发生者,响应事件的对象则为事件接收者。委托(delegate)则串联起发生者和接收者。C#中委托的概念不在此累述。下面代码是声明委托,初始化委托和调用委托的示例。 声明一个委托 publicdelegateintTestDelegate(objectobj1,objectobj2); 实例化一个委托 TestDelegateTD=newTestDelegate(TestDelegateMethod); 调用一个委托 TestDelegateMethod("ThisisaTest."); 注意,其实在C#中,更多的时候是使用event修饰的delegate。使用event修饰后的委托是一个特殊的委托,它的特殊性体现在对象的封装性上。比如上面的代码可以写成 event TestDelegate TD = TestDelegateMethod;关于event和delegate的更多细节可以参考博文 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx http://blog.monstuff.com/archives/000040.html 假设有如下一个应该场景,一个血压监测仪器,在病人每一次心跳的时候,监测血压,一旦发现病人血压小于80,则开始报警。 那么此处,动作的发出者就是病人,一旦发出心跳这个动作后,(通知)血压检测仪立即检测血压,如果小于80,则发出警报。 有一个BloodPressureMonitor类和Paient类。BloodPressureMonitor类只用一个方法,监测血压。病人类中主要有一个委托和一个HeartBeat()方法。其中每次调用HeartBeat()方法,都会调用委托方法。(此处,委托的意义类似于函数式编程的概念,将函数作为一个变量值,该变量赋予了哪个函数就调用哪个函数)。 因此,在main方法中,主要就是对dosth委托的赋值,也就是对病人每次心跳的时候,要调用一下血压检测仪的CheckPresssure方法。 代码如下: publicdelegatevoidDoAction(ints); classBloodPressureMonitor { publicvoidCheckPresssure(intp) { if(p<80) { Console.WriteLine(String.Format("Alert!Bloodpressureislessthan{0}",p)); } else { Console.WriteLine(String.Format("Bloodpressureis{0}",p)); } } } classPatient{ publiceventDoActiondosth; publicStringName{get;set;} publicintBloodPressure{get;set;} publicvoidHeartBeat() { if(dosth!=null) dosth(BloodPressure); } } classProgram { staticvoidMain(string[]args) { Patientp=newPatient(); p.Name="Tom"; p.BloodPressure=100; BloodPressureMonitormonitor=newBloodPressureMonitor(); p.dosth+=monitor.CheckPresssure; for(inti=0;i<10;i++) { p.BloodPressure-=5; p.HeartBeat(); } } } 运行结果如下: 也许很多人会觉得,那何必这么麻烦,直接在 HeartBeat方法中调用BloodPressureMonitor的CheckPresssure方法不就行了嘛,何必用委托呢?例如直接写成 publicvoidHeartBeat() { newBloodPressureMonitor().CheckPresssure(BloodPressure); } 这样的写法不也是可以实现的吗? 是的,但是这种写法不灵活,首先,使用委托的话,可以利用委托的一些特点,比如调用委托的BeginInvoke方法可以异步在线程池线程上执行。 其次,如果此时再要加一个电话呼叫功能,一旦血压小于60,电话机自动呼叫医生,那么在现有的基础上,改起来十分容易。只需要加个电话类,然后在委托上再挂一个方法就行了。 代码如下: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; namespaceEDA { publicdelegatevoidDoAction(ints);//定义一个委托 classBloodPressureMonitor { publicvoidCheckPresssure(intp) { if(p<80) { Console.WriteLine(String.Format("Alert!Bloodpressureislessthan{0}",p)); } else { Console.WriteLine(String.Format("Bloodpressureis{0}",p)); } } } classTelephone { publicvoidNeedCallDoctor(intp) { if(p<60) { Console.WriteLine(String.Format("Calldoctor!",p)); } } } classPatient { publiceventDoActiondosth; publicStringName{get;set;} publicintBloodPressure{get;set;} publicvoidHeartBeat()//心跳时,调用dosth委托 { if(dosth!=null) dosth(BloodPressure); } } classProgram { staticvoidMain(string[]args) { Patientp=newPatient(); p.Name="Tom"; p.BloodPressure=100; BloodPressureMonitormonitor=newBloodPressureMonitor(); p.dosth+=monitor.CheckPresssure;//具体设定dosth是哪些方法。用+=可以挂载多个方法 TelephonePhone=newTelephone(); p.dosth+=Phone.NeedCallDoctor; for(inti=0;i<10;i++) { p.BloodPressure-=5; p.HeartBeat(); } } } } 附件:http://down.51cto.com/data/2362600 本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1176649,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册