謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

変数のスコープ

個人的に思うことは全てのグローバル変数は悪。
ただ同様の便利さが必要な訳で、ネストクラスのnew時に親クラスのインスタンス渡して親クラスのメンバ変数に透過的にアクセスできれば良くね?っていう。
D言語はどうもそれがうまく行くようなので、皆もっとネストクラスを活用すればいいと思うよ。
以下D言語のコード。あまり例が良くないけど。

import std.stdio;
class EnvironA{
  int id; // 実際は設定とかioとか
  this(int id){
    this.id = id;
  }
  interface Exec{
    int doThing(int x);
  }
  class Add:Exec{
    int doThing(int x){
      return (id += x);
    }
  }
  class Sub:Exec{
    int doThing(int x){
      return (id -= x);
    }
  }
}

void main(){
  EnvironA env = new EnvironA(10);
  writefln((env.new Add).doThing(10));
  writefln((env.new Sub).doThing(10));
}

あとはまぁ、テンプレート使って環境バインド。

import std.stdio;

class IO{
  void write(string s){writefln(s);};
}

class IOEnv(alias Env){
  mixin Env!();
  IO io;
  this(){
    io = new IO;
  }
}

template _MainEnv(){
  void main(){
    auto x = new Do;
    x.doThing();
  }
  class Do{
    void doThing(){
      io.write("test");
    }
  }
}

alias IOEnv!(_MainEnv) MainEnv;

void main(){
  auto env = new MainEnv;
  env.main();
}

C#のpartial classがないので一つのファイルにまとめないといけないのがネック。
C#のネストクラスどうだっけか。もしできるならそれが最強なはず。