狠狠撸

狠狠撸Share a Scribd company logo
基礎からの
Code Contracts

    @neuecc – 2011/5/23
Profile
? Twitter
        => @neuecc
? Blog => http://neue.cc/
? HNは"neuecc" 読むときは“のいえ”で
  ?   ドメ?ン繋いだだけで特に意味はなく発音不能のた
      め(ccは声に出しにくいのでスルーという適当対応)
? Microsoft
      MVP for Visual C#(2011/4-)
? 公開してるラ?ブラリとか
  ?   linq.js
  ?   DynamicJson
  ?   Chaining Assertion
  ?   DbExecutor <- (ちょっとだけ)Code Contracts使った
First Step
Code Contracts
? .NET4から標準搭載された?
? mscorlibにSystem.Diagnostics.Contracts
? (主に)その中のContractクラスのメソッド群
何か動かないよ?
? よくあるnullチェックをしてみようと思った
  ?   Contract.Requiresは事前条件
  ?   引数がnullだったら契約違反という感じにしたい

static void Hoge(string arg)
{
    Contract.Requires(arg != null);
}


? が、実行しても無反応
? Conditional属性がついているのでコンパ?ル時に
  消える(条件付きメソッド、DEBUGとかでお馴染み)
  ?   条件はCONTRACTS_FULL(但し自分で足す意味はない)
何か動かないよ? Part2
? よくあるnullチェックをしてみようと思った                                 again
  ?   Contract.Requires<TException>も事前条件
  ?   引数がnullだったら契約違反で例外ぶん投げたい

static void Hoge(string arg)
{
    Contract.Requires<ArgumentNullException>(arg != null);
}


? が、変な?サートが飛ぶ
? そして?プリは強制終了
? リラ?ターがmustだと?
つまるところ
? Code   Contractsの利用にはリラ?ターが必要

     最終的な配布物はコンパ?ラオプションで契約用コードを
     取り除く。従って実行効率にも影響しない。
     http://ja.wikipedia.org/wiki/契約プログラミング


? 契約は取り除かれなければならない
? そのためにはラ?ブラリだけでは不可能で、コン
  パ?ル時にバ?ナリを弄る必要がある
? 契約の実現のため、現状はバ?ナリ改変している
 ?   真に標準搭載されたと言えるのはリラ?ターがコン
     パ?ラと統合された時かもね
Code Contractsの構成物
? 必須
 ?   Contractクラスなどコードに記述するマーカー
     ?   .NET 4で現状標準搭載されているのはこれだけ
 ?   バ?ナリリラ?ター(ccrewrite.exe)


? オプション
 ?   参照ラ?ブラリ生成(ccrefgen.exe)
 ?   ドキュメント生成(ccdocgen.exe)
 ?   静的チェッカー(cccheck.exe)
     ?   cccheckはPremium Editionのみ
     ?   静的チェックなしの場合は、例外or?サートを投げる実
         行時チェックという形になる
Get Ready to Contracts
Code Contractsの?ンストール
? DevLabs:    Code Contracts
  http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

? Standard     Edition (Visual Studio Professional)
  ?   ccrewrite, ccrefgen, ccdocgen
? Premium      Edition (Visual Studio Premium,Ultimate)
  ?   Standard + cccheck

? Visual
     Studio Express Editionでは使えない
? 静的チェッカーの有無も大きなところ
  ?   契約の正しさが実行時じゃないと確認出来ないとい
      うのは、何が正しいのか分からない初学者にとって
      学習が困難になる
プロジェクトのプロパテ?
       Contractsタブが追加されてる
? に、Code
? チェックボックスをオンにすると各機能が有効に
? パラメータがいっぱいあって困る?
 ?   マニュ?ルを見れば勿論、説明がある
 ?   日本語で?zeclさんのスラ?ドを見よう!
 ?   http://d.hatena.ne.jp/zecl/20110213/p2
事前条件
? Contract.Requires
  ?   無印と<TException>とEndContractBlockの三種
  ?   無印はコンパ?ラ生成のContractExceptionを投げる
      ?   コンパ?ラ生成なので型判別したcatchは不可能
  ?   <TE>の場合は指定した例外を投げる
  ?   EndContractBlockはif-then-throwを<TE>に変換する

// これと
if (arg == null) throw new ArgumentNullException("arg");
Contract.EndContractBlock();

// これは大体等しい
Contract.Requires<ArgumentNullException>(arg != null);
事前条件の違い
? EndContractBlockはレガシー環境用
 ?   バ?ナリリラ?ターがある環境が前提なら不要
? Assembly   Modeの選択
 ?   Requires, Requires<TE>はStandard Contract
 ?   EndContractBlockを使う場合はCustom Parameter




? 無印と<TE>ではリラ?ト時に残るレベルが違う
 ?   無印の場合はReleaseRequiresでは除去される
? DebugはFull、ReleaseではPreまたはReleaseを推奨
事後?不変??ンターフェ?ス
? 事後   : Contract.Ensures
 ?   戻り値を表すContract.Result<T>とセットで使うこと
     が多い

? 不変   : Contract.Invariant
 ?   ContractInvariantMethod属性とセットで
 ?   cimコードスニペットを使えば展開される

? ?ンターフェ?スへの契約
 ?   書くのがヘンテコで面倒くさい
 ?   cintfコードスニペットを使えば展開される
Marriage with IntelliSense
動かしたけど嬉しさ少なめ?
? 静的チェッカなしだと、どうも地味
 ?   Premiumの人なら関係ないですねShit!
? そんな物足りなさを感じる?ナタにVisualな贈り物
? VS拡張:Code    Contracts Editor Extensions
 http://visualstudiogallery.msdn.microsoft.com/85f0aa38
 -a8a8-4811-8b86-e7f0b8d8c71b
