言葉の意味、理解していますか?

3 min read読了の目安(約3300字

その言葉の意味を分かって使っていますか?

IT業界の片隅で33年ヒッソリと生き延びているロートル戯れ言懸念を、少しずつ書いて
いこうかなぁ…と思っています。

と、言うのも最近は一緒に働くエンジニアさんが仰る事で**え!?**と思う事が多くなってきたからなんです。

最も顕著なのはオブジェクト指向プログラミングとは

  • カプセル化
  • 継承
  • ポリモーフィズム

三大要素としているプログラミング言語の事だと信じ切っている人と話す時ですかねぇ…

オブジェクト指向プログラミング

そもそも「オブジェクト指向」とは

そもそもオブジェクト指向と言う一見単語に見えるものはオブジェクト指向と言う異なる2つの単語から成る合成後です。これは英語で表すとObject Orientedとなりますが、これはDr. Alan Curtis Kayがプログラミング言語Simulaに感化されて自分で作ったプログラミング・アーキテクチャを表現するための造語です。

そして、この時にDr Alan Kayが重視したのはメッセージングまたはメッセージパッシングと言うものです。

だから何?

オブジェクト指向と言う言葉の意味を正しく理解する為には

  • Object
  • Oriented

と言う言葉をDr Alan Kayがどう言う意味を含ませて採用したかを知る必要があると言う事です。

クラスって?

これは、かなり衝撃的だったんですが

  • クラスは設計図に過ぎ無い
  • クラスから実際に使える様にメモリ上に実体化したものをインスタンスと呼ぶ

と信じてる人が多いです。

上の説明ではクラスはまるでメモリ空間に存在してない様にも読み取れますし、まして動作するとは読み取れ無いですよね。

だとしたら

  1. 誰がインスタンスを作るの?
  2. クラスメソッドやクラスプロパティは誰が保持しているの?

と言う疑問はありませんか?

クラスを現実世界のメタファで説明しないで!

よく継承の説明で

  • 動物クラスから哺乳類クラスを派生してね
  • 哺乳類クラスから犬クラスを派生してね
    • ここで全犬種に共通の概念を取り込むのね。
    • で、その犬クラスから各犬種のクラスを作る!

やめてくれ!そして、読んでも信じないでください。

オブジェクト指向プログラミングにおいて、インスタンス化できないクラスはありません。もちろん、きちんとしたオブジェクト指向プログラミング言語なら、と言う条件はありますが。

その言語の大元になるルートクラスも(意味はありませんが)インスタンス化できます。

これを理解していると、

  • 動物クラスと哺乳類クラスをインスタンス化してみれや!
    • 以下同文

と、思う訳です。

んで?

つまり、言葉の意味を分かって使うと言う事は、その言葉の指す本質を理解していると換言できます。

ちょっと過激に聞こえるかも知れませんが言葉の本質を理解していない+方は、その言葉で表される技術なりアーキテクチャなりをある程度、何となく使えているだけで、決して使いこなす事はできません。

私が近年ソフトウェア工学に力を置いて個人メンタリングをしているのは、これが理由です。

おまけ

2進数って言うな!

進数と言うのは数学の用語で正しくは\rho\text{進数}と言います。

これは数を表す体系の一つで、私たちが慣れ親しんでいる有理数の体系を実数複素数の体系に拡張するのとは別の方法で、各素数\rhoに対して\rho\text{進数}の体系が構成されます。

私たちの慣れ親しんでいる数の体系では有理数体{\bf Q}から実数体{\bf R}を構成するには、通常の絶対値の定める距離d_{\infty}(x, y) = |x−y|に関して有理数体を完備化します。

それに対して\rho\text{進数値}により定まる\rho\text{距離}であるd_pによって有理数体を完備かしたものが\rho\text{進数体}{\bf Q}_{\rho}です。

もう訳が分からないですよね?それでいいんです。これは数論の中では重要な役割を果たしていますが一般にお目にかかる機会は、素粒子物理学でもやってなければ無いでしょうし。

んじゃ、僕らの数の体系って?

位取り記数法と言います。またはN\text{進法}とも呼ばれます。

予め定められたN種類の記号(数字と換言できます)を列として構成する事によって数を表します。この時の列をと言います。

位取り記数法とは?

まず基数となる自然数Nに対して

0, 1, \cdots, N-1

の数値に対応する数字の記法を対応させます。次に、

a_{m}a_{m-1}\cdots\cdot b_{1}b_{2}\cdots b_{k}

と言う数字列で表現します。但し、この時a_{*}, b_{*}はそれぞれの0からN-1を示すいずれからの数字であり、かつa_{m}\neq 0とします。

十進法

私たちが最も身近に利用する十進法はN=10ですから0, 1, 2, 3, 4, 5, 6, 7, 8, 9と言う数字を用います。

一つの列には一つの数字しか容れる事ができません。演算の結果、ある列の値x10\leqq xとなった場合に桁上がりを起こします。

具体的にはx-10を最初の列に入れて、左隣に列を作り1を置きます。

例えばx=13であれば1桁目は13-10=3となり、2桁目は1となります。結果的には13と言う表記になりますが、これは正確には1\times 10^{1} + 3\times 10^{0}と表します。

誤解を避ける為に

例えばN=210N=1010は表記こそ同じですが、値としては1\times 2^{1} + 0\times 2^{1}1\times 10^{1} + 0\times 10^{0}です。

10進法表記では10_{(2)}=2_{(10)}, 10_{(10)}=10_{(10)}となります。その為に複数のNが混在する環境においては数値の右下に(N)を小さく表記してx_{(N)}としています。

また、先ほど数字と言う表現を使いましたが、が概念であるのに対して数字を表現する為の記号の事です。

1_{(10)}を表すのにアラビア数字ならば1、ローマ数字ならばⅠ、漢数字ならばまたはが使えます。

つまるところ人が目視して確認できる記号であれば良い訳です。ですからN=16である十六進法においては\text{A}\text{F}10_{(10)}15_{(15)}を表します。これは位取り記数法の規則により、列には1文字しか記述できない為にN\geq 11の体系においては10_{(10)}以上を表す一文字の数字が必要になるからです。

ごめんなさい

全然Conclusionを作れませんでしたが、普段何気なく使っている言葉と言えども**その意味、判ってますか?**と言う問いかけとも言えますし、知らなければ調べてねと言うお願いでもあります。

宿題

アナログデジタルを説明してください。

誰が受け取って採点するんだ?