さよならassert
- 前回の続き
- 要するにassertは意味が多すぎるので名前をつけよう、ということだ
- バグ潰しのためなのか事前条件なのか分からないassertがよくある
- 結局こうなった・・・ソースコード
- postconditionがあるときのreturnがマクロになってしまった
[]#include[] []<pstade/contract.hpp>[]
[]#include[] []<cmath>[]
[]#include[] []<pstade/is_same.hpp>[]
[]inline[]
[]float[] []square_root[][]([][]float[] []x[][])[]
[]{[]
[]PSTADE_PRECONDITION[]
[] ([]
[] ([][]x[][] >= [][]0[][])[]
[] )[]
[]PSTADE_POSTCONDITION[][]([][]float[][])[]
[] ([]
[] (([][]result[][] * [][]result[][]) == [][]x[][])[]
[] )[][]PSTADE_RETURN[][]([][]std[][]::[][]sqrt[][]([][]x[][]));[]
[]}[]
[]struct[] []Date[]
[]{[]
[]Date[][]([][]int[] []month[][], [][]int[] []day[][]) :[]
[]m_month[][]([][]month[][]), [][]m_day[][]([][]day[][])[]
[] {[]
[]PSTADE_CONSTRUCTOR_PRECONDITION[]
[] ([]
[] ([][]month[][] != [][]999[][])[]
[] ([][]day[][] != [][]999[][])[]
[] )[]
[] }[][] ~[][]Date[][]()[]
[] {[]
[]PSTADE_DESTRUCTOR_PRECONDITION[]
[] (~) [][]// empty[]
[] }[][]void[] []set_xmas[][]()[]
[] {[]
[]PSTADE_PUBLIC_PRECONDITION[]
[] (~)[]
[]PSTADE_POSTCONDITION[][]([][]void[][])[]
[] ([]
[] ([][]m_month[][] == [][]12[][])[]
[] ([][]m_day[][] == [][]25[][])[]
[] )[][]m_month[][] = [][]12[][];[]
[]PSTADE_INVARIANT[][] ( ([][]m_month[][] == [][]12[][]) ) [][]// block invariant[]
[]m_day[][] = [][]25[][];[]
[]PSTADE_RETURN[][]([][]void[][]);[]
[] }[][]template[][]< [][]class[] []T[][] >[]
[]T[][]& [][]set_day[][]([][]T[] []const[][]& [][]day[][])[]
[] {[]
[]PSTADE_POSTCONDITION[][]([][]T[][]&)[]
[] ([]
[] ([][]result[][] == [][]day[][])[]
[] ([][]pstade[][]::[][]is_same[][]([][]result[][], [][]m_day[][]))[]
[] )[][]if[][] ([][]m_day[][] != [][]day[][]) {[]
[]m_day[][] = [][]day[][];[]
[]PSTADE_RETURN[][]([][]m_day[][]);[]
[] }[]
[]else[][] {[]
[]PSTADE_RETURN[][]([][]m_day[][]);[]
[] }[]
[] }[][]private[][]:[]
[]int[] []m_month[][];[]
[]int[] []m_day[][];[][]PSTADE_CLASS_INVARIANT[]
[] ([]
[] ([][]1[][] <= [][]m_month[][] && [][]m_month[][] <= [][]12[][])[]
[] ([][]1[][] <= [][]m_day[][] && [][]m_day[][] <= [][]31[][])[]
[] )[]
[]};[]