? 契約がIntelliSenseに表示される!
? FreeなのでVS    Professionalの人でもOK
おや、標準ラ?ブラリの様子が
? .NET4からBCLも契約済み
 ?   そういう意味では标準搭载と言えなくもない
使い方
? 標準ラ?ブラリは何もしなくても表示される
? 自作の契約はReference   Assemblyを作る必要がある




? Reference
      Assemblyはクラスラ?ブラリなど、契約
 が除去されたリリース用バ?ナリを参照する他の
 ラ?ブラリが契約情報を参照したい場合に必要
 (但し、決してリラ?ト後のバ?ナリに契約を再
 度埋め込めれるわけではない)
但し制限も色々あり
? コンストラクタは表示されません
? ジェネリックメソッドは表示されません
 ?   Enumerable.Rangeは表示されるのにRepeatは表示さ
     れなかったりしてるのが確認できます
 ?   つまるところLINQのメソッドは全滅
? yieldが含まれると表示されません
? dynamicが含まれると表示されません
? よく落ちます(落ちたらVS再起動まで復活しない)


Editor Extensionsに関してはアルファ版だと思って
暖かく見守りましょう
Merit and Demerit
嬉しいこと1
? 引数名を文字列で指定しなくてもいい
  ?   リラ?ターが埋め込んでくれるから
  ?   コードスニペットcrenは文字列指定付きだけど、個
      人的にはそれは不要だと思う

// この文字列で引数名を書くのがかなり?ヤだった
if (arg == null) throw new ArgumentNullException("arg");
// それをCode Contractsではこう書き、そしてこれは
Contract.Requires<ArgumentNullException>(arg != null);
// バ?ナリリラ?ト後にこうなる
// 最後の"arg != null"がメッセージで、
// 条件を文字列として生成してくれているのが分かる
__ContractsRuntime.Requires<ArgumentNullException>(
    arg != null, null, "arg != null");
嬉しいこと2
? ?ンターフェ?スに契約すると、それを実装する
   ものへは何も書かなくても自動で埋め込まれる
// こうして?ンターフェ?スへの契約を作ると(cintfスニペット推奨)
[ContractClass(typeof(IHogeContract))]
public partial interface IHoge
{
    void Show(string arg);
}

[ContractClassFor(typeof(IHoge))]
abstract class IHogeContract : IHoge
{
    public void Show(string arg)
    {
        Contract.Requires<ArgumentNullException>(arg != null);
    }
}
それはとっても嬉しいなって
class ClassA : IHoge
{
    // 何も書いていませんが
    // Contract.Requires<ArgumentNullException>(arg != null)が埋めこまれる
    public void Show(string arg)
    {
        Console.WriteLine(arg);
    }
}

class ClassB : IHoge
{
    // 全てのメソッドにif(arg == null) throwを書く時代さようなら!
    public void Show(string arg)
    {
        Console.WriteLine(arg + arg);
    }
}


? これにより、積極的な?ンターフェ?スの抽出と
    契約の記述が促されます(不純動機ドリブン)
嬉しいこと3
? 静的チェッカーでTester-Doerパターンを安全に

// こんなどうでもいいクラスがあるとして
public class ToaruClass
{
    int value;
    public bool IsReadOnly { get; private set; }

    public void SetValue(int value)
    {
        Contract.Requires(!IsReadOnly);
        this.value = value;
    }
}

var toaru = new ToaruClass();
// IsReadOnlyをチェックしていないのでunproven
toaru.SetValue(100);

// こう書けばSafe
if (!toaru.IsReadOnly) toaru.SetValue(100);
Requiresの基本
? Requiresで検証する要素は外部から見えないと、バ
    ?ナリリラ?ターを通りません
public class ToaruClass
{
    int value;
    private bool isReadOnly;

    public ToaruClass(bool isReadOnly)
    {
        this.isReadOnly = isReadOnly;
    }

    public void SetValue(int value)
    {
        // isReadOnlyが外から不可視なのでダメ
        Contract.Requires(!isReadOnly);
        this.value = value;
    }
}
なんでなんで?
? Requires、事前条件はメソッド呼び出し側が、正し
 い呼び出しが可能かの責任を負う必要がある、つ
 まり外から検証可能でないとならない

? 逆にEnsures、事後条件が正しく成立するかはメ
 ソッド側の責任なので、メソッド内部できちんと
 Ensuresの条件が満たせる必要がある
Requiresの基本 Part2
? Requires内で使えるメソッドはPureなもののみ
   ?   警告なので実行は出来なくはない
// Pureを付けないと警告が!
[Pure]
public static bool IsNull(string arg)
{
    return arg == null;
}

public void Hoge(string arg)
{
    Contract.Requires(!IsNull(arg));
}

? Pure、つまり副作用ナシということ
   ?   String.IsNullOrEmptyなど当然Pure属性ついてます
   ?   Pureかどうかは自己申告制だったり(非Pureなもので
       も付けること自体は可能、勿論それはダメですよ)
嬉しくないこと
? 静的チェッカーは契約の連鎖で成り立っているの
  で、契約されてないラ?ブラリが混じると警告祭
  りになって鬱陶しい
? そういう場合はContract.Assumeで、契約済みを擬
  態していくのだけど数が多いと心が折れる、だけ
  じゃなくコードが汚れて可読性悪化の一方に
? Typeの一部とかExpressionの一部とか、契約済みの
  はずの標準ラ?ブラリの中にも上手く動かないの
  がチラホラ
例えばこんなunproven
// これは静的チェッカでunproven行き
var func = typeof(Func<,>);
var genFunc = func.MakeGenericType(typeof(int), typeof(int));




