契約による設計の紹介

こんにちは、チーフエンジニアの id:hakobe932 です。

はてなでは毎週、社内技術勉強会を開催しています。先週の勉強会では現在開催中のはてなインターン2016の参加者のみなさんもインターン生も参加して、いっしょに技術交流を行いました。

このエントリでは、そこで発表した、契約による設計の紹介をしたスライドを公開します。

契約による設計はBertrand Meyer氏によるオブジェクト指向入門*1という書籍で紹介されている考え方です。

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

契約による設計では、関数やメソッドと、それらを利用するコードとの間に以下のような契約を考えて分析します。

もしそちらが事前条件を満たした状態で私を 呼ぶと約束して下さるならば、お返しに事後条件を満たす状態を最終的に実現することをお約束します。

関数の仕様を決める時に、関数を実行するのに何が必要か(事前条件)、そしてどういった結果を返してくれるのか(事後条件) をはっきりさせて分析することで、関数の責任や他の部分との境界を明確にして整理することができます。さらに、契約に基づいて関数の事前条件や事後条件をコード上に表明(assertion)として表現することで、コードのまちがいに気付きやすくなり、信頼性の高いソフトウェア開発につながります。

関数とそれを使うコードの間に具体的にどのような契約を考えるのかは、関数の所属しているクラスやモジュールのアーキテクチャ上での役割に対応づけて考えることも必要で、ソフトウェア全体の設計整理していくことにもなります。

実際のプロジェクトでも、関数やクラス、クラスが属するレイヤなどにどういった責任を持たせていくかは難しいところです。そういった場面で、もしかすると契約による設計の考え方が役に立つかもしれません。

このような技術発表もやっている、はてなの社内技術勉強会の事情が気になる方はぜひ以下のエントリをご欄ください。

developer.hatenastaff.com

*1:入門と銘打っていますが原題はObject-Oriented Software Constructionであり、あまり入門的ではありません