第3回!Cocoaの名前の長さはSwiftでどうにかならんのか自分会議〜!いえー。
(第1回と第2回は#1を参照)
まず、enumに関してはSwiftの「型名.メンバ名」形式の構文と型推論のおかげで、NSDragOperationCopyが.Copyで通じるようになって劇的に短縮されました。やったね。
問題はメソッド名とCore Foundationの関数名でしょう。
後者に関しては、今すぐには無理でも、徐々にCの関数からSwiftの構造体のメソッドに移行していく事で、NSMakeRect()がNSRect(x: y: w: h:)になったり、NSOffsetRect()がrect.offsetWithDx(_: dy:) (仮名)みたいなメソッドに置き換えられたりして、全体的に関数名(メソッド名)がちょっぴり短くなる事が期待できます。今のまんま変わらないという未来もあり得ますけど。
厄介なのは引数が増えれば増えるほど長くなるObjective-Cのメソッド名です。
enterExitEventWithType:location:modifierFlags:timestamp:windowNumber:context:eventNumber:trackingNumber:userData:とか、「英語の文章として読み下せるのでステキ!」とかフォローするにも限度があるよ!
例えば、純C言語プログラミングでは、関数の引数があまりにも多くなった場合は、ラベルが無い事も相まって大変読みにくいので、その関数専用のパラメータ用構造体を定義して、その中に引数をまとめてしまうことが多いでしょう。プラットフォームによっては引数が少なければレジスタ渡しになってパフォーマンス面でもメリットがあります。
(引数の不足はコンパイルエラーになるのと異なり、構造体メンバの設定漏れは見過ごしやすい、というデメリットはありますが)
対して、CocoaのObjective-Cインタフェースでは、関連性の薄いパラメータをひとまとめにするような、特定のメソッドのパラメータ専用の構造体やクラスというものは見た事がありません(探せばあったりして…)。
これは何故でしょう?推測に推測を重ねるようですが、メソッド名 = メッセージはObjective-Cのオブジェクト指向の根幹を支える概念なので、「メッセージの意味」を損なうような用法を避けているのではないかとも考えられます。
静的な言語であればコンパイル時に引数の型でメソッドの区別がつけば用が足りますが、動的言語であるObjective-Cではインスタンス間のメッセージ送信とメソッド呼び出しが別個のメカニズムとして存在しているので、
「変数A、B、Cを引数として処理xを実行して」というメッセージを、
「構造体Xを引数として処理xを実行して」に置き換えると、実装上は支障がなかったとしても、メッセージの意味が損なわれてしまいます。だからパラメータをできるだけフラットに列挙しており、その結果メソッド名が長大になっているのではないでしょうか。
ここでジョースター卿に倣って逆に考えてみましょう。
メッセージの意味を損なわない範囲であれば、短くしちゃってもいいさ。
「From」や「To」といったプリフィックスが付くパラメータ名は、メソッドの機能や目的を表す上で重要ですが、Cocoaのメソッド名でよくある「With」の後に雑多なパラメータが羅列してあるスタイルに関しては、ただの「パラメータ」以上の意味を持たず、メッセージの意味をあまり補強していないのではないでしょうか?
だったら、Swiftでは「With」以降をタプルにまとめてしまえばいいんじゃね?
(戻り値ではなく引数に使用している例をドキュメントで見た事がありませんが…)
タプルならラベルも使えるし、パラメータの不足もチェックできるだろうし。「With」以降のパラメータが異なるケースもちゃんと区別できるんでないかしら。
そんでSwiftコンパイラが適宜読み替えて元のインターフェースにすり合わせる感じで。
これが、
enterExitEventWithType:location:modifierFlags:timestamp:windowNumber:context:eventNumber:trackingNumber:userData:
こうなる。
enterExitEvent(_)
ワーオ!驚きの短さだねキャサリン!
#1で妄想したaddButton(title:)とも整合性があるような無いような!
これをインチキだとかごまかしだ等と言ってはいけません。世の中にはNSStringからNSの2文字が取れただけで「俺達の知っている普通のプログラミング言語になった!」と歓迎するような偏見に満ちた人たちが沢山居るのですから…。イメージって大事!
ホントにこうなったら幸せになれる人はいるのかしら。
(以上、妄想です。)