Use la unidad para realizar la función de calculadora

1. Cree ui, cree un nuevo panel en Canvas y cree dos InputFields como dos cuadros de entrada para obtener el valor de entrada. Cree cuatro nuevos componentes de botón como botones pulsados. Cree un nuevo componente de texto como visualización de los resultados del cálculo. La interfaz está construida como se muestra a continuación.

 2. Escribir código

using System;
using UnityEngine;
using UnityEngine.UI;

namespace JiSuanQi.UI
{
    public class JISuanQiPanel : MonoBehaviour
    {
        public Button mBtnJiaFa, mBtnJianFa, mBtnChengFa, mBtnChuFa;
        public Text mResult;
        public InputField mInputNumA;
        public InputField mInputNumB;
        private void Awake()
        {
            mBtnJiaFa.onClick.AddListener(JiaFa);
            mBtnJianFa.onClick.AddListener(JianFa);
            mBtnChengFa.onClick.AddListener(ChengFa);
            mBtnChuFa.onClick.AddListener(ChuFa);
        }

        private void JiaFa()
        {
            double result = Operation(0);
            UpdateResult(result);
        }

        private void JianFa()
        {
            double result = Operation(1);
            UpdateResult(result);
        }

        private void ChengFa()
        {
            double result = Operation(2);
            UpdateResult(result);
        }

        private void ChuFa()
        {
            double result = Operation(3);
            UpdateResult(result);
        }

        private double Operation(int index)
        {
            if (string.IsNullOrEmpty(mInputNumA.text)||string.IsNullOrEmpty(mInputNumB.text))
            {
                return -1;
            }
            double NumA = double.Parse(mInputNumA.text);
            double NumB = double.Parse(mInputNumB.text);
            switch (index)
            {
                case 0:
                    return NumA + NumB;
                case 1:
                    return NumA - NumB;
                case 2:

                    return NumA * NumB;
                case 3:
                    if (NumB == 0)
                    {
                        return -1;
                    }
                    else
                    {
                        return NumA / NumB;
                    }
                default:
                    return -1;
            }
        }

        private void UpdateResult(double result)
        {
            mResult.text = "结果:" + result;
        }
    }
}

Los componentes de la interfaz de usuario se asignan arrastrando y soltando. Una forma de asignar valores a los componentes de la interfaz de usuario es utilizar el código para encontrar transform.Find("ruta del panel de la interfaz de usuario del componente").getComponent<tipo de componente>(); inicializar en el método Awake o Start. Prefiero asignar valores arrastrando y soltando. Debido a que la interfaz es algo que cambia con frecuencia, el método de arrastrar y soltar se usa para asignar valores.Si se elimina la interfaz de usuario, no es necesario modificar la parte del código. Si utiliza el método de búsqueda de código y se elimina el componente, se informará un error en la parte buscada del código, lo que implicará la modificación de la parte del código. Sin embargo, puede ver la lógica de vinculación del método completo en el script mediante el método de búsqueda de código. fácil de leer.

Se completa el código simple de suma, resta, multiplicación y división anterior. Este método es el más fácil de pensar durante el desarrollo, y todas las funciones se realizan en una interfaz.

3. El código anterior funciona normalmente, pero hay un problema. La lógica empresarial de la interfaz se mezcla. Pero hay muchos tipos de interfaces.Si se agrega una nueva interfaz ahora, también se debe usar la lógica comercial de suma, resta, multiplicación y división, pero la interfaz no es la interfaz de una calculadora. En este momento, es necesario volver a escribir la lógica de cálculo en un lado. Si la lógica de cálculo cambia en el futuro, ambas interfaces deben modificar la lógica de cálculo. Esto no solo aumentará la carga de trabajo, sino que tampoco puede garantizar que cada modificación sea lo mismo, lo que resulta en la generación de errores. Si desea utilizar la interfaz gráfica de usuario para implementar la misma función de calculadora ahora, también debe copiar la lógica empresarial de la interfaz en el código de la interfaz gráfica de usuario. Cada vez que cambio la interfaz de la interfaz de usuario, me encuentro con el mismo problema.

4. Optimización de código: separación de la lógica de la interfaz de usuario y la lógica empresarial

Lógica de interfaz de interfaz de usuario:

using System;
using UnityEngine;
using UnityEngine.UI;

