09-05-2013, 04:33 PM
引数の渡し方に関して、Curlでは位置引数と、キーワード引数の2種類ありますが、
ソースの可読性を考えると、複数の引数を渡す場合には、キーワード引数のほうが優れていると思っています。
キーワード自体が、その変数の意味をあらわしてくれるからです。
たとえば、花嫁と花婿を渡すと結婚する、というプロシージャを考えたとき、
位置引数(marry1 プロシージャ)だと、プログラマは、花嫁と花婿の順番を間違えやすいと思います。
(日本語だと「新郎・新婦」で順番が逆)
しかし、だからといって、キーワード引数(marry2 プロシージャ)にしてしまうと、
順番の間違いやすさがなくなるかわりに、初期値の指定が必要になります。
ここでは、花嫁、花婿が最初から決まっている、というのもおかしな話なので、 null を初期値にしましたが、
どちらかが不在のまま結婚はできないので、プロシージャのなかで null 判断をしています。
Nullable でない型を指定しようとすると、uninitialized-value-for-type を使う方法があると思いますが、
これも、結局は、初期化されないままの値が渡される可能性はあるので、
marry2 プロシージャ と同じ問題は残っています。
複数の引数を定義するとき、どのような実装がわかりやすいのでしょうか。
よいアイディアをお持ちの方がいらっしゃれば、アドバイスください。
ソースの可読性を考えると、複数の引数を渡す場合には、キーワード引数のほうが優れていると思っています。
キーワード自体が、その変数の意味をあらわしてくれるからです。
たとえば、花嫁と花婿を渡すと結婚する、というプロシージャを考えたとき、
Code:
{define-proc {marry1 bride:String, groom:String}:void}
位置引数(marry1 プロシージャ)だと、プログラマは、花嫁と花婿の順番を間違えやすいと思います。
(日本語だと「新郎・新婦」で順番が逆)
Code:
{define-proc {marry2 bride:#String = null, groom:#String = null}:void
{if bride == null or groom == null then
{error "花嫁(bride)と、花婿(groom)はどちらもnullを許可しません"}
}
}
しかし、だからといって、キーワード引数(marry2 プロシージャ)にしてしまうと、
順番の間違いやすさがなくなるかわりに、初期値の指定が必要になります。
ここでは、花嫁、花婿が最初から決まっている、というのもおかしな話なので、 null を初期値にしましたが、
どちらかが不在のまま結婚はできないので、プロシージャのなかで null 判断をしています。
Code:
{define-proc {marry3
bride:String = {uninitialized-value-for-type String},
groom:String = {uninitialized-value-for-type String}
}:void
}
これも、結局は、初期化されないままの値が渡される可能性はあるので、
marry2 プロシージャ と同じ問題は残っています。
複数の引数を定義するとき、どのような実装がわかりやすいのでしょうか。
よいアイディアをお持ちの方がいらっしゃれば、アドバイスください。