文档章节

d语言之契约编程

轻舞凋零
 轻舞凋零
发布于 2016/02/01 14:46
字数 303
阅读 44
收藏 0

d语言之契约编程

参考自d程序设计语言---我的博客http://my.oschina.net/u/218155/blog?fromerr=SwOkb7Sw fllow me

import std.stdio;
import std.exception;
import std.algorithm;
import std.range;
import std.conv;
import std.regex;

//contract progarm
//assert
//before func
//after func
//invirant

class Date{
private:
	uint year,month,day;

	invariant(){
		assert(1 <= month && month <=12);
		switch(day){
			case 29:
				assert(month != 2 || leapYear(year));
				break;
			case 30:
				assert(month != 2);
				break;
			case 31:
				assert(longMonth(month));
				break;
			default:
				assert(1<=day && day <= 20);
				break;
		}
	}
	static pure bool leapYear(uint y){
		return (y%4) == 0 && (y%100 || (y %400)==0);
	}
	static pure bool longMonth(uint m){
		return !(m & 1) == (m > 7);
	}

	void nextMonth(){
		//__call_invariant();
		//scope(exit)__call_invariant();
		if(month == 12){
			++year;
			month = 1;
		}else{
			++month;
			adjustDay();
		}
	}
	private void adjustDay(){
		//__call_invariant();
		//scope(exit)__call_invariant();
		switch(day){
			case 29:
				if(month == 2 && !leapYear(year)) day = 28;
				break;
			case 30:
				if(month == 2) day = 28+leapYear(year);
				break;
			case 31:
				if(month == 2) day = 28+leapYear(year);
				break;
			default:
				break;	
		}
	}


}



int add(int x,int y)
in{
	if(x > 1){
		writeln("x is bigger than 1");
	}
}
out(result){
	if(result > 10) {
		writeln("result > 10");
	}
}
body{
	return x+y;
}

class BasicDate {
	private uint day,month,year;
	string format(string spec)
	in{
		writeln("fath");
		assert(spec == "%Y/%m%d");
	}
	body{
		return text(year,'/',month,'/',day);
	}
}
class Mydate:BasicDate{
	override string format(string spec)
	in{
		writeln("son");
		auto parttern = regex("(%[mdY%]|[^%])*");
		assert(!match(spec,parttern).empty);
	}{
		string result;

		return result;
	}

}



void main() {
	//test assert
	//enforce(false,"enforce false ");
	auto d = new Date();
	d.year = 2000;
	d.month = 12;
	d.nextMonth();
	writeln(d);

	int a = 1;
	int b = 1;
	assert(a == b);	
	//test in out
	auto c = add(11,2);

}


© 著作权归作者所有

共有 人打赏支持
上一篇: d语言之模块化
下一篇: d语言之异常
轻舞凋零
粉丝 13
博文 100
码字总数 16794
作品 0
昌平
程序员
私信 提问
D语言 2.069.1 发布,Bug 修复版本

D语言 2.069.1 发布,此版本修复了更新 Windows 版本时 dmd 安装器绑定的问题,详情请看发行说明。 D语言(Dlang)是由Digital Mars公司开发的编程语言,起因是为了改进C++。它与C二进制兼容...

oschina
2015/11/15
2K
7
D语言 2.069.2 Beta 发布,Bug 修复版本

D语言 2.069.2 Beta 发布,,此版本主要是 bug 修复,更新内容: DMD 编译器回退问题 Bugzilla 15292: [REG2.068.0] Segmentation fault with self-referencing struct / inout / alias thi......

oschina
2015/11/30
1K
5
D 2.069.0 Beta 发布,初步支持 Objective-C

编程语言 D 2.069.0 Beta 发布,D语言近期基本一月一更新,此版本主要改进如下: 编译器改进 DMD 已移植到 D 基本支持 Objective-C 废弃 -property 切换 改进 DMD 的编译 库改进 The packag...

oschina
2015/10/26
1K
11
编程语言 D 2.068.2 发布

编程语言 D 2.068.2 发布,此版本主要是 bug 修复: Bugzilla 15021: [REG2.068.1] linker error with speculative instantiation and -inline Bugzilla 15030: [REG2.068.1] ICE with recur......

oschina
2015/09/26
1K
13
编程语言 D 2.068 发布

编程语言 D 2.068 发布,此版本更新内容如下: 编译器改进 Warning: Change in helper function generation might cause link error. The new -profile=gc switch enables profiling memory ......

oschina
2015/08/16
3.1K
18

没有更多内容

加载失败,请刷新页面

加载更多

Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

ORM基础 ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。 我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。 如果我们想使用mysql...

隐匿的蚂蚁
42分钟前
1
0
Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
1
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部