最佳实践

最佳实践

最佳实践

代码风格

使用函数式类型

java

// 使用 Option
Option<String> name = player.getName();

// 使用 Result
Result<String, Error> result = doSomething();

// 使用 Either
Either<Error, String> value = getValue();

使用 Editor 模式

java

// 不好的做法
NbtCompound tag = itemStack.tagV_2005();
tag.put("key", "value");

// 好的做法
for (NbtCompound tag : itemStack.tagV_2005().revise())
{
    tag.put("key", "value");
}

错误处理

使用 Result 处理错误

java

Result<ItemStack, String> result = ItemStack.decode(nbt);

for (ItemStack stack : result.getValue())
{
    // 成功
}

for (String error : result.getError())
{
    // 失败
}

使用 Option 处理可能为空的值

java

Option<EntityPlayer> player = getPlayer();

for (EntityPlayer p : player)
{
    // 玩家存在
    p.sendMessage(Text.literal("Hello"));
}

// 或者
player.ifPresent(p -> p.sendMessage(Text.literal("Hello")));

事件处理

使用注解注册事件

java

@RegistrarEventListener
public class MyListener
{
    @RegistrarEventClass
    public static void onPlayerJoin(EventPlayerJoin event)
    {
        Player player = event.player;
        // 处理玩家加入
    }
}

使用正确的优先级

java

@RegistrarEventClass(priority = Priority.HIGHEST)
public static void onEvent(MyEvent event)
{
    // 高优先级处理
}

版本兼容

使用版本注解

java

@VersionRange(begin = 1300, end = 1400)
@WrapMinecraftMethod(@VersionName(name = "method_name"))
ReturnType method();

检查版本

java

if (MinecraftPlatform.instance.getVersion() >= 1300)
{
    // 1.13+ 的代码
}
else
{
    // 旧版本代码
}

数据存储

使用 DataKey

java

public static final DataKey<Player, String, ?> CUSTOM_DATA = DataKey.of("custom_data");

// 设置数据
CUSTOM_DATA.set(player, "value");

// 获取数据
Option<String> data = CUSTOM_DATA.get(player);

使用 NBT

java

// 使用 NbtCompound
NbtCompound nbt = NbtCompound.newInstance();
nbt.put("key", "value");

国际化

使用 I18n

java

// 翻译文本
Text text = MinecraftI18n.resolveText(player, "myplugin.message", "arg1");

// 添加翻译文件
// lang/zh_cn.json
{
    "myplugin.message": "消息: %s"
}

测试

使用 Tester

java

@Tester
public class MyTests
{
    @TesterFunction
    public void testSomething(TesterContext context)
    {
        // 测试代码
        assert condition;
    }
}

注意事项