メソッドの呼び出し元とはメソッドを使用する側に立つメソッドのことを指します
AとBという二つのメソッドがあり、BがAを呼ぶ時、Bは呼び出し元であり、Aは呼び出し先です
メソッドの事前条件は主に仮引数で表されます
引数で型が明示される場合は、その型の要件を満たす値の性質が事前条件に当たります
例えばあるクラスを継承する時、派生クラスのメソッドに対し型引数を用いて外部から受け取る実引数の型を制限できます
class A\u0026lt;T extends A\u0026gt;{
T method(T t){return t;}
}
class B extends A\u0026lt;C\u0026gt;{}
class C extends A\u0026lt;B\u0026gt;{}
この時、methodの仮引数はそれぞれのクラスにおいてAが継承された時に型引数として指定された型で制約されます
nullが渡されるケースを考えなければ、引数の値はこの型引数で要求される型の要件に従う必要が生じます
一方でnullの処理に関しては事前条件として規定できないため、代替としてnullチェックそのものの有無を明示します
これは、引数の型がクラスであるか値型であるかで単純に表現できます
class C{
void procedure(int x){} //値型ならnullチェック不要
bool function(Object o){return o==null;} //クラスならnullチェック適用
}
これは、メソッドの実行要件としてクラスか値型のどちらを要求するかという条件の明示にもなります
実装を司るメソッドの呼び出しを内部でラップすることで、呼び出し先の実体となるメソッドは本来の処理に集中できます
動的言語の場合は、実行中に変数の型を”解析”するため、静的型付けのようにコンパイル段階で型を判定しません
この場合、引数には型が存在しないので事前条件を設定できません
ここでのアプローチとしては、メソッドの名前に条件を著すか、カプセル化されたメソッドへのアクセスをフィルタリングするインターフェイス役のメソッドを設計するかのどちらかになります
例えばメッセージパッシングと呼ばれる手法を利用して、型チェックなどの検査機構を一つのメソッドに集約します
function check(x){
if(x!=null){
switch(x.token){
case “logic”:
return logic()
break
}
} else
return false
}
事前条件を設定する際は、その事前条件の適用自体をメソッドの事前条件として採用することが一般的です
条件の明示に使用するメソッドを用意しておくことで、if文の過剰ネストやループの多重化を避ける効果も期待できます