`
javatar
  • 浏览: 1699605 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

契约设计的一些想法

 
阅读更多
契约设计由来已久,各语言的支持方式与级别不尽相同,
契约元素包括:
前验条件(precondition)
后验条件(postcondition)
不变式(invariant)
这里只考虑前验条件的:
需求定义(require)
保证合法性(ensure)
函数的签名算是需求的最基本定义了。
对于合法性的保证,一般采用断言。
Java在1.4以前,大家只能靠简单的函数封装实现。
如,在函数开头:
if (param < 0)
  throw new IllegalArgumentException("param < 0");
或进行简单封装:
Assert.notLessThan(param, 0);
从1.4开始,Java对断言提供语言级别的支持。加入了关键字assert。
如:
assert(param < 0);
因为是语言级别的支持,断言可在生产环境中被擦拭掉,以保证性能。

废话就说到这了,我想说的是,
是否应该在需求定义时就尽可能的保证合法性。
也就是在函数签名上保证合法性,而不是断言。
断言信息需要通过文档才能被调用者获悉。
而函数签名能够更明确。
如:
setSize(Integer size) {
  assert(size > 0);
  ...
}
改为:
setSize(PositiveInteger size) {
  ...
}
当然,这样会多出很多类型定义。
而这些语言是否应给予更多便利支持?

泛型就是一种方式:
setUsers(Map users) {
  for(Iterator iterator = users.entrySet.iterator(); iterator.hasNext();) {
    Map.Entry entry = (Map.Entry)iterator.next();
    assert(entry.getKey() instanceof String);
    assert(entry.getValue() instanceof User);
  }
  ...
}
这个断言是很费时的。
而用泛型:
setUsers(Map<String, User> users) {
  ...
}
泛型一定程度上减少了类型定义的烦琐。
分享到:
评论

相关推荐

    IDEO_设计改变一切

    - IDEO将设计思考作为一种系统化的创新方法,通过培训和实践帮助企业建立创新组合,改造组织,形成适应新社会契约的组织结构。 - IDEO的项目案例和创新方法论被广泛传播,对全球的创新和设计领域产生了深远影响。 ...

    中学生情绪管理团体活动设计.doc

    2. **理性情绪疗法(RET)**:活动设计基于艾利斯的理性情绪行为疗法,认为不合理的想法是情绪困扰的来源。通过辨识和挑战非理性思维方式,用理性思维替代,可以帮助个体解决情绪问题。 3. **情绪管理目标**:活动...

    Scala程序设计(第2版)

    23.5 契约式设计带来更好的设计 446 23.6 帕特农神庙架构 448 23.7 本章回顾与下一章提要 453 第24章 元编程:宏与反射 454 24.1 用于理解类型的工具 455 24.2 运行时反射 455 24.2.1 类型反射 ...

    班触:学习计划好使用对象和合同Touch of Class: Learning to Program Well with Objects and Contracts

    面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件,而契约式设计(Design by Contract, DbC)是一种软件开发方法,它要求开发者明确每个部分(对象、方法)的“契约”,即输入输出的期望条件。...

    独立董事独立性丶关联激励与行为均衡.pdf

    独立董事必须保持独立性,这与激励契约设计产生了冲突。过低的薪酬可能削弱其工作积极性,而过高的薪酬可能导致独立董事过于依赖公司,影响其独立性,形成所谓的“激励悖论”。 【独立性与激励的内在矛盾分析】 ...

    AVALON框架

    这一框架的起源可以追溯到ApacheJServ项目,该项目的核心成员Stefano Mazzocchi及其团队在1999年初意识到,在ApacheJServ项目中使用的一些设计模式具有广泛的适用性,不仅限于该项目本身,还可以扩展应用于构建...

    高效程序员的10个习惯

    - **促进建设性对话**:创建一个开放、包容的环境,让大家能够自由地分享想法而不担心被攻击。 #### 二、跟踪变化 在项目开发的过程中,需求和技术环境常常发生变化。有效跟踪这些变化对于保持项目的顺利进行至关...

    Real World Windows 8 Development

    本书从基础讲起,通过实践的方式详细讲解了Windows 8应用开发的各个方面,包括界面设计、用户交互、数据存储、应用导航、系统契约等,并且提供了大量的实例和技巧帮助开发者打造符合最新标准的现代应用程序。...

    高中历史之教学教研历史学科核心素养佳题共欣赏疑义相与析_评2016年全国卷_选择题_李林川素材pdf

    3. **学术观点与教材知识**:文章提及不同学者对历史的理解,如卢梭的社会契约论、伽达默尔的诠释学理论,以及钟启泉关于核心素养课程发展的讨论,这些都反映了历史学科的学术动态。同时,对高考题目的学术依据进行...

    东财20秋《绩效管理B》单元作业三答卷.docx

    以上内容涵盖了绩效管理中的多个核心知识点,包括平衡计分卡的应用、360度考评方法、学习成长绩效指标的构建、标杆管理的不同类型、绩效评价主体的组合方式、绩效契约的重要性、KPI设计的原则、关键绩效指标的设定...

    员工激励与薪酬福利制度.ppt

    薪酬不仅仅是企业对员工付出劳动的回报,更是企业与员工之间的一种契约关系,体现了员工的知识、技能、经验和工作表现的市场价值。 薪酬设计的核心理念在于区分成本与投资。传统的看法可能将薪酬视为企业的成本,但...

    企业知识型员工的激励研究报告.doc

    研究主要集中在以下几个方面:组织行为对知识型员工的激励因素分析,探讨心理契约在激励中的作用,研究知识型员工的价值观导向,薪酬制度设计,以及从人生心理发展周期角度探讨激励策略。然而,中国文化和环境与西方...

    企业知识型员工流失风险管理.docx

    给人一种琢磨不透的感觉,时间一长,这种感觉很简单让学问型员工产生一种对企业命运和自身仍呆在该企业的前程担忧,从而很简单萌发到有明确的战略规划、清楚的发展目标和更好发展前景的企业去的想法。 (5)员工...

    apprenticeships.me:开发和设计学徒救助! :wrench:

    早在文艺复兴时期,非常普遍,并成为学徒与船长之间的法律契约。 这是学徒开始学习其领域必不可少的技能并最终成为大师的一种方式。 尽管随着时间的流逝,正式的大学路线变得越来越流行,但是软件行业出现了一个...

    非常有用的人际沟通小组活动方案.doc

    2. **约法三章**:在此环节,领导者提出团体规则,强调开放自我、坦诚交流、保守秘密、准时参与等原则,并邀请成员补充和完善,通过集体表决形成团体契约,增强团队凝聚力。 3. **模仿秀**:这个游戏分为两个部分,...

    信息化教学评价与传统教学评价有何不同.doc

    传统评价标准往往由教师或课程设计者设定,对全体学生统一标准。信息化教学则倡导个性化学习,学生在学习方式和内容上有更多选择权。评价标准可能由教师与学生共同制定,更加注重个体差异和学生的主观能动性。 再者...

    管理创新复习题之重点复习.doc

    1. 人性假设:在管理学中,不同的理论对人的本质有不同的看法。"经济人"假设认为人们主要是为了经济利益而工作,选项B对应这一概念。而"社会人"假设(A选项)强调人有社会交往的需求,"关系人"(C选项)则关注人际...

Global site tag (gtag.js) - Google Analytics