再说继承关系
Teddy的NBear終于開(kāi)始實(shí)現(xiàn)繼承,對(duì)我來(lái)說(shuō)又多了一個(gè)真正可以探討問(wèn)題的同行。但是Teddy沒(méi)有實(shí)現(xiàn)一類一實(shí)體的方案,這令我非常失望。我曾在這一方案上付出過(guò)太多的艱辛,是因?yàn)槲抑肋@種方案的真正價(jià)值。在ER模型理論中,關(guān)鍵的元素就是實(shí)體和關(guān)系,對(duì)于實(shí)體來(lái)說(shuō),重要的子元素是屬性,屬性的共享可以催生抽象從而導(dǎo)致繼承。對(duì)于關(guān)系來(lái)講,關(guān)系包括基數(shù)關(guān)系、依賴關(guān)系和結(jié)構(gòu)關(guān)系,其中最主要的結(jié)構(gòu)關(guān)系就是特化/泛化關(guān)系,映射到OO就是繼承。在我的上一篇文章描述過(guò)這樣的關(guān)系。
前段時(shí)間交付了一個(gè)系統(tǒng)。由于該系統(tǒng)只是整個(gè)大系統(tǒng)中的第一個(gè)子系統(tǒng),緊隨其后還有三個(gè)子系統(tǒng)。為了將每個(gè)子系統(tǒng)都公用的部分能夠方便抽取出來(lái),所以采用了一個(gè)公共域。該公共域的主要功能是:
1.?????? 認(rèn)證
2.?????? 權(quán)限及授權(quán)
3.?????? 日志
4.?????? 即時(shí)消息
于是就有了以下的設(shè)計(jì)(省略了日志部分和即時(shí)消息部分):
這里有一個(gè)比較罕見(jiàn)的三元關(guān)聯(lián)關(guān)系:權(quán)限、區(qū)域和權(quán)限所有者。目前這里的區(qū)域是指行政區(qū)域,省、地市、區(qū)縣,等等,當(dāng)然在設(shè)計(jì)上完全可以想象成一個(gè)任何的范圍對(duì)象,表示該權(quán)限在該范圍內(nèi)才有效。而權(quán)限僅僅只是一個(gè)字符串標(biāo)識(shí),例如system.management.usermanagement就表示用戶管理權(quán)限,當(dāng)然,權(quán)限不是一個(gè)動(dòng)態(tài)概念,必須由系統(tǒng)需求來(lái)決定的,不過(guò)由于比較自由所以更容易維護(hù)。
相比之下權(quán)限所有者就比較復(fù)雜一點(diǎn),包括兩大類:第一類是用戶,第二類是用戶組。同時(shí)用戶與用戶組又是關(guān)聯(lián)關(guān)系,而運(yùn)行時(shí)每個(gè)用戶所執(zhí)行的權(quán)限是用戶自己的權(quán)限加所在的用戶組的權(quán)限的并集。所以,第一層繼承是從權(quán)限所有者到用戶和用戶組的繼承。另外,用戶分做兩類:一類是本地用戶,即在系統(tǒng)內(nèi)有效的用戶,由本系統(tǒng)認(rèn)證;第二類是單點(diǎn)登錄用戶,或者稱為門戶用戶,與企業(yè)其他應(yīng)用系統(tǒng)共享一套用戶認(rèn)證。
日志系統(tǒng)比較復(fù)雜。除了登錄日志、異常日志外,所有的改動(dòng)都要有記錄。所以,就有了從日志到登錄日志、異常日志、改動(dòng)日志的繼承關(guān)系,同時(shí)也有了從改動(dòng)日志到插入日志、編輯日志、刪除日志的繼承關(guān)系。
是否一定需要導(dǎo)入復(fù)雜的繼承關(guān)系?我認(rèn)為是必不可少的。雖然有的人也采用沒(méi)有繼承關(guān)系的方案解決得很好,但是對(duì)后續(xù)的設(shè)計(jì)一定比我復(fù)雜很多。例如,用戶對(duì)象將會(huì)分散到系統(tǒng)的各個(gè)角落,對(duì)用戶的抽象令用戶對(duì)象不再關(guān)注認(rèn)證方式和認(rèn)證的信息。這符合我的原則:繼承關(guān)系存在的唯一理由就是關(guān)系共享導(dǎo)致的抽象。而日志的共享,是依據(jù)一個(gè)從業(yè)務(wù)實(shí)現(xiàn)和表現(xiàn)層所帶來(lái)的對(duì)抽象日志的管理。這就是:每一個(gè)日志被記錄后,受配置所控制,可以通過(guò)Email、SMS或者其他任何可以采用的方式即時(shí)向外發(fā)布。
系統(tǒng)運(yùn)行一段時(shí)間以后,用戶希望將消息系統(tǒng)一日志結(jié)合起來(lái),用戶可訂閱一些日志作為即時(shí)消息。這個(gè)提議非常好,立即被我接受。于是,我需要從用戶那里派生出一個(gè)GhostUser出來(lái),將這個(gè)Ghost用戶與具體的日志進(jìn)行關(guān)聯(lián)。當(dāng)然,GhostUser是無(wú)法登錄的,僅僅是作為即時(shí)消息系統(tǒng)中的占位用戶。于是就有了以下的設(shè)計(jì),呵呵,很容易看出來(lái),以前的數(shù)據(jù)表不需要任何修改,如果用戶系統(tǒng)中有大量的實(shí)際數(shù)據(jù),那么這次更新也就不會(huì)造成任何麻煩:
如果你采用單表,或者一個(gè)具體類一個(gè)表,能很清爽地解決么?
重復(fù)一下我以前文章中的論點(diǎn):
1.單表實(shí)現(xiàn)的繼承是回避了繼承關(guān)系,事實(shí)上是采用其他的關(guān)系替代繼承關(guān)系,所以不要稱之為“單表實(shí)現(xiàn)繼承”;
2.每個(gè)具體表一張表實(shí)現(xiàn)的繼承在某種程序上實(shí)現(xiàn)了繼承,但是這種繼承的交通非常有限,不足以很靈活地處理復(fù)雜的關(guān)系。
轉(zhuǎn)載于:https://www.cnblogs.com/Barton131420/archive/2006/08/11/474127.html
總結(jié)
- 上一篇: Java中四种访问权限总结
- 下一篇: VS 2005 WEB PROJECT包