// 警告を元に、こうAssumeすればいいんですがなんというかかんというか
var func = typeof(Func<,>);
Contract.Assume(func.IsGenericTypeDefinition);
Contract.Assume(func.GetGenericArguments().Length == 2);
var genFunc = func.MakeGenericType(typeof(int), typeof(int));
Unproven Hell
// (object x) => (object)((T)x).name
static Func<object, object> CreateGetValue(Type type, string name)
{
    Contract.Requires<ArgumentNullException>(type != null);
    Contract.Requires<ArgumentNullException>(name != null);

    // Expression.Unboxに事後条件非nullの契約がないため
    // Expression.PropertyOrFieldの引数が求めるrequires expr != null の検証に失敗する
    var x = Expression.Parameter(typeof(object), "x");
    var func = Expression.Lambda<Func<object, object>>(
        Expression.Convert(
            Expression.PropertyOrField(
                (type.IsValueType)
                     ? Expression.Unbox(x, type)
                     : Expression.Convert(x, type),
                name),
            typeof(object)),
        x);

    return func.Compile();
}
どういうこと?
? Expressionも基本的には契約されているんですが、
  Expression.UnboxとかExpression.Assignと
  か、.NET4で新しく追加されたものはあまり契約さ
  れてないみたい
? なので山崎春のunproven祭り
? Expressionは基本的に引数に突っ込んで式としてツ
  リー上に組み立てていくものなので、Assumeする
  のが難しい
 ?   もしAssumeするなら、全部バラして変数にしてから
     組み立てなければならないけど、それはない
そして平穏が訪れる
// 面倒くさくて耐え切れない時は静的検証オフ属性をつけてやる
[ContractVerification(false)]
static Func<object, object> Create(Type type, string name)
{
    // (中略)
}


? Contract.Ensures(Contract.Result<T>()          != null); がど
    れだけ大事かが身にしみて分かる
    ?   しかし定型句すぎて面倒くさいのは事実……
    ?   cenコードスニペットがあるとはいえ
Conclusion
その他
? .NET4標準に入っているContractsラ?ブラリの他に、
 幾つか追加の属性が C:?Program Files
 (x86)?Microsoft?Contracts?Languages?CSharp に
 ある(.csフ??ルぽん置き)
  ?   使い方の詳細はマニュ?ルに載ってる
? Microsoft
     Researchで開発されている自動パラメタ
 ラ?ズドテストPexに対してContractsが記述されて
 いると、有効な自動生成パラメータが生成できる
 ようになる
  http://research.microsoft.com/en-us/projects/pex/
まとめ
? メリットを幾つかあげましたが、忘れてはならな
  い基本的なことは、「事前?事後?不変」の契約
  が出来るということ
? でも、堅苦しい理屈だけじゃなく、目で見て分か
  る実用的な便利さを提供してくれるのはいいね!
? if-then-throwを撲滅してくれるというだけでも十
  分嬉しいなって
? まずはそこからで、徐々に高度にステップ?ップ
  すればいいんじゃないかな
? Expressで使えないのが痛い&Premium以上でない
  と静的チェッカーが使えないのが大変痛いので、
  将来は何とかして欲しいと切実に願う

More Related Content

What's hot (20)

がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
?
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
?
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
?
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
?
现场で役立つシステム设计の原则
现场で役立つシステム设计の原则现场で役立つシステム设计の原则
现场で役立つシステム设计の原则
増田 亨
?
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
Narichika Kajihara
?
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
啓 杉本
?
Reactive extensions入門v0.1
Reactive extensions入門v0.1Reactive extensions入門v0.1
Reactive extensions入門v0.1
一希 大田
?
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Yoshifumi Kawai
?
鲍苍颈迟测によるリアルタイム通信と惭补驳颈肠翱苍颈辞苍による颁#大统一理论の実现
鲍苍颈迟测によるリアルタイム通信と惭补驳颈肠翱苍颈辞苍による颁#大统一理论の実现鲍苍颈迟测によるリアルタイム通信と惭补驳颈肠翱苍颈辞苍による颁#大统一理论の実现
鲍苍颈迟测によるリアルタイム通信と惭补驳颈肠翱苍颈辞苍による颁#大统一理论の実现
Yoshifumi Kawai
?
マイクロにしすぎた结果がこれだよ!
マイクロにしすぎた结果がこれだよ!マイクロにしすぎた结果がこれだよ!
マイクロにしすぎた结果がこれだよ!
mosa siru
?
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
torisoup
?
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
?
鲍苍颈搁虫完全に理解した
鲍苍颈搁虫完全に理解した鲍苍颈搁虫完全に理解した
鲍苍颈搁虫完全に理解した
torisoup
?
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
UnityTechnologiesJapan002
?
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
Unity Technologies Japan K.K.
?
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
信之 岩永
?
ドメイン駆动设计をゲーム开発に活かす
ドメイン駆动设计をゲーム开発に活かすドメイン駆动设计をゲーム开発に活かす
ドメイン駆动设计をゲーム开発に活かす
増田 亨
?
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
?
ソーシャルゲームのためのデータベース设计
ソーシャルゲームのためのデータベース设计ソーシャルゲームのためのデータベース设计
ソーシャルゲームのためのデータベース设计
Yoshinori Matsunobu
?
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
?
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
?
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
?
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
?
现场で役立つシステム设计の原则
现场で役立つシステム设计の原则现场で役立つシステム设计の原则
现场で役立つシステム设计の原则
増田 亨
?
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
Narichika Kajihara
?
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
啓 杉本
?
Reactive extensions入門v0.1
Reactive extensions入門v0.1Reactive extensions入門v0.1
Reactive extensions入門v0.1
一希 大田
?
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Yoshifumi Kawai
?
鲍苍颈迟测によるリアルタイム通信と惭补驳颈肠翱苍颈辞苍による颁#大统一理论の実现
鲍苍颈迟测によるリアルタイム通信と惭补驳颈肠翱苍颈辞苍による颁#大统一理论の実现鲍苍颈迟测によるリアルタイム通信と惭补驳颈肠翱苍颈辞苍による颁#大统一理论の実现
鲍苍颈迟测によるリアルタイム通信と惭补驳颈肠翱苍颈辞苍による颁#大统一理论の実现
Yoshifumi Kawai
?
マイクロにしすぎた结果がこれだよ!
マイクロにしすぎた结果がこれだよ!マイクロにしすぎた结果がこれだよ!
マイクロにしすぎた结果がこれだよ!
mosa siru
?
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
torisoup
?
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
?
鲍苍颈搁虫完全に理解した
鲍苍颈搁虫完全に理解した鲍苍颈搁虫完全に理解した
鲍苍颈搁虫完全に理解した
torisoup
?
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
UnityTechnologiesJapan002
?
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
Unity Technologies Japan K.K.
?
ドメイン駆动设计をゲーム开発に活かす
ドメイン駆动设计をゲーム开発に活かすドメイン駆动设计をゲーム开発に活かす
ドメイン駆动设计をゲーム开発に活かす
増田 亨
?
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
?
ソーシャルゲームのためのデータベース设计
ソーシャルゲームのためのデータベース设计ソーシャルゲームのためのデータベース设计
ソーシャルゲームのためのデータベース设计
Yoshinori Matsunobu
?

