Trtr注解编程

来自Hyacinth
使用注解在运行时自动处理字段和方法的控制反转框架
跳转到导航 跳转到搜索


註解編程,是指在Trtr-Minecraft項目的代碼中,使用註解替代手動編寫過多重複代碼的設計模式,本質上是由一個IoC框架代替完成。

約束

任何需要被自動處理的欄位和方法必須被"Trtr:com.github.cao.awa.apricot.anntation.Auto"註解,這也包括已經自行初始化的欄位。

示例

在任意位置(合理的軟體包下)編寫如下代碼,而後直接運行Minecraft,此時不需要自行去註冊這個方塊,Trtr:方塊反射框架會處理好這一切。

以下欄位"IDENTIFIER"和"SETTINGS"必須存在,必須大寫。

@Auto
public class TestBlock extends TrtrBlock {
    @Auto
    public static final Identifier IDENTIFIER = Identifier.of("trtr", "test");
    @Auto
    public static final Settings SETTINGS = FabricBlockSettings.of(Material.STONE, MapColor.GRAY);

    @Auto
    public TestBlock(Settings settings) {
        super(settings);
    }
}

任何被支持的欄位都可以以類似以上的方式被自動處理,而開發者只需要寫更少量的重複代碼。

自動初始化

Trtr的IoC框架支持自動初始化欄位,例如此處有一方塊物品:

@Auto
public class TestBlockItem extends TrtrBlockItem {
    @Auto
    public static final FabricItemSettings SETTINGS = new FabricItemSettings();

    @Auto
    public AluniteOreItem(Block block, Settings settings) {
        super(block, settings);
    }
}

這時候可以直接在TestBlock中加入欄位"ITEM"或"BLOCK_ITEM",而不需要任何的賦值。如下所示:

@Auto
public class TestBlock extends TrtrBlock {
    @Auto
    public static final Identifier IDENTIFIER = Identifier.of("trtr", "test");
    @Auto
    public static final Settings SETTINGS = FabricBlockSettings.of(Material.STONE, MapColor.GRAY);
    @Auto
    public static TestBlockItem ITEM;
//  另一种方式声明方块物品
//  @Auto
//  public static final Class<TestBlockItem> ITEM = TestBlockItem.class;

    @Auto
    public TestBlock(Settings settings) {
        super(settings);
    }
}

約定

在使用註解編程時,只有匹配約定欄位的名稱和類型才會被自動處理,且必須被"Trtr:com.github.cao.awa.apricot.anntation.Auto"註解。

欄位

標識符

標識符(Identifier)約定名稱為"IDENTIFIER"、類型為:Minecraft:net.minecraft.util.Identifierjava.lang.String[1]

設置(方塊)

方塊設置(Settings)約定名稱為"SETTINGS"、備選"SETTING",類型為:Minecraft:net.minecraft.block.AbstractBlock.Settings的子類[2],如net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSetting[3]

方塊物品

方塊物品(BlockItem)約定名稱為"ITEM"、備選"BLOCK_ITEM",類型為:net.minecraft.item.BlockItem或其子類[4]

或者以形如Class<? extends BlockItem>的方式聲明類型。[3]

方塊戰利品(數據生成)

方塊戰利品(Loot)約定名稱為"LOOT"、備選"LOOT_PROVIDER",類型為Minecraft:net.fabricmc.fabric.api.datagen.v1.provider.SimpleFabricLootTableProvider的子類或Trtr:com.github.cao.awa.trtr.framework.data.gen.loot.LootFactory的實現[5],如Trtr:com.github.cao.awa.trtr.data.gen.loot.GenericBlockLootProvider

或者以形如Class<? extends SimpleFabricLootTableProvider>或LootFactory<? extends SimpleFabricLootTableProvider>的方式聲明類型。[3]

方塊模型(數據生成)

方塊模型(models)約定名稱為"MODEL"、備選"MODEL_PROVIDER",類型為Minecraft:net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider的子類[6],如Trtr:com.github.cao.awa.trtr.data.gen.model.GenericBlockModelProvider

或者以形如Class<? extends BlockItem>的方式聲明類型。[3]

方塊屬性

方塊屬性(properties)沒有約定名稱,只需要添加Trtr:com.github.cao.awa.trtr.annotation.property.AutoProperty即可被自動添加,類型為Minecraft:net.minecraft.state.property.Property的子類[7]

方法

註解

自動處理

要讓框架自動處理一個類,需要在類上添加@Auto註解,照標準樣式,其他任何需要自動處理的欄位和方法也應加上此註解(包括構造器)。

要求工具挖掘

在目標類上添加如下注解以讓框架自動處理挖掘時需要的工具種類和級別:

斧:@AxeMining(MiningLevels.DIAMOND)

鋤:@HoeMining(MiningLevels.DIAMOND)

鎬:@PickaxeMining(MiningLevels.DIAMOND)

剪刀:@ShearsMining(MiningLevels.DIAMOND)

鏟:@ShovelMining(MiningLevels.DIAMOND)

劍:@SwordMining(MiningLevels.DIAMOND)

數據生成

數據生成並未要求添加任何註解,使用@DataGen註解標記一個欄位或類是用於數據生成的,用於降低代碼閱讀難度。

樣式

在代碼中,@Auto註解依照標準要求在每一個會被自動處理的欄位、方法和類上出現,以統一標準樣式。沒有@Auto註解的欄位將不會被處理。

標準樣式是在向主倉庫創建拉取請求或用任意其他方式提交代碼時所必須的,非規範樣式的代碼會被拒絕合併。

參考

  1. "IdentifierAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-06-03. Archived from the original on 2023-06-03. Retrieved 2023-06-11.
  2. "BlockSettingAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-03-16. Archived from the original on 2023-03-16. Retrieved 2023-03-16.
  3. 3.0 3.1 3.2 3.3 "ExampleBlock.java at main · sky-ways/the-road-to-reality". 草二號機. 2023-03-15. Archived from the original on 2023-03-15. Retrieved 2023-03-16.
  4. "BlockItemAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-03-16. Archived from the original on 2023-03-16. Retrieved 2023-03-16.
  5. "LootDataGeneratorAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-03-16. Archived from the original on 2023-03-16. Retrieved 2023-03-16.
  6. "ModelDataGeneratorAccessor.java at main · sky-ways/the-road-to-reality". 草awa. 2023-03-15. Archived from the original on 2023-03-15. Retrieved 2023-03-16.
  7. "BlockFramework.java#L245 at main · sky-ways/the-road-to-reality". 草awa. 2023-06-04. Archived from the original on 2023-06-04. Retrieved 2023-06-14.