为了账号安全,请及时绑定邮箱和手机立即绑定

我怎样才能写得更干净?

我怎样才能写得更干净?

C#
四季花海 2021-10-09 14:09:08
我知道,这可能是一个非常愚蠢的问题。我有一个很长的代码会重复并使用大量的复制+粘贴,我知道复制粘贴相同的代码是一种非常糟糕的做法,但我想不出缩短它的方法!我正在努力编写更清晰的代码是一个检查向量和其他向量的代码。我通过添加 +1 和 -1 来更改 x,然后更改 y +1 和 -1,最后更改 z+1 和 z-1,对于每一个细微的变化,我都会为略微变化的向量调用相同的函数. 这会创建一个非常丑陋的代码: void checkAirRadius(Voxel temp, Vector3 fireposition){    Vector3 original = fireposition;    if (temp.type != null)    {        if (temp.type.isFire != true && temp.type.burnable == true)        {            fireposition.x -= 1;            Voxel temp2 = env.GetVoxel(fireposition);            if (temp2.type == null)                if (temp2.hasContent != 1)                {                    env.VoxelDestroy(original);                    env.VoxelPlace(fireposition, firevoxel);                    coroutine = WaitAndPrint(1.0f, fireposition, 1);                    StartCoroutine(coroutine);                }            fireposition.x += 1;            fireposition.x += 1;            temp2 = env.GetVoxel(fireposition);            if (temp2.type == null)                if (temp2.hasContent != 1)                {                    env.VoxelDestroy(original);                    env.VoxelPlace(fireposition, firevoxel);                    coroutine = WaitAndPrint(1.0f, fireposition, 1);                    StartCoroutine(coroutine);                }            fireposition.x -= 1;            fireposition.y += 1;            temp2 = env.GetVoxel(fireposition);            if (temp2.type == null)                if (temp2.hasContent != 1)                {                    env.VoxelDestroy(original);                    env.VoxelPlace(fireposition, firevoxel);                    coroutine = WaitAndPrint(1.0f, fireposition, 0);                    StartCoroutine(coroutine);                }我想知道是否可以创建一个简单的函数,该函数将采用一个向量并调用该块周围的函数,而无需每次手动将 x、y、z 更改为 2 个点。
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

遵循 DRY(不要重复自己)原则,每次看到被重用的代码时,您都可以而且应该重构它。


至于你的代码,我要做的第一件事是创建一个函数来接收新的fireposition. 比如说:


void ChangeFirePositionAndRecalculate (int newValue) {

    fireposition.z += newValue;

    temp = VoxelPlayEnvironment.instance.GetVoxel(fireposition);

    checkAirRadius(temp, fireposition);

}

而不是调用:


fireposition.z -= 2;

temp = VoxelPlayEnvironment.instance.GetVoxel(fireposition);

checkAirRadius(temp, fireposition);

您可以致电:


ChangeFirePositionAndRecalculate (-2);

ChangeFirePositionAndRecalculate (1);

但是,话又说回来,干。例如,您可以创建一个包含所有这些位置的数组:


public int [] positions;

这甚至允许您fireposition直接从编辑器更改。考虑到这一点,您现在可以运行:


for (int i = 0; i < position.lenght; i++) {

    ChangeFirePositionAndRecalculate (positions [i]);

}

你可以计算其余的。这只是我会做的一些事情。


[编辑] 我忘了提到在创建方法时,使用 CamelCase,我注意到您的某些方法使用但checkAirRadius没有使用。


查看完整回答
反对 回复 2021-10-09
  • 1 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信