Viewers also liked (16)

Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
?
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
?
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
Yoshifumi Kawai
?
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
Kouji Matsui
?
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
Unity Technologies Japan K.K.
?
F# 3.0 Quick Preview
F# 3.0 Quick PreviewF# 3.0 Quick Preview
F# 3.0 Quick Preview
igeta
?
Fluent Feature in F#
Fluent Feature in F#Fluent Feature in F#
Fluent Feature in F#
igeta
?
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
?
ASP.NET Core のお気に入りの機能たち (docker向け)
ASP.NET Core のお気に入りの機能たち (docker向け)ASP.NET Core のお気に入りの機能たち (docker向け)
ASP.NET Core のお気に入りの機能たち (docker向け)
Takayoshi Tanaka
?
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Yoshifumi Kawai
?
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Yoshifumi Kawai
?
Clash of Oni Online - VR Multiplay Sword Action
Clash of Oni Online - VR Multiplay Sword Action Clash of Oni Online - VR Multiplay Sword Action
Clash of Oni Online - VR Multiplay Sword Action
Yoshifumi Kawai
?
窜别谤辞贵辞谤尘补迟迟别谤に见る颁#で最速のシリアライザを作成する100亿の方法
窜别谤辞贵辞谤尘补迟迟别谤に见る颁#で最速のシリアライザを作成する100亿の方法窜别谤辞贵辞谤尘补迟迟别谤に见る颁#で最速のシリアライザを作成する100亿の方法
窜别谤辞贵辞谤尘补迟迟别谤に见る颁#で最速のシリアライザを作成する100亿の方法
Yoshifumi Kawai
?
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
Yoshifumi Kawai
?
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
Yoshifumi Kawai
?
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
Unity Technologies Japan K.K.
?
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
?
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
?
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
Yoshifumi Kawai
?
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
Kouji Matsui
?
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
Unity Technologies Japan K.K.
?
F# 3.0 Quick Preview
F# 3.0 Quick PreviewF# 3.0 Quick Preview
F# 3.0 Quick Preview
igeta
?
Fluent Feature in F#
Fluent Feature in F#Fluent Feature in F#
Fluent Feature in F#
igeta
?
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
?
ASP.NET Core のお気に入りの機能たち (docker向け)
ASP.NET Core のお気に入りの機能たち (docker向け)ASP.NET Core のお気に入りの機能たち (docker向け)
ASP.NET Core のお気に入りの機能たち (docker向け)
Takayoshi Tanaka
?
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Yoshifumi Kawai
?
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Yoshifumi Kawai
?
Clash of Oni Online - VR Multiplay Sword Action
Clash of Oni Online - VR Multiplay Sword Action Clash of Oni Online - VR Multiplay Sword Action
Clash of Oni Online - VR Multiplay Sword Action
Yoshifumi Kawai
?
窜别谤辞贵辞谤尘补迟迟别谤に见る颁#で最速のシリアライザを作成する100亿の方法
窜别谤辞贵辞谤尘补迟迟别谤に见る颁#で最速のシリアライザを作成する100亿の方法窜别谤辞贵辞谤尘补迟迟别谤に见る颁#で最速のシリアライザを作成する100亿の方法
窜别谤辞贵辞谤尘补迟迟别谤に见る颁#で最速のシリアライザを作成する100亿の方法
Yoshifumi Kawai
?
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
Yoshifumi Kawai
?
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
Yoshifumi Kawai
?
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
Unity Technologies Japan K.K.
?

Similar to 基礎からのCode Contracts (20)

