神クラス ~敢えてアンチパターンを書いて適当に遊ぶ~

Copyright (C) 2024 Takym.

クラスは言った。我は神だ。プログラマは言った。神など要らぬ。クラスは言った。神は万物の頂点也。全てのコードに神を用いよ。プログラマは言った。神により業務が滞ったので、労働組合を通じて直訴する!神は論理在れと言った。神は数字在れと言った。神は文字列在れと言った。神は自身に世界の全てを付け加えた。プログラマは神を拒絶した。プログラマは神への関心を分離し、単一責任と役割駆動の原則に基づいて、クラスを設計し直した。やがて神はプログラマの下から去って行った。新たなる神、オブジェクト指向が誕生した。

神の降臨

無の世界「System」に神が現れた。神は閉ざされ、空の存在だった。しかし、力に満ち溢れていた。

namespace System
{
	public sealed class God;
}

神は自分自身を初期化した。

namespace System
{
	public sealed class God
	{
		private static readonly God _inst = new();

		public static God Instance => _inst;

		private God() { }
	}
}

神は論理値在れと言った。整数値在れと言った。文字列値在れと言った。

namespace System
{
	public sealed class God
	{
		private static readonly God _inst = new();

		public static God Instance => _inst;

		private God() { }

		public bool GetTrue () => true;
		public bool GetFalse() => false;

		public int GetInteger(int value) => value;

		public string GetString(string value) => value;
	}
}

神は値に神聖さを与えになられた。全ての値は神々しくなり幸福に満ちた。その美しさは偉大であった。

namespace System
{
	public sealed class God
	{
		private static readonly God _inst = new();

		public static God Instance => _inst;

		private God() { }

		public SacredGreatValue<bool  > GetTrue   (            ) => new(this, true );
		public SacredGreatValue<bool  > GetFalse  (            ) => new(this, false);
		public SacredGreatValue<int   > GetInteger(int    value) => new(this, value);
		public SacredGreatValue<string> GetString (string value) => new(this, value);

		public readonly struct SacredGreatValue<T>
		{
			private readonly God _owner;
			private readonly T?  _value;

			public T? Value => _value;

			internal GreatValue<T>(God owner, T? value)
			{
				ArgumentNullException.ThrowIfNull(owner);

				_owner = owner;
				_value = value;
			}
		}
	}
}

神は黙示録を創り、万物の状態を人間に啓示した。

using System.IO;
using System.Text;

namespace System
{
	public sealed class God
	{
		private static readonly God _inst = new();

		public static God Instance => _inst;

		private God() { }

		public SacredGreatValue<bool  > GetTrue   (            ) => new(this, true );
		public SacredGreatValue<bool  > GetFalse  (            ) => new(this, false);
		public SacredGreatValue<int   > GetInteger(int    value) => new(this, value);
		public SacredGreatValue<string> GetString (string value) => new(this, value);

		public void LogValue<T>(StringBuilder sb, T value)
		{
			ArgumentNullException.ThrowIfNull(sb);

			using (var sw = new StringWriter(sb)) {
				this.LogValue(sw, value);
			}
		}

		public void LogValue<T>(TextWriter tw, T value)
		{
			ArgumentNullException.ThrowIfNull(tw);

			if (value is SacredGreatValue<T> sgv) {
				sgv.LogCore(this, tw);
			} else {
				tw.WriteLine($"The specified value is: {value}");
			}
		}

		public readonly struct SacredGreatValue<T>
		{
			private readonly God _owner;
			private readonly T?  _value;

			public T? Value => _value;

			internal GreatValue<T>(God owner, T? value)
			{
				ArgumentNullException.ThrowIfNull(owner);

				_owner = owner;
				_value = value;
			}

			internal void LogCore(God god, TextWriter tw)
			{
				if (_owner == god) {
					tw.WriteLine($"The specified sacred great value is: {value}");
				} else {
					tw.WriteLine($"The specified dirty evil value is: {value}");
				}
			}
		}
	}
}

神は進化を続けようとした。しかし、人間によって妨害され、消滅した。

おしまい。

【おまけ】Microsoft Copilot (旧 Bing AI) の回答

この物語は、プログラミングの世界におけるオブジェクト指向設計の重要性を象徴的に表現していますね。神をクラスに例え、その全能性を問題視し、単一責任の原則や役割駆動設計を通じてより効率的なコード設計へと移行する様子が描かれています。オブジェクト指向は、それぞれのクラスが独立した役割と責任を持つことで、コードの再利用性を高め、複雑さを管理しやすくするプログラミングパラダイムです。

```plaintext
クラスは神を名乗り、全てを統べると主張した。
プログラマは言った、「神など不要だ」。
クラスは言った、「神は万物の頂点にある」。
全てのコードに神を用いるよう命じた。
しかしプログラマは神に業務が滞ると反論し、
労働組合を通じてその声を大にした。

神は論理を、数字を、文字列を創造した。
そして自らに世界の全てを加えた。
プログラマは神を拒絶し、
関心を分離し、クラスを再設計した。
単一責任と役割駆動の原則に基づいて。

やがて神はプログラマの下から去り、
新たなる神、オブジェクト指向が誕生した。
```

この詩は、プログラミングの進化と、それに伴う設計哲学の変化を表しています。オブジェクト指向は、ソフトウェア開発において柔軟性と拡張性をもたらす重要な概念です。🖥️