今日も、小ネタなような、C#7思い出話なような。

C# 7で、分解という機能が入ったわけですが、英語だと deconstruction という単語になります。

分解という機能のおさらいですが、以下のような書き方でタプルなどの型のメンバーを抽出できる機能です。

var (x, y) = tuple;

これ、他のプログラミング言語だと、destructuring とか呼ばれたりしています。 といっても、文法上正式に destructuring と呼ばれているわけではないんですが(大体の言語は文法上は単に「pattern」とか呼ばれる機能)… まあ、解説ページなんかでは destructuring と呼ばれます。

で、今日、何が言いたいかというと、

  • deconstruct : デコンストラクト
  • destructuring: デストラクト

並べるとわかりますかね。 「con」の有無。 deconstruct destructuring。

用語として多少もめてたりするみたいです。

  • 他の言語に合わせてdestucturingであるべきじゃないか。
  • construct (con(共) + struct(築))の逆はdestruct (de(脱) + struct(築))じゃないのか
  • でも、destuctureだとデストラクターと紛らわしくないか。
  • C#のデストラクターって、あれ、実際にはfinalizerだし。誰だよ、destructorって名前にしたやつ

みたいな雰囲気。

日本語だとたぶん、僕みたいに「分解」とかに訳しちゃうんでそんなに変でもないんですが、 英語だとdestructorとdeconstructionが並ぶことになるんで気持ち悪いみたいですね。

まあ、デストラクターも分解も、どちらもコンストラクターの逆ではあります。

コンストラクターの仕事

ちなみに、コンストラクター、初期化子、デストラクター、分解の例をまとめて挙げると以下のような感じ。

constructor, initialiser, destructor, deconstructionの例

そもそも英語でdestroyの名詞形がdestructionなのが良くないかも。 「destruct」で切った場合、それはdestroy(破壊)のことなのかdestructure(脱構造化)のことなのかそもそもわからず。

それに、C#で破棄用の構文をデストラクターと呼ぶのはC++から持ってきた言葉なわけですけど、 これ、やっぱりJavaみたいにfinalizerって呼んでおくべきだったのかも。 デストラクターに関しては、分解が絡まなくても元々名前には悩んでいるみたいです。

  • .NET的には finalizer って呼び名になってる。destructor って呼び名はC#だけ
  • ECMAに出しているC#仕様書上は finalizer って呼び名になっているらしい
  • MSDN上に出してるC#仕様書は destructor になってる
    • 今、ECMA版とMSDN版の統合を考えてるんで、なおのこと問題に
  • Roslyn の API 中でも destructor という単語を使ってる
    • これがあるんで、単純に文章上だけの変更ってわけではなくて、ソースコードにも影響あり

とりあえず、現状のC#チームの希望的には以下のような雰囲気です。

  • 分解は deconstruction のまま(de + con 付き)
  • デストラクターって呼び名は微妙なので変えることも視野に入ってるみたい