C#の型は、クラスや構造体のスコープの中で定義できます。外側の型が、一種の名前空間の役割を果たします。その型にアクセスするときは、外側の型からドット記法でたどります。
class Outer
{
public interface IInner {}
public enum EInner {}
public class CInner {}
public struct SInner {}
}
var outer = new Outer();
var inner = new Outer.CInner();
内側の型にもアクセスレベルを設定できます。
外側の型のプライベートメンバーには、内側の型のメンバーからアクセスできますが、その逆はできません。
「ほかの」エンジニアたちが、リモートコントロールカーのプロジェクトremote-control-competitionに取り組んできました。そのコードをきれいにするために呼ばれました。
RemoteControlCarクラスをリファクタリングして、Telemetryプロパティ経由でアクセスするテレメトリのメソッドとプロパティを分離しましょう。
var car = new RemoteControlCar();
car.Telemetry.Calibrate();
car.Telemetry.SelfTest();
car.Telemetry.ShowSponsor("Walker Industries Inc.");
car.CurrentSponsor
// => "Walker Industries Inc."
car.Telemetry.SetSpeed(100, "cps");
car.GetSpeed()
// => "100 centimeters per second"
Telemetry型に依存しすぎないようにするTelemetryインスタンスが、車のスコープの外で作成できないようにしましょう。
Speed構造体に依存しないようにするSpeed構造体が、RemoteControlCarクラスのスコープの外で使えないようにしましょう。
SpeedUnits列挙型に依存しないようにするSpeedUnits列挙型が、RemoteControlCarクラスのスコープの外で使えないようにしましょう。