日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

表驱动设计的一点见解

發(fā)布時(shí)間:2025/3/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 表驱动设计的一点见解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

???????昨晚看了CC2的一章,專門講表驅(qū)動(dòng)設(shè)計(jì)的.看了兩三次才看懂了.然后想起了一起自己做過(guò)的一個(gè)項(xiàng)目的那種劣質(zhì)實(shí)現(xiàn)膽戰(zhàn)心驚,真是相逢恨晚呀.
????? 以前做過(guò)的一個(gè)項(xiàng)目是從一個(gè)文本框中輸入一個(gè)日期,然后判斷這個(gè)日期是否合法,我當(dāng)時(shí)的想法是判斷輸入的年份是不是閏年,然后再判斷輸入的月份是不是二月,如果是二月再判斷有沒(méi)有超出日期.是不是很暈....如果我們用表驅(qū)動(dòng)那么我們應(yīng)該得到一下的一個(gè)很簡(jiǎn)單的實(shí)現(xiàn):

?????定義一個(gè)二維數(shù)組dayNumber[2][12]其中dayNumber[0]保存一般的非閏年的月份日數(shù),dayNumber[1]保存閏年的月份日數(shù).然后我們只要定義一個(gè)函數(shù)int IsLeapYear(int year)是閏年就返回一個(gè)1不是返回0,那么對(duì)于每一個(gè)月份的最大日數(shù)我們都可以這樣子得到了lastDay=dayNumber[isLeapYear(year)][month],沒(méi)有長(zhǎng)長(zhǎng)的If語(yǔ)句.

????? 而在后面CC2上給出了一個(gè)更加復(fù)雜的例子.這個(gè)例子是這樣子的:

????? 有很多記錄文件,每一個(gè)記錄文件記錄著500條數(shù)據(jù),在這些數(shù)據(jù)中共有20中不同的數(shù)據(jù)形式.然后每一條數(shù)據(jù)都由一些field組成,每一種field的計(jì)算機(jī)表現(xiàn)形式不同.最后,每一種數(shù)據(jù)的數(shù)據(jù)組成方式可能會(huì)改變,由客戶決定.現(xiàn)在我們要將數(shù)據(jù)里面的內(nèi)容讀出來(lái)顯示在屏幕上.我們會(huì)怎么樣做了?
????? 我們?nèi)绻凑彰嫦驅(qū)ο蟮奈覀兙蜁?huì)寫一個(gè)抽象的Message來(lái)作為每一中數(shù)據(jù)形式的基類,然后再繼承,派生.可是要是用戶再增加類的數(shù)目了?
????? 再CC2里面介紹了用表驅(qū)動(dòng)法來(lái)解決這個(gè)問(wèn)題,我們可以定義一個(gè)AbstractField的基類來(lái)代表所有的field類型,然后就每一個(gè)具體的Field類型寫一個(gè)實(shí)現(xiàn)類.再定義一個(gè)代表各種field類型的枚舉.最后定義一個(gè)Message類代表每一個(gè)數(shù)據(jù),和定義一個(gè)AbstractField類型的數(shù)組,數(shù)組的內(nèi)容有每一種Field類型的實(shí)例組成.最后對(duì)于每一條數(shù)據(jù)我們都有一下的一種表達(dá)方式:
?????? for each field in message
??????????fields[fieldtype].Print(str)

?????? 我們根本上就不用用邏輯判斷去實(shí)現(xiàn)這個(gè)功能.
下面我給出一個(gè).net的實(shí)現(xiàn):

??????????

?

Code
class?Program
????{
????????
private?static?AbstractField[]?array?=?new?AbstractField[]?{?new?IntField(),?new?ObjField(),?new?StrField()?};

????????
static?void?Main(string[]?args)
????????{
????????????Message?m?
=?new?Message();
????????????m.AddFieldToMessage(FieldType.IntegerField,?
"10000");
????????????m.AddFieldToMessage(FieldType.ObjectField,?
"object");
????????????m.AddFieldToMessage(FieldType.StringField,?
"string");
????????????List
<field>?fields?=?m.GetFields();
????????????
int?count?=?fields.Count;
????????????
int?index?=?0;
????????????
while?(index?<?count)
????????????{
????????????????array[(
int)fields[index].type].PrintMessageField(fields[index].body);
????????????????index
++;
????????????}
????????????Console.Read();
????????}
????}

????
class?Message
????{
????????
????????
private?List<field>?fields;

????????
public?void?AddFieldToMessage(FieldType?type,?string?body)
????????{
????????????field?addField?
=?new?field();
????????????addField.body?
=?body;
????????????addField.type?
=?type;
????????????fields.Add(addField);
????????}

????????
public?List<field>?GetFields()
????????{
????????????
return?fields;
????????}

????????
public?Message()
????????{
????????????fields?
=?new?List<field>();
????????}
????}

????
abstract?class?AbstractField
????{
????????
public?virtual?void?PrintMessageField(string?body)
????????{
????????????
throw?new?Exception("this?method?must?be?implement");
????????}
????}

????
class?IntField?:?AbstractField
????{
????????
public?override?void?PrintMessageField(string?body)
????????{
????????????Console.WriteLine(
"print?from?IntField:{0}",?body);
????????????
//base.PrintMessageField(body);
????????}
????}

????
class?StrField?:?AbstractField
????{
????????
public?override?void?PrintMessageField(string?body)
????????{
????????????Console.WriteLine(
"Print?from?strField:{0}",?body);
????????????
//base.PrintMessageField(body);
????????}?
????}

????
class?ObjField?:?AbstractField
????{
????????
public?override?void?PrintMessageField(string?body)
????????{
????????????Console.WriteLine(
"Print?from?objField:{0}",?body);
????????????
//base.PrintMessageField(body);
????????}
????}
????
enum?FieldType?:?int
????{
????????IntegerField?
=?0,
????????StringField,
????????ObjectField
????}
??
struct?field
????{
????????
public?FieldType?type;
????????
public?string?body;
????}
??????? 這是我的實(shí)現(xiàn),水平有限,有什么不對(duì)的請(qǐng)指正.
???????? 最后謝謝所有上我的blog給我鼓勵(lì)和意見(jiàn)的人.謝謝.

轉(zhuǎn)載于:https://www.cnblogs.com/hrmai/archive/2008/08/16/1269318.html

總結(jié)

以上是生活随笔為你收集整理的表驱动设计的一点见解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。