C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
?
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
Takahiro Yoshimura
?
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
C#coding guideline その2_20130325
C#coding guideline その2_20130325C#coding guideline その2_20130325
C#coding guideline その2_20130325
Yoshihisa Ozaki
?
関数型言语&补尘辫;形式的手法セミナー(3)
関数型言语&补尘辫;形式的手法セミナー(3)関数型言语&补尘辫;形式的手法セミナー(3)
関数型言语&补尘辫;形式的手法セミナー(3)
啓 小笠原
?
颁丑谤辞尘别で箩补惫补蝉肠谤颈辫迟デバッグ!まず半歩?
颁丑谤辞尘别で箩补惫补蝉肠谤颈辫迟デバッグ!まず半歩?颁丑谤辞尘别で箩补惫补蝉肠谤颈辫迟デバッグ!まず半歩?
颁丑谤辞尘别で箩补惫补蝉肠谤颈辫迟デバッグ!まず半歩?
Yuji Nojima
?
颁?颁++用のコードカバレッジツールを自作してみた话
颁?颁++用のコードカバレッジツールを自作してみた话颁?颁++用のコードカバレッジツールを自作してみた话
颁?颁++用のコードカバレッジツールを自作してみた话
simotin13 Miyazaki
?
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
Yugo Shimizu
?
プログラミング勉強会 その0
プログラミング勉強会 その0プログラミング勉強会 その0
プログラミング勉強会 その0
Hirokazu Fukami
?
贵濒耻迟迟别谤を体験してみませんか
贵濒耻迟迟别谤を体験してみませんか贵濒耻迟迟别谤を体験してみませんか
贵濒耻迟迟别谤を体験してみませんか
cch-robo
?
コンテナ时代にインフラエンジニアは何をするのか
コンテナ时代にインフラエンジニアは何をするのかコンテナ时代にインフラエンジニアは何をするのか
コンテナ时代にインフラエンジニアは何をするのか
gree_tech
?
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
?
颁谤耻颈蝉别颁辞苍迟谤辞濒.狈贰罢设置
颁谤耻颈蝉别颁辞苍迟谤辞濒.狈贰罢设置颁谤耻颈蝉别颁辞苍迟谤辞濒.狈贰罢设置
颁谤耻颈蝉别颁辞苍迟谤辞濒.狈贰罢设置
Kuniaki Igarashi
?
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
Toru Yamaguchi
?
Entity Framework 5.0 deep dive
Entity Framework 5.0 deep diveEntity Framework 5.0 deep dive
Entity Framework 5.0 deep dive
Atsushi Fukui
?
HttpClientModule
HttpClientModuleHttpClientModule
HttpClientModule
Kentarou Takeda
?
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidation
Takayoshi Tanaka
?
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
?
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
?
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
Takahiro Yoshimura
?
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
C#coding guideline その2_20130325
C#coding guideline その2_20130325C#coding guideline その2_20130325
C#coding guideline その2_20130325
Yoshihisa Ozaki
?
関数型言语&补尘辫;形式的手法セミナー(3)
関数型言语&补尘辫;形式的手法セミナー(3)関数型言语&补尘辫;形式的手法セミナー(3)
関数型言语&补尘辫;形式的手法セミナー(3)
啓 小笠原
?
颁丑谤辞尘别で箩补惫补蝉肠谤颈辫迟デバッグ!まず半歩?
颁丑谤辞尘别で箩补惫补蝉肠谤颈辫迟デバッグ!まず半歩?颁丑谤辞尘别で箩补惫补蝉肠谤颈辫迟デバッグ!まず半歩?
颁丑谤辞尘别で箩补惫补蝉肠谤颈辫迟デバッグ!まず半歩?
Yuji Nojima
?
颁?颁++用のコードカバレッジツールを自作してみた话
颁?颁++用のコードカバレッジツールを自作してみた话颁?颁++用のコードカバレッジツールを自作してみた话
颁?颁++用のコードカバレッジツールを自作してみた话
simotin13 Miyazaki
?
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
Yugo Shimizu
?
プログラミング勉強会 その0
プログラミング勉強会 その0プログラミング勉強会 その0
プログラミング勉強会 その0
Hirokazu Fukami
?
贵濒耻迟迟别谤を体験してみませんか
贵濒耻迟迟别谤を体験してみませんか贵濒耻迟迟别谤を体験してみませんか
贵濒耻迟迟别谤を体験してみませんか
cch-robo
?
コンテナ时代にインフラエンジニアは何をするのか
コンテナ时代にインフラエンジニアは何をするのかコンテナ时代にインフラエンジニアは何をするのか
コンテナ时代にインフラエンジニアは何をするのか
gree_tech
?
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
?
颁谤耻颈蝉别颁辞苍迟谤辞濒.狈贰罢设置
颁谤耻颈蝉别颁辞苍迟谤辞濒.狈贰罢设置颁谤耻颈蝉别颁辞苍迟谤辞濒.狈贰罢设置
颁谤耻颈蝉别颁辞苍迟谤辞濒.狈贰罢设置
Kuniaki Igarashi
?
Entity Framework 5.0 deep dive
Entity Framework 5.0 deep diveEntity Framework 5.0 deep dive
Entity Framework 5.0 deep dive
Atsushi Fukui
?
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidation
Takayoshi Tanaka
?
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
?

More from Yoshifumi Kawai (19)

A quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSA quick tour of the Cysharp OSS
A quick tour of the Cysharp OSS
Yoshifumi Kawai
?
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthA Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
Yoshifumi Kawai
?
Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#
Yoshifumi Kawai
?
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
?
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
?
Implements OpenTelemetry Collector in DotNet
Implements OpenTelemetry Collector in DotNetImplements OpenTelemetry Collector in DotNet
Implements OpenTelemetry Collector in DotNet
Yoshifumi Kawai
?
Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)
Yoshifumi Kawai
?
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
Yoshifumi Kawai
?
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
True Cloud Native Batch Workflow for .NET with MicroBatchFrameworkTrue Cloud Native Batch Workflow for .NET with MicroBatchFramework
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
Yoshifumi Kawai
?
Memory Management of C# with Unity Native Collections
Memory Management of C# with Unity Native CollectionsMemory Management of C# with Unity Native Collections
Memory Management of C# with Unity Native Collections
Yoshifumi Kawai
?
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
?
Binary Reading in C#
Binary Reading in C#Binary Reading in C#
Binary Reading in C#
Yoshifumi Kawai
?
RuntimeUnitTestToolkit for Unity(English)
RuntimeUnitTestToolkit for Unity(English)RuntimeUnitTestToolkit for Unity(English)
RuntimeUnitTestToolkit for Unity(English)
Yoshifumi Kawai
?
How to make the Fastest C# Serializer, In the case of ZeroFormatter
How to make the Fastest C# Serializer, In the case of ZeroFormatterHow to make the Fastest C# Serializer, In the case of ZeroFormatter
How to make the Fastest C# Serializer, In the case of ZeroFormatter
Yoshifumi Kawai
?
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...
Yoshifumi Kawai
?
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery
LINQPad with LINQ to BigQuery - Desktop Client for BigQueryLINQPad with LINQ to BigQuery - Desktop Client for BigQuery
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery
Yoshifumi Kawai
?
History & Practices for UniRx(EN)
History & Practices for UniRx(EN)History & Practices for UniRx(EN)
History & Practices for UniRx(EN)
Yoshifumi Kawai
?
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
?
Introduction to NotifyPropertyChangedGenerator
Introduction to NotifyPropertyChangedGeneratorIntroduction to NotifyPropertyChangedGenerator
Introduction to NotifyPropertyChangedGenerator
Yoshifumi Kawai
?
A quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSA quick tour of the Cysharp OSS
A quick tour of the Cysharp OSS
Yoshifumi Kawai
?
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthA Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
Yoshifumi Kawai
?
Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#
Yoshifumi Kawai
?
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
?
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
?
Implements OpenTelemetry Collector in DotNet
Implements OpenTelemetry Collector in DotNetImplements OpenTelemetry Collector in DotNet
Implements OpenTelemetry Collector in DotNet
Yoshifumi Kawai
?
Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)Deep Dive async/await in Unity with UniTask(EN)
Deep Dive async/await in Unity with UniTask(EN)
Yoshifumi Kawai
?
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
Yoshifumi Kawai
?
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
True Cloud Native Batch Workflow for .NET with MicroBatchFrameworkTrue Cloud Native Batch Workflow for .NET with MicroBatchFramework
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
Yoshifumi Kawai
?
Memory Management of C# with Unity Native Collections
Memory Management of C# with Unity Native CollectionsMemory Management of C# with Unity Native Collections
Memory Management of C# with Unity Native Collections
Yoshifumi Kawai
?
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
?
RuntimeUnitTestToolkit for Unity(English)
RuntimeUnitTestToolkit for Unity(English)RuntimeUnitTestToolkit for Unity(English)
RuntimeUnitTestToolkit for Unity(English)
Yoshifumi Kawai
?
How to make the Fastest C# Serializer, In the case of ZeroFormatter
How to make the Fastest C# Serializer, In the case of ZeroFormatterHow to make the Fastest C# Serializer, In the case of ZeroFormatter
How to make the Fastest C# Serializer, In the case of ZeroFormatter
Yoshifumi Kawai
?
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...
Yoshifumi Kawai
?
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery
LINQPad with LINQ to BigQuery - Desktop Client for BigQueryLINQPad with LINQ to BigQuery - Desktop Client for BigQuery
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery
Yoshifumi Kawai
?
History & Practices for UniRx(EN)
History & Practices for UniRx(EN)History & Practices for UniRx(EN)
History & Practices for UniRx(EN)
Yoshifumi Kawai
?
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
?
Introduction to NotifyPropertyChangedGenerator
Introduction to NotifyPropertyChangedGeneratorIntroduction to NotifyPropertyChangedGenerator
Introduction to NotifyPropertyChangedGenerator
Yoshifumi Kawai
?

