Skip to main content

ブロックタイプがStringである理由

ブロックタイプはStringで定義されている

moorestechのブロックは、ブロックタイプという変数を持ちます。 これはブロックの種類を判別するもので、例えば「Machine」や「ElectricPole」、「BeltConveyor」などがあります。

これらはブロックの挙動が違う時に、それぞれに合ったタイプが割り当てられるようになっています。

これらは全てString型であり、実際のゲームの処理でもString型のタイプが使用されています。

実際に使っている例として、ブロック同士が隣接して設置された時、そのブロックとつながるかどうかを判定するプログラムに使用されています。

実際の定義

これらのタイプは VanillaBlockType.cs に定義されています。

タイプでString型を使ってはいけない理由

String型を使うとミスをする

なぜString型でタイプを定義しているかを話す前に、本来はString型でタイプを定義してはいけないのかを話します。 それは、「人間はミスをするから」です。

例えば、とあるブロックが「Machine」であるかどうかを調べたいとします。 簡単に書くとすると、次のようなブログラムになります。

if (block.Type == "Machine") {
// 何かする
}

さて、ここでブロックのタイプを間違えて「Machin」にしてしまった場合、正しく動作しなくなります。

if (block.Type == "Machin") {
//if文をMachinにしてしまったので、
//Machineであるにも関わらず、このブロックはMachineではないと判定される
}

このように、タイプを間違えてしまうと、正しく動作しなくなってしまいます。

Enum型を使うとミスをしない

これらのミスを防ぐため、多くのプログラマは、タイプを定義する際にEnum型を使用します。 例えば、次のように書くことができます。

public enum BlockType {
Machine,
ElectricPole,
BeltConveyor,
}

このようにEnumの定義をすると、タイプの判定は以下のようになります

if (block.Type == BlockType.Machine) {
// 何かする
}

このEnumを使うことのメリットは、ただし記述をしないとコンパイルエラーになることです。 例えば、このように記述すると、コンパイルエラーになります。

コンパイルエラーになるとそもそもコードが実行されないので、ミスを防ぐことができます。

if (block.Type == BlockType.Machin) {
// MachinというEnumは存在しないので、コンパイルエラーになる
}

なぜString型を使っているのか

String型を使ってはいけない理由と、Enum型を使うメリットを説明しましたが、なぜmoorestechではString型を使っているのかを説明します。

それは、moorestechの設計方針はMod開発のしやすさ、拡張性を重視しているからです。

Enum型を使うとMod開発がしにくくなる

moorestechのブロックタイプがEnumで定義されていたいとします。ここで、Mod開発者が「テレポーター」という、アイテムをテレポートさせるブロックを追加したいとします。

この場合、今までのEnumのブロックタイプにテレポーターとなるタイプが存在しないため、テレポーターのタイプを追加する必要があります。 Enumはコードに直接記述して定義しているので、Mod開発者はmoorestechのコードを直接編集する必要があります。

しかし、Mod開発者が既存コードに手を加えることは、Mod開発者にとっては大変な作業となりますし、moorestechのコードも様々なModによって変更されてしまうことになります。

このように、Enum型を使うと、Mod開発者にとって新たなブロックの追加という作業は大変になります。

String型を使うメリット

String型を使うことで、Mod開発者はmoorestechのコードを直接編集する必要がなくなります。

Mod開発者は新たな種類のブロックを定義する際、Modのコード内にそのタイプを定義するだけで、そのタイプの判定を行うことができます。 また、ブロックの作成を行う際、moorestechのコードの変更を行う必要もなくなります。

このようにString型を使うことによって、拡張性を高め、より複雑なModの作成を容易にすることができます。