Unity版本: 5.2
使用語言: C#
寫在前面
搞計算機這個行業(yè)的,語言功底的重要性不言而喻。
熟悉CSharp語言的都知道,我們寫代碼設(shè)計程序的時候要想著幾條原則:
1.單一職責(zé)
2.里氏替換
3.依賴倒置
4.接口隔離
5.開放封閉
6.迪米特法則
今天我想通過實例來講一下 #依賴倒置原則#
依賴倒置原則
What 什么是依賴倒置原則?
記住一句話:抽象不應(yīng)該依賴細節(jié),細節(jié)需要依賴抽象。
Where 舉例:
1.司機會開車,那么它可以開奔馳車也可以開寶馬車 。這里開車就是抽象,而開奔馳還是開寶馬就是細節(jié)。
2.魔獸世界中的英雄可以學(xué)習(xí)騎術(shù)技能,學(xué)完了就以可以騎馬,騎摩托車……這里騎術(shù)就是抽象,騎摩托還是騎馬就是細節(jié)。
How 上面的例子怎么實現(xiàn)
using UnityEngine;
using System.Collections;
/// <summary>
/// Icar.聲明接口,所有的車都要實現(xiàn)該接口
/// </summary>
public interface ICar
{
void Run();
}
/// <summary>
/// Bentley.賓利車類
/// </summary>
public class Bentley : ICar
{
public void Run()
{
Debug.Log("Bentley Run....");
}
}
/// <summary>
/// Bentley.法拉利車類
/// </summary>
public class Ferrari : ICar
{
public void Run ()
{
Debug.Log("Ferrari Run....");
}
}
/// <summary>
/// Driver.司機類
/// </summary>
public class Driver {
//司機可以開車(依賴倒置寫法)
#//參數(shù)里面并沒有寫細節(jié):賓利還是法拉利
public void Drive(ICar car)
{
car.Run();
}
}
Why 為什么要使用這個原則?
它可以讓你的程序減少類之間的耦合, 提高系統(tǒng)的穩(wěn)定性,降低并行開發(fā)倒置的風(fēng)險,最重要的是提高代碼的可讀性和可維護性。
練習(xí)
在數(shù)據(jù)庫創(chuàng)建MonsterData表,具有字段:怪物ID,怪物等級,怪物攻擊力, 怪物血量。
在數(shù)據(jù)庫創(chuàng)建HeroData表,具有字段:英雄ID, 英雄等級,英雄血量。
創(chuàng)建客戶端腳本,創(chuàng)建對應(yīng)的表結(jié)構(gòu),并創(chuàng)建數(shù)據(jù)解析類,實現(xiàn)統(tǒng)一的數(shù)據(jù)解析方法。(提示:用依賴倒置原則封裝統(tǒng)一方法,實現(xiàn)數(shù)據(jù)的解析)
答案(思考之后再看)
using UnityEngine;
using System;
using System.Collections;
/// <summary>
/// Idata. 所有的結(jié)構(gòu)體要有這個方法,用來解析數(shù)據(jù)
/// </summary>
public interface IData
{
void Parse(string[] datas);
}
/// <summary>
/// Monster data.怪物結(jié)構(gòu)體
/// </summary>
public struct MonsterData : IData
{
public int mID; //怪物ID
public int mRank; //怪物等級
public int mAttack; //怪物攻擊力
public int mHP; //怪物血量
public void Parse (string[] datas)
{
int index = 0;
this.mID = Convert.ToInt32(datas[index++]);
this.mRank = Convert.ToInt32(datas[index++]);
this.mAttack = Convert.ToInt32(datas[index++]);
this.mHP = Convert.ToInt32(datas[index++]);
}
}
/// <summary>
/// Monster data.英雄結(jié)構(gòu)體
/// </summary>
public struct HeroData : IData
{
public int mID; //英雄ID
public int mRank; //英雄等級
public int mHP; //英雄血量
public void Parse (string[] datas)
{
int index = 0;
this.mID = Convert.ToInt32(datas[index++]);
this.mRank = Convert.ToInt32(datas[index++]);
this.mHP = Convert.ToInt32(datas[index++]);
}
}
/// <summary>
/// XML2Data.此類用來將XML數(shù)據(jù)轉(zhuǎn)換成結(jié)構(gòu)體
/// </summary>
public class XML2Data
{
//采用依賴倒置原則 + 泛型約束
//泛型約束:T類型必須實現(xiàn)了接口IData,并且有構(gòu)造方法
public static T GetData<T>(string[] datas) where T : IData, new()
{
T result = new T();
result.Parse(datas);
return result;
}
}
寫在最后
#其他原則連載中。。。
#成功的道路沒有捷徑,代碼這條路更是如此,唯有敲才是王道。