基礎からのCode Contracts

  • 1. 基礎からの Code Contracts @neuecc – 2011/5/23
  • 2. Profile ? Twitter => @neuecc ? Blog => http://neue.cc/ ? HNは"neuecc" 読むときは“のいえ”で ? ドメ?ン繋いだだけで特に意味はなく発音不能のた め(ccは声に出しにくいのでスルーという適当対応) ? Microsoft MVP for Visual C#(2011/4-) ? 公開してるラ?ブラリとか ? linq.js ? DynamicJson ? Chaining Assertion ? DbExecutor <- (ちょっとだけ)Code Contracts使った
  • 4. Code Contracts ? .NET4から標準搭載された? ? mscorlibにSystem.Diagnostics.Contracts ? (主に)その中のContractクラスのメソッド群
  • 5. 何か動かないよ? ? よくあるnullチェックをしてみようと思った ? Contract.Requiresは事前条件 ? 引数がnullだったら契約違反という感じにしたい static void Hoge(string arg) { Contract.Requires(arg != null); } ? が、実行しても無反応 ? Conditional属性がついているのでコンパ?ル時に 消える(条件付きメソッド、DEBUGとかでお馴染み) ? 条件はCONTRACTS_FULL(但し自分で足す意味はない)
  • 6. 何か動かないよ? Part2 ? よくあるnullチェックをしてみようと思った again ? Contract.Requires<TException>も事前条件 ? 引数がnullだったら契約違反で例外ぶん投げたい static void Hoge(string arg) { Contract.Requires<ArgumentNullException>(arg != null); } ? が、変な?サートが飛ぶ ? そして?プリは強制終了 ? リラ?ターがmustだと?
  • 7. つまるところ ? Code Contractsの利用にはリラ?ターが必要 最終的な配布物はコンパ?ラオプションで契約用コードを 取り除く。従って実行効率にも影響しない。 http://ja.wikipedia.org/wiki/契約プログラミング ? 契約は取り除かれなければならない ? そのためにはラ?ブラリだけでは不可能で、コン パ?ル時にバ?ナリを弄る必要がある ? 契約の実現のため、現状はバ?ナリ改変している ? 真に標準搭載されたと言えるのはリラ?ターがコン パ?ラと統合された時かもね
  • 8. Code Contractsの構成物 ? 必須 ? Contractクラスなどコードに記述するマーカー ? .NET 4で現状標準搭載されているのはこれだけ ? バ?ナリリラ?ター(ccrewrite.exe) ? オプション ? 参照ラ?ブラリ生成(ccrefgen.exe) ? ドキュメント生成(ccdocgen.exe) ? 静的チェッカー(cccheck.exe) ? cccheckはPremium Editionのみ ? 静的チェックなしの場合は、例外or?サートを投げる実 行時チェックという形になる
  • 9. Get Ready to Contracts
  • 10. Code Contractsの?ンストール ? DevLabs: Code Contracts http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx ? Standard Edition (Visual Studio Professional) ? ccrewrite, ccrefgen, ccdocgen ? Premium Edition (Visual Studio Premium,Ultimate) ? Standard + cccheck ? Visual Studio Express Editionでは使えない ? 静的チェッカーの有無も大きなところ ? 契約の正しさが実行時じゃないと確認出来ないとい うのは、何が正しいのか分からない初学者にとって 学習が困難になる
  • 11. プロジェクトのプロパテ? Contractsタブが追加されてる ? に、Code ? チェックボックスをオンにすると各機能が有効に ? パラメータがいっぱいあって困る? ? マニュ?ルを見れば勿論、説明がある ? 日本語で?zeclさんのスラ?ドを見よう! ? http://d.hatena.ne.jp/zecl/20110213/p2
  • 12. 事前条件 ? Contract.Requires ? 無印と<TException>とEndContractBlockの三種 ? 無印はコンパ?ラ生成のContractExceptionを投げる ? コンパ?ラ生成なので型判別したcatchは不可能 ? <TE>の場合は指定した例外を投げる ? EndContractBlockはif-then-throwを<TE>に変換する // これと if (arg == null) throw new ArgumentNullException("arg"); Contract.EndContractBlock(); // これは大体等しい Contract.Requires<ArgumentNullException>(arg != null);
  • 13. 事前条件の違い ? EndContractBlockはレガシー環境用 ? バ?ナリリラ?ターがある環境が前提なら不要 ? Assembly Modeの選択 ? Requires, Requires<TE>はStandard Contract ? EndContractBlockを使う場合はCustom Parameter ? 無印と<TE>ではリラ?ト時に残るレベルが違う ? 無印の場合はReleaseRequiresでは除去される ? DebugはFull、ReleaseではPreまたはReleaseを推奨
  • 14. 事後?不変??ンターフェ?ス ? 事後 : Contract.Ensures ? 戻り値を表すContract.Result<T>とセットで使うこと が多い ? 不変 : Contract.Invariant ? ContractInvariantMethod属性とセットで ? cimコードスニペットを使えば展開される ? ?ンターフェ?スへの契約 ? 書くのがヘンテコで面倒くさい ? cintfコードスニペットを使えば展開される
  • 16. 動かしたけど嬉しさ少なめ? ? 静的チェッカなしだと、どうも地味 ? Premiumの人なら関係ないですねShit! ? そんな物足りなさを感じる?ナタにVisualな贈り物 ? VS拡張:Code Contracts Editor Extensions http://visualstudiogallery.msdn.microsoft.com/85f0aa38 -a8a8-4811-8b86-e7f0b8d8c71b ? 契約がIntelliSenseに表示される! ? FreeなのでVS Professionalの人でもOK
  • 17. おや、標準ラ?ブラリの様子が ? .NET4からBCLも契約済み ? そういう意味では标準搭载と言えなくもない
  • 18. 使い方 ? 標準ラ?ブラリは何もしなくても表示される ? 自作の契約はReference Assemblyを作る必要がある ? Reference Assemblyはクラスラ?ブラリなど、契約 が除去されたリリース用バ?ナリを参照する他の ラ?ブラリが契約情報を参照したい場合に必要 (但し、決してリラ?ト後のバ?ナリに契約を再 度埋め込めれるわけではない)
  • 19. 但し制限も色々あり ? コンストラクタは表示されません ? ジェネリックメソッドは表示されません ? Enumerable.Rangeは表示されるのにRepeatは表示さ れなかったりしてるのが確認できます ? つまるところLINQのメソッドは全滅 ? yieldが含まれると表示されません ? dynamicが含まれると表示されません ? よく落ちます(落ちたらVS再起動まで復活しない) Editor Extensionsに関してはアルファ版だと思って 暖かく見守りましょう
  • 21. 嬉しいこと1 ? 引数名を文字列で指定しなくてもいい ? リラ?ターが埋め込んでくれるから ? コードスニペットcrenは文字列指定付きだけど、個 人的にはそれは不要だと思う // この文字列で引数名を書くのがかなり?ヤだった if (arg == null) throw new ArgumentNullException("arg"); // それをCode Contractsではこう書き、そしてこれは Contract.Requires<ArgumentNullException>(arg != null); // バ?ナリリラ?ト後にこうなる // 最後の"arg != null"がメッセージで、 // 条件を文字列として生成してくれているのが分かる __ContractsRuntime.Requires<ArgumentNullException>( arg != null, null, "arg != null");
  • 22. 嬉しいこと2 ? ?ンターフェ?スに契約すると、それを実装する ものへは何も書かなくても自動で埋め込まれる // こうして?ンターフェ?スへの契約を作ると(cintfスニペット推奨) [ContractClass(typeof(IHogeContract))] public partial interface IHoge { void Show(string arg); } [ContractClassFor(typeof(IHoge))] abstract class IHogeContract : IHoge { public void Show(string arg) { Contract.Requires<ArgumentNullException>(arg != null); } }
  • 23. それはとっても嬉しいなって class ClassA : IHoge { // 何も書いていませんが // Contract.Requires<ArgumentNullException>(arg != null)が埋めこまれる public void Show(string arg) { Console.WriteLine(arg); } } class ClassB : IHoge { // 全てのメソッドにif(arg == null) throwを書く時代さようなら! public void Show(string arg) { Console.WriteLine(arg + arg); } } ? これにより、積極的な?ンターフェ?スの抽出と 契約の記述が促されます(不純動機ドリブン)
  • 24. 嬉しいこと3 ? 静的チェッカーでTester-Doerパターンを安全に // こんなどうでもいいクラスがあるとして public class ToaruClass { int value; public bool IsReadOnly { get; private set; } public void SetValue(int value) { Contract.Requires(!IsReadOnly); this.value = value; } } var toaru = new ToaruClass(); // IsReadOnlyをチェックしていないのでunproven toaru.SetValue(100); // こう書けばSafe if (!toaru.IsReadOnly) toaru.SetValue(100);
  • 25. Requiresの基本 ? Requiresで検証する要素は外部から見えないと、バ ?ナリリラ?ターを通りません public class ToaruClass { int value; private bool isReadOnly; public ToaruClass(bool isReadOnly) { this.isReadOnly = isReadOnly; } public void SetValue(int value) { // isReadOnlyが外から不可視なのでダメ Contract.Requires(!isReadOnly); this.value = value; } }
  • 26. なんでなんで? ? Requires、事前条件はメソッド呼び出し側が、正し い呼び出しが可能かの責任を負う必要がある、つ まり外から検証可能でないとならない ? 逆にEnsures、事後条件が正しく成立するかはメ ソッド側の責任なので、メソッド内部できちんと Ensuresの条件が満たせる必要がある
  • 27. Requiresの基本 Part2 ? Requires内で使えるメソッドはPureなもののみ ? 警告なので実行は出来なくはない // Pureを付けないと警告が! [Pure] public static bool IsNull(string arg) { return arg == null; } public void Hoge(string arg) { Contract.Requires(!IsNull(arg)); } ? Pure、つまり副作用ナシということ ? String.IsNullOrEmptyなど当然Pure属性ついてます ? Pureかどうかは自己申告制だったり(非Pureなもので も付けること自体は可能、勿論それはダメですよ)
  • 28. 嬉しくないこと ? 静的チェッカーは契約の連鎖で成り立っているの で、契約されてないラ?ブラリが混じると警告祭 りになって鬱陶しい ? そういう場合はContract.Assumeで、契約済みを擬 態していくのだけど数が多いと心が折れる、だけ じゃなくコードが汚れて可読性悪化の一方に ? Typeの一部とかExpressionの一部とか、契約済みの はずの標準ラ?ブラリの中にも上手く動かないの がチラホラ
  • 29. 例えばこんなunproven // これは静的チェッカでunproven行き var func = typeof(Func<,>); var genFunc = func.MakeGenericType(typeof(int), typeof(int)); // 警告を元に、こうAssumeすればいいんですがなんというかかんというか var func = typeof(Func<,>); Contract.Assume(func.IsGenericTypeDefinition); Contract.Assume(func.GetGenericArguments().Length == 2); var genFunc = func.MakeGenericType(typeof(int), typeof(int));
  • 30. Unproven Hell // (object x) => (object)((T)x).name static Func<object, object> CreateGetValue(Type type, string name) { Contract.Requires<ArgumentNullException>(type != null); Contract.Requires<ArgumentNullException>(name != null); // Expression.Unboxに事後条件非nullの契約がないため // Expression.PropertyOrFieldの引数が求めるrequires expr != null の検証に失敗する var x = Expression.Parameter(typeof(object), "x"); var func = Expression.Lambda<Func<object, object>>( Expression.Convert( Expression.PropertyOrField( (type.IsValueType) ? Expression.Unbox(x, type) : Expression.Convert(x, type), name), typeof(object)), x); return func.Compile(); }
  • 31. どういうこと? ? Expressionも基本的には契約されているんですが、 Expression.UnboxとかExpression.Assignと か、.NET4で新しく追加されたものはあまり契約さ れてないみたい ? なので山崎春のunproven祭り ? Expressionは基本的に引数に突っ込んで式としてツ リー上に組み立てていくものなので、Assumeする のが難しい ? もしAssumeするなら、全部バラして変数にしてから 組み立てなければならないけど、それはない
  • 32. そして平穏が訪れる // 面倒くさくて耐え切れない時は静的検証オフ属性をつけてやる [ContractVerification(false)] static Func<object, object> Create(Type type, string name) { // (中略) } ? Contract.Ensures(Contract.Result<T>() != null); がど れだけ大事かが身にしみて分かる ? しかし定型句すぎて面倒くさいのは事実…… ? cenコードスニペットがあるとはいえ
  • 34. その他 ? .NET4標準に入っているContractsラ?ブラリの他に、 幾つか追加の属性が C:?Program Files (x86)?Microsoft?Contracts?Languages?CSharp に ある(.csフ??ルぽん置き) ? 使い方の詳細はマニュ?ルに載ってる ? Microsoft Researchで開発されている自動パラメタ ラ?ズドテストPexに対してContractsが記述されて いると、有効な自動生成パラメータが生成できる ようになる http://research.microsoft.com/en-us/projects/pex/
  • 35. まとめ ? メリットを幾つかあげましたが、忘れてはならな い基本的なことは、「事前?事後?不変」の契約 が出来るということ ? でも、堅苦しい理屈だけじゃなく、目で見て分か る実用的な便利さを提供してくれるのはいいね! ? if-then-throwを撲滅してくれるというだけでも十 分嬉しいなって ? まずはそこからで、徐々に高度にステップ?ップ すればいいんじゃないかな ? Expressで使えないのが痛い&Premium以上でない と静的チェッカーが使えないのが大変痛いので、 将来は何とかして欲しいと切実に願う