一直认为,契约是类型系统不可或缺的一部分,虽然现在的主流语言都缺乏它。我们知道,现在的组件都是隐藏其实现,公开其接口的。这为大型的复杂系统提供了必要的抽象机制,可是,现在的接口都是只描述了组件可以接受的消息类型(或者习惯上称作方法的签名),对于该组件在什么状态下可以接受该消息,该消息有什么要求和限制,以及组件对于该消息的响应是如何的都没有描述。这些是应该描述的。在支持契约的Eiffel语言中,它们被分别描述为 Precondition和Postcondition。契约不仅仅是一个类型安全的必要组成部分,它还是一个设计工具,可以借此理清各个组件的权利和义务等等关系。
近来突然感觉,契约这个东西可以相当完美的套在并行模型上。让我们再捋一遍。precondition,也就是说某个组件要接受某个消息必须满足的一些条件,在并行环境下,它正好可以表述为同步点,环境(或者说别的组件的状态的总和)所必须具有的状态。待到这个状态点达到了,我们拥有这个 precondition的组件就可以继续运作了。postcondition表明组件对环境的影响,也就是说,当它执行某个方法,会对环境造成的“影响”。
有了这个,我们似乎可以在此基础上证明我们的并行模型是否有问题,会不会产生死锁现象,最不济也可以让我们不需要手动同步各个组件,只要它们规定好自己的 precondition,在条件满足的时候,运行时自动选择该组件开始运行。我觉得这比现在我们采用的低级的同步原语简单的多,功能也没有丝毫降低。
异常是一个一直没有什么定论的东西。由于异常是运行时的,所以它似乎不应该从静态类型系统上借力,照此说来,Java的Checked Exception似乎不太正常,可是有时候我们也会觉得我们似乎可以估计出可能的异常,对于不能预测的异常,大家都没有什么意见,让他们throw,然后导致GameOver就行了,问题集中在我们似乎可以预测的异常上面。
我们先深入的想想,我们要异常来干什么?对付各种异常情况。可是异常情况是什么情况?为了搞清楚这个,我们先得搞清楚什么是正常情况。我们的前提是静态类型正确的程序。也就是我们上面描述的那种有契约和接口的那种程序。正常情况似乎就是,不光是静态类型正确,动态类型也是正确的,并且程序的逻辑也是正确的。上面我们可以知道,如果支持契约,那么我们可以堵住一大批程序的逻辑错误。现在我们可以这样描述异常了,所有不能保证动态类型安全和不能保证逻辑正确的情形。那么,如果程序出现逻辑错误,那就是说我们的契约规定不到的地方,也就是说,是出现了我们分析和设计阶段没有预料到的情况,那么这时候我们能怎么办?没有办法,程序是死的,它一旦被规定出来,就定型了,不能再修改了(这儿暂时不考虑lisp之类的语言),我们唯一能做的就是GameOver。至于 exception,这儿可能就一个作用,体面地退场。当然,如果我们的程序是自适应的,我们可以动态的修改我们的结构,让程序继续运行下去。这就是异常的另外的作用了,现在似乎还看不到exception被这样使用。
分享到:
相关推荐
5. 接口和抽象类:接口是C#中定义一组方法契约的引用类型,实现接口的类必须实现所有定义的方法。抽象类是不能被实例化的类,它可以包含方法的实现细节,但通常至少包含一个抽象方法。 6. 异常处理:C#提供了try-...
1. **服务契约和服务实现**:WCF服务通过接口定义其契约,服务实现该契约以提供实际功能。在StockTrader项目中,这可能涉及到定义如`IStockQuoteService`和`ITradeService`这样的接口,然后创建相应的服务类来实现...
- 服务合同:创建和实现服务合同,包括数据契约和操作契约。 - 服务托管:了解如何在IIS或自承载环境中部署WCF服务。 - 安全性:讨论WCF中的传输安全、消息安全和认证机制。 5. **Entity Framework** - ORM概念...
JLS8对如何抛出和捕获异常、检查异常和非检查异常的差异进行了明确说明。 8. 多线程:Java 8提供了对并发编程的支持,包括线程、同步、锁和并发集合。JLS8描述了线程的生命周期和交互机制,以及如何使用...
6. **并发和并行编程**:线程池、Task类、async/await关键字,以及并发控制和并行计算。 7. **Azure云服务**:了解如何在Azure平台上部署.NET应用,使用存储、数据库、函数和容器服务。 通过深入学习和理解这些...
- 错误处理和异常:学习如何抛出、捕获和处理异常,以增强程序的健壮性。 - 内存管理和垃圾回收:了解.NET的自动内存管理机制,包括引用计数和可达性分析。 - 性能优化:探讨如何编写高效代码,避免常见的性能...
4. 组件容器隔离机制,确保异常崩溃后的快速重启,并通过契约式编程范式提升代码质量。 5. 动态配置的服务组件部署机制,支持多模式集群部署,实现弹性服务部署。 结合Docker容器云技术,Skyline软件架构平台能够更...
- Task并行库:利用Task和async/await进行异步编程,提高程序响应性。 8. 设计模式 - 常见设计模式:如工厂模式、单例模式、观察者模式等,了解其原理和应用场景。 通过以上知识点的学习和理解,你将具备扎实的...
示例描述:本章介绍LINQ的基本语法和使用。 UseQueryExpression 演示LINQ表达式语法的使用。 UseMethodSynax 演示LINQ方法语法的使用。 第5章(\C05) 示例描述:本章介绍LINQ to ADO.NET相关技术和使用。 ...
1. **服务契约**:定义服务接口和操作契约。 2. **绑定**:理解不同类型的绑定(如BasicHttpBinding、NetTcpBinding)及其配置。 3. **终结点**:服务的地址、绑定和合同,以及如何创建和配置。 4. **行为**:服务...
7. **并行流**:Stream API支持并行流操作,这使得开发者可以轻松地利用多核处理器的优势,进行高效的并行计算,极大地提高了代码的执行速度。 8. ** Nashorn JavaScript引擎**:Java 8引入了Nashorn JavaScript...
19. Stream API:讲解Stream的用法,如何进行集合的高效操作和并行处理。 20.反射:介绍反射机制,如何在运行时动态获取类信息和调用方法。 九、Java应用开发 21.Swing和JavaFX:讲解如何使用Java构建图形用户界面...
1. **服务合同**:展示了如何定义服务接口,包括服务操作和数据契约,这是WCF服务的基础。 2. **服务实现**:展示了如何实现服务合同,包括业务逻辑和异常处理。 3. **服务宿主**:展示了如何启动和运行WCF服务,...
Stream API支持串行和并行处理,可以方便地进行数据过滤、转换和聚合,使得大规模数据处理更为高效。 3. **方法引用和构造器引用**: 方法引用允许直接引用已有类的方法,而无需使用Lambda表达式。构造器引用则...
2. 函数式接口和Lambda表达式,极大地简化了事件驱动、异步和并行操作的代码编写。 3. Java Stream API,这是一套新的集合框架操作方式,使得集合的处理更加方便和高效。 4. Java日期时间API,针对原有的日期时间API...
- **异常类层次**:Java提供了一个完整的异常处理机制,包括Exception及其子类,理解何时抛出异常以及如何捕获和处理异常,是编写健壮代码的关键。 - **try-catch-finally**:异常处理的基本结构,确保资源的正确...
这些规则有助于确保在复杂系统中的决策过程是可靠的,并且能够处理各种异常和边缘情况。 在实际应用中,pact-hierarchy可能包含以下组件: 1. **契约定义**:明确每个服务之间的交互格式、数据结构和预期行为。这...
6. **异常处理**:Java提供了异常处理机制,通过`try-catch-finally`块来捕获和处理运行时错误,保证程序的稳定性和健壮性。 7. **集合框架**:Java集合框架包括接口(如List, Set, Queue)和实现这些接口的类(如...
9. 并发和并行:C#提供线程、任务和并发数据结构,便于编写多核处理器上的并行程序。 .NET框架提供了大量的类库,如System.IO用于文件和流操作,System.Net用于网络通信,System.Data.SqlClient用于数据库访问等。...