我怎样才能写得更干净?

我知道,这可能是一个非常愚蠢的问题。


我有一个很长的代码会重复并使用大量的复制+粘贴,我知道复制粘贴相同的代码是一种非常糟糕的做法,但我想不出缩短它的方法!我正在努力编写更清晰的代码是一个检查向量和其他向量的代码。我通过添加 +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 个点。


四季花海
浏览 167回答 1
1回答

慕盖茨4494581

遵循 DRY(不要重复自己)原则,每次看到被重用的代码时,您都可以而且应该重构它。至于你的代码,我要做的第一件事是创建一个函数来接收新的fireposition. 比如说:void ChangeFirePositionAndRecalculate (int newValue) {&nbsp; &nbsp; fireposition.z += newValue;&nbsp; &nbsp; temp = VoxelPlayEnvironment.instance.GetVoxel(fireposition);&nbsp; &nbsp; 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++) {&nbsp; &nbsp; ChangeFirePositionAndRecalculate (positions [i]);}你可以计算其余的。这只是我会做的一些事情。[编辑] 我忘了提到在创建方法时,使用 CamelCase,我注意到您的某些方法使用但checkAirRadius没有使用。
打开App,查看更多内容
随时随地看视频慕课网APP