SlideShare a Scribd company logo
Code Contracts の紹介
2015/05/30 サトヤ+プロ生勉強会
自己紹介
• なまえ ゆぽ
• Twitter @yupotown
• 言語 C#, C++, etc.
• 興味 C#, 競プロ, 数学, 音楽ゲーム, etc.
• 高専プロコン勢(サイコロが天敵)
• 勉強会での発表は初めて
2
Code Contracts とは
契約プログラミング in C#
契約プログラミング
• コンセプト:Design by Contract (契約による設計)
• クラスを「使う側」と「作る側」の責任を明確にする
• 仕様をコードの中に書く
• 表明 (assertion)
5
表明
• メソッドの実行前に満たすべき条件
事前条件
• メソッドの実行後に満たすべき条件
事後条件
• 実行前でも実行後でも常に満たすべき条件
不変条件
6
表明の例 – Sqrt
7
public static double MySqrt(double x)
{
Contract.Requires(x >= 0);
Contract.Ensures(Math.Abs(Math.Pow(Contract.Result
<double>(), 2) - x) < eps);
var res = x;
// 計算する
return res;
}
事前条件 (x ≥ 0)
事後条件 (res ^ 2 ≒ x)
表明の例 – Sqrt
8
public static double MySqrt(double x)
{
Contract.Requires(x >= 0);
Contract.Ensures(Math.Abs(Math.Pow(Contract.Result
<double>(), 2) - x) < eps);
var res = x;
// 計算する
return res;
}
メソッドを使う側が
気を付ける
メソッドを作る側が
気を付ける
表明
• メソッドの実行前に満たすべき条件 – 「使う側」の責任
事前条件
• メソッドの実行後に満たすべき条件 – 「作る側」の責任
事後条件
• 実行前でも実行後でも常に満たすべき条件 – 両者の責任
不変条件
9
Code Contractsでできること
10
Code Contractsでできること
• C# で表明が書ける
• using System.Diagnostics.Contracts;
• Contract.Requires() // 事前条件
• Contract.Ensures() // 事後条件
• Contract.Invariant() // 不変条件
• 実行時チェック
• 「引数が事前条件を満たしていなかったら例外」など
11
Code Contractsでできること
• 静的チェック
• ビルド直後に色々なチェックがかかる
12
表明の例
• 文字列 str の最後の文字を取得するメソッド
• 事前条件:str は長さ1以上
• 空文字列の最後の文字?
13
public static char GetLast(string str)
{
Contract.Requires(str.Length >= 1);
return str[str.Length - 1];
}
静的チェック
14
public static void Main(string[] args)
{
var ch = GetLast("");
}
契約違反発見!
Suggest requires
15
public static char GetLast(string str)
{
return str[str.Length - 1];
}
null チェックしよう
str の長さをチェックしよう
まとめ
• Code Contractsで契約プログラミング in C#
• 事前条件
• 事後条件
• 不変条件
• 色々なチェックができる
• 特に静的チェッカが凄い!
16
Code Contracts で僕と契約!
17
おまけ – 導入方法
• Contract クラス
• .NET 4.0 あたりからデフォルトで入っています
• バイナリライター ccrewrite.exe
• 静的チェッカー cccheck.exe
• Code Contracts for .NET extension
• http://bit.ly/1coCsib
( https://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-
1ce455f66970 )
18

More Related Content

PPTX
契約プログラミング
PPTX
Code Contracts in .NET 4
PDF
基礎からのCode Contracts
PDF
Go1.18 Genericsを試す
PPTX
Orange Cube 自社フレームワーク 2015/3
PPTX
C#や.NET Frameworkがやっていること
PDF
Flutterを体験してみませんか
PDF
わんくま名古屋#33(20141115) TDD道場#21
契約プログラミング
Code Contracts in .NET 4
基礎からのCode Contracts
Go1.18 Genericsを試す
Orange Cube 自社フレームワーク 2015/3
C#や.NET Frameworkがやっていること
Flutterを体験してみませんか
わんくま名古屋#33(20141115) TDD道場#21

What's hot (20)

PDF
C# コーディングガイドライン 2013/02/26
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PDF
知って得するC#
PDF
Angularを使ってみる実例いくつか (2015/4/29 GDGKobe)
PDF
Tddのすゝめ
PPTX
Emcpp0506
KEY
Gcdについて?
PPTX
C#言語機能の作り方
PDF
groovy 2.1.0 20130118
PDF
New features of Groovy 2.0 and 2.1
PPTX
N3701 concept lite
PDF
Effective Modern C++ 勉強会#1 Item3,4
PDF
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
PDF
インタフェースの実装パターン
PDF
C#coding guideline その2_20130325
PPT
wankuma #28
PDF
Dart / Flutter コードファイルジェネレート入門
PDF
Groovy Shell Scripting 2015
PDF
Executors and schedulers
PDF
Groovy Bootcamp 2015 by JGGUG
C# コーディングガイドライン 2013/02/26
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
知って得するC#
Angularを使ってみる実例いくつか (2015/4/29 GDGKobe)
Tddのすゝめ
Emcpp0506
Gcdについて?
C#言語機能の作り方
groovy 2.1.0 20130118
New features of Groovy 2.0 and 2.1
N3701 concept lite
Effective Modern C++ 勉強会#1 Item3,4
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
インタフェースの実装パターン
C#coding guideline その2_20130325
wankuma #28
Dart / Flutter コードファイルジェネレート入門
Groovy Shell Scripting 2015
Executors and schedulers
Groovy Bootcamp 2015 by JGGUG
Ad

Code Contracts の紹介