1. UI を構築し、Canvas で新しいパネルを作成し、入力値を取得するための 2 つの入力ボックスとして 2 つの InputField を作成します。クリックされたボタンとして 4 つの新しいボタン コンポーネントを作成します。計算結果の表示として新しい Text コンポーネントを作成します。インターフェースは以下のように構築されています
2. コードを書く
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;
}
}
}
ui コンポーネントはドラッグ アンド ドロップで割り当てられます。ui コンポーネントに値を割り当てる 1 つの方法は、Awake メソッドまたは Start メソッドで、transform.Find("ui パネルのコンポーネントのパス").getComponent<component type>(); を検索するコードを使用して初期化することです。私はドラッグアンドドロップで値を割り当てることを好みます。インターフェースは頻繁に変更されるものであるため、値の割り当てにはドラッグ&ドロップを使用しますが、ui を削除してもコード部分を変更する必要はありません。コード検索方法を使用してコンポーネントが削除された場合、コードの検索部分でエラーが報告され、コード部分の変更が必要になります。ただし、コード検索メソッドを使用すると、スクリプト内の完全なメソッド バインディング ロジックを確認できます。読みやすい。
以上の単純な加減乗除のコードが完成しますが、この方法が開発時に最も考えやすく、全ての機能が一つのインターフェースで実現されています。
3. 上記のコードは正常に機能しますが、問題があります。インターフェースのビジネスロジックが混在しています。しかし、インターフェースにはさまざまな種類があり、新たにインターフェースを追加する場合には、加算、減算、乗算、除算のビジネスロジックも使用する必要がありますが、そのインターフェースは電卓のインターフェースではありません。このとき、片側の計算ロジックを書き換える必要があり、将来的に計算ロジックが変更された場合、両方のインターフェースで計算ロジックを変更する必要があり、作業負荷が増加し、それぞれの変更が同じであることを保証できません。バグの世代で。GUI を使用して同じ電卓機能を実装したい場合は、インターフェイスのビジネス ロジックを GUI コードにコピーする必要もあります。UI インターフェイスを変更するたびに、同じ問題が発生します。
4. コードの最適化: UI ロジックとビジネス ロジックの分離
UI インターフェイス ロジック:
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;
}
}
}
ビジネスの論理:
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;
}
}
}
}
ビジネスロジックは、新規クラスTestOperationに抽出され、ビジネスロジックが抽出される。
上記のコードは正常に動作します。
4. コードの問題: すべての計算ロジックは TestOperation クラスで維持されます。根計算、剰余、その他の新しい計算ロジック、または加算、減算、乗算、除算のロジックへの特別な変更など、他の計算ロジックを後で追加する場合は、TestOperation クラスの変更が関係します。 class が表示される エラーが発生すると計算機能が異常になります。また、それぞれの変更がすでに使用されている機能に影響を与えないという保証はありません。変更されるのは TestOperation クラスであるためです。
5. コードの最適化:
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;
}
}
}
ビジネス ロジックの最適化では、Operation クラスを抽出し、加算、減算、乗算、除算の演算をオブジェクトとして使用し、Operation クラスを演算の基底クラスとして使用します。基底クラスは、次の 2 つのフィールドを保持するだけで済みます。 NumA と NumB、および GetResult メソッド。具体的な実装はサブクラスによってオーバーライドされます。別のロジックを実装します。
SimpleFactory クラス。オブジェクト作成のためのファクトリーに属します。入力インデックスに応じて、さまざまなオペレーションがインスタンス化されます。後で変更があった場合は、対応するフォントを変更するだけで済みます。