作譜は思想戰

最近は作譜(一般的な橫文字で書けばプログラミング)の話が多くなつて來たが、作譜と云ふのは他の多くのもの同樣思想戰の戰場である。自陣の思想で如何に主導的地位を確立するかと云ふヘゲ鬪が日夜行なはれてゐる。

例へばRubyとC++と云ふ言語にある機能の比較してみるだけでもそれは見て取れる。それぞれの言語にはクラスがあり、クラスはメンバ變數やメンバ函數(プロパティやメソッド)を持つ。そしてこれらにはアクセス指定子を書くことが可能である。

class Human {
 public:
  std::string publicName() const { return "公開の名前"; }

 private:
  std::string privateName;
};

まづはC++の方のクラスを見る。publicの方が外部に公開されたもので、privateの方が非公開なものである。C++の場合、こゝで云ふ外部と云ふのは、クラスに對して外部かどうかと云ふことである。從つて以下のやうにクラスの外側でこれらを觸らうとした際には結果が異る。

const Human human{};

std::cout << human.privateName << std::endl; // 非公開なものにはアクセスできない!
std::cout << human.publicName() << std::endl; // こちらは公開のものなのでアクセス可

イメージとしては、privateNameは外部に公開してゐない祕密の呼び名なので、公開されたメンバ函數であるpublicNameを用ゐて公稱の名前にアクセスすることが可能、と云つた工合である。

一方で同じクラスであれば、この祕密の呼び名に觸れることが可能である。從つてHumanクラスを擴張して、以下のやうなこと譜片を書くことは合法である。

class Human {
 public:
  bool compareName(const Human &other) {
    return privateName == other.privateName;
  }
};

自インスタンス(要は自分)はクラス內部であれば、Human型の別のインスタンス(要は他人)の祕密の呼び名に直接觸れそれらを操作することが可能である。卽ちC++は同じクラスのインスタンスであれば同じ共同體の一員として、共同體の場內であれば非公開のメンバを互ひに參照可能な全體主義的な思想の言語であるとも言へる。

一方でRubyはこれとは全く異なる立場に立つ。外部が何か、と云ふことが根本的に違ふ。

class Human
  def public_name
    '公開の名前'
  end
  
  private
  
    def private_name
      '祕密の名前'
    end
end

クラスの外部での扱ひに就いてはC++と同樣である。

human = Human.new

pp human.private_name # 非公開なものにはアクセスできない!
pp human.public_name # こちらは公開のものなのでアクセス可

問題はクラスの內部での話である。

class Human
  def compare_name(other)
     private_name == other.private_name
  end
end

my = Human.new
other = Human.new

pp my.compare_name(other) # 非公開なものにはアクセスできない!

Rubyの場合はotherに何でも渡せるので、實際に別のHuman型のインスタンスを渡してみなければ結果は分らないが、渡してみれば非公開なのでアクセス不可と云ふ理由で實行時に落とされる筈である。Rubyのクラスにとつて內部と云ふのは自インスタンスかどうか(要は自分)、であり、同じHuman型のインスタンスであつても別インスタンス(要は他人)には非公開領域は觸らせないと云ふ極めて個人主義的な思想の言語と見做すことができる。

これらの方向性は繼承した時でも差が如實に現れる。

class Rookie : pubic Human {
 public:
  void printPrivateName() {
    std::cout << privateName << std::endl; // 非公開なものにはアクセスできない!
  }
};

C++の場合は基底クラス(こゝではHuman)の非公開メンバを派生クラス(こゝではRookie)は直接觸ることはできない。これらは繼承構造をピラミット構造として捉へれば、上位にゐるものの極祕情報に就いては下位のものはアクセスできないと取ることができる。

一方でRubyはそのインスタンスが自分かどうかが總てなので、

class Rookie < Human
  def print_private_name
   pp private_name # 自分の非公開なものなのでアクセス可能
  end
end

上記のやうな譜片が合法になる。

我々がどちらの思想の言語を好むか、と問はれれば答へは自明なのだが、實用上の差異に就いても一應觸れておく。

例へば先程のクラスを例に、クラス共同體の意志として祕密の名前を削除する決定をしたとする。

class Human {
 public:
  std::string publicName() const { return "公開の名前"; }

 private:
  std::string privateName; // 時代遲れなのでもうこれはいらない
};

その場合、C++では單にprivateNameを削除すればよい。

class Human {
 public:
  std::string publicName() const { return "公開の名前"; }

 private:
};

Humanクラスの非公開メンバはHumanクラス內でしか觸ることができないので、Humanクラスの實裝を一瞥して問題ないことさへ分れば容易にこの選擇を取ることが可能である。

一方でRubyはこの決斷をHumanクラスを見ただけではすることができない。

class Human
  def public_name
    '公開の名前'
  end
  
  private
  
    # 時代遲れなので消してみた
end

class Child < Human
  def print_private_name
   pp private_name # undefined methodでエラー!
  end
end

子クラスがprivateなメソッドを自由に觸ることができるので、Humanクラスを繼承してゐるクラスを總て調べて變更の影響がないかどうかを見極めなければならない。このカプセル化に對して何の役にも立たないRubyの個人主義的privateの思想(privateと云ふ語の意味から聯想されるものが指す擧動としては、Rubyの方が合つてるやうにも思へなくはないが)は譜片改修に對してかなりのしんどさを要する。まともなプロダクトなら全パス網羅したテストケースがあるので、影響があつたらテストが落ちて分かるから別に問題ないだらうと云ふ立場なのかもしれないが。

さう云ふ訣で對立イデオロギー色の濃い言語に觸れるとストレスが溜り、自陣營のイデオロギーの色が强い言語で開發をすれば昂揚が得られる、と云ふいつものお話。




この記事が気に入ったらサポートをしてみませんか?