namespace JiSuanQi.UI
{
    public class JISuanQiPanel : MonoBehaviour
    {
        public Button mBtnJiaFa, mBtnJianFa, mBtnChengFa, mBtnChuFa;
        public Text mResult;
        public InputField mInputNumA;
        public InputField mInputNumB;
        private TestOperation mOperation;
        private void Awake()
        {
            mOperation = new TestOperation();
            mBtnJiaFa.onClick.AddListener(JiaFa);
            mBtnJianFa.onClick.AddListener(JianFa);
            mBtnChengFa.onClick.AddListener(ChengFa);
            mBtnChuFa.onClick.AddListener(ChuFa);
        }

        private void JiaFa()
        {
            double result = Operation(0);
            UpdateResult(result);
        }

        private void JianFa()
        {
            double result = Operation(1);
            UpdateResult(result);
        }

        private void ChengFa()
        {
            double result = Operation(2);
            UpdateResult(result);
        }

        private void ChuFa()
        {
            double result = Operation(3);
            UpdateResult(result);
        }

        private double Operation(int index)
        {
            if (string.IsNullOrEmpty(mInputNumA.text)||string.IsNullOrEmpty(mInputNumB.text))
            {
                return -1;
            }
            double NumA = double.Parse(mInputNumA.text);
            double NumB = double.Parse(mInputNumB.text);
            return mOperation.GetResult(NumA, NumB, index);
        }

        private void UpdateResult(double result)
        {
            mResult.text = "结果:" + result;
        }
    }
}

Lógica de negocios:

namespace JiSuanQi
{
    public class TestOperation 
    {
        public double GetResult(double NumA,double NumB,int index)
        {
            switch (index)
            {
                case 0:
                    return NumA + NumB;
                case 1:
                    return NumA - NumB;
                case 2:

                    return NumA * NumB;
                case 3:
                    if (NumB == 0)
                    {
                        return -1;
                    }
                    else
                    {
                        return NumA / NumB;
                    }
                default:
                    return -1;
            }
        }
    }
}

La lógica empresarial se extrae en la nueva clase TestOperation, de modo que se extrae la lógica empresarial.

El código anterior funciona bien.

4. Problemas con el código: Toda la lógica de cálculo se mantiene en la clase TestOperation. Si posteriormente se añaden otras lógicas de cálculo, como enraizamiento, resto y otras lógicas de cálculo nuevas, o modificaciones especiales a la lógica de suma, resta, multiplicación y división, se verá involucrada la modificación de la clase TestOperation, de forma que si la Operación aparece la clase Un error hará que la función de cálculo sea anormal. Y no hay garantía de que cada modificación no afecte las funciones ya utilizadas. Porque es la clase TestOperation la que se modifica.

5. Optimización de código:

using UnityEngine;

namespace JiSuanQi
{
    public abstract class Operation
    {
        public double NumberA;
        public double NumberB;
        public abstract double GetResult();
    }
}



namespace JiSuanQi
{
    public class OperationAdd:Operation
    {
        public override double GetResult()
        {
            return NumberA + NumberB;
        }
    }
}


namespace JiSuanQi
{
    public class OperationReduce:Operation
    {
        public override double GetResult()
        {
            return NumberA - NumberB;
        }
    }
}

namespace JiSuanQi
{
    public class OperationChengFa:Operation
    {
        public override double GetResult()
        {
            return NumberA * NumberB;
        }
    }
}

namespace JiSuanQi
{
    public class OperationChuFa:Operation
    {
        public override double GetResult()
        {
            return NumberA / NumberB;
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using JiSuanQi;
using UnityEngine;

public class SimpleFactory 
{
   public static Operation CreateOperate(int index)
   {
      switch (index)
      {
         case 0:
            return new OperationAdd();
         case 1:
            return new OperationReduce();
         case 2:

            return new OperationChengFa();
         case 3:
            return new OperationChuFa();
         default:
            return null;
      }
   }
}

Optimización de la lógica empresarial, se extrae la clase Operation, se utiliza la operación de suma, resta, multiplicación y división como objeto, y se utiliza la clase Operation como clase base de la operación. La clase base solo necesita contener dos campos de NumA y NumB y un método GetResult. Las implementaciones concretas son reemplazadas por subclases. Implementar una lógica diferente.

clase FábricaSimple. Pertenece a la fábrica para la creación de objetos. Dependiendo del índice de entrada, se instancian diferentes operaciones. Si hay una modificación posterior, solo necesita modificar la fuente correspondiente.

 

Supongo que te gusta

Origin blog.csdn.net/xiaonan1996/article/details/125233643
Recomendado
Clasificación