[前言]
design pattern是設(shè)計(jì)模式,通常是前人在軟件開(kāi)發(fā)過(guò)程中積累出來(lái)的解決一些問(wèn)題
的現(xiàn)成套路,按它們來(lái)做可獲益無(wú)窮园匹。anti-pattern也是一些現(xiàn)成的套路,但它們是現(xiàn)成的
錯(cuò)誤套路盔性,避免它們則亦可獲益無(wú)窮。本文譯者Korner Hill的更多其它翻譯和原創(chuàng)文章可
在blog上找到http://blog.csdn.net/KornerHill腿倚。
計(jì)算機(jī)領(lǐng)域內(nèi)的很多詞匯都缺少公認(rèn)的中文翻譯纯出,anti-pattern也是如此蚯妇,這里譯為反面模
式敷燎,乃是因?yàn)樗旧硎亲鳛榉疵娼滩氖褂玫哪J健F鋵?shí)直接用“反面教材”更通俗易懂箩言,但
這里為了保持它與設(shè)計(jì)模式之間的內(nèi)在關(guān)聯(lián)硬贯,而使用了“反面模式”一詞。
來(lái)自Wikipedia, 自由百科全書(shū)
在軟件工程中陨收,一個(gè)反面模式(anti-pattern或antipattern)指的是在實(shí)踐中明顯出現(xiàn)但
又低效或是有待優(yōu)化的設(shè)計(jì)模式饭豹。
Andrew Koenig在1995年造了anti-pattern這個(gè)詞,靈感來(lái)自于GoF的《設(shè)計(jì)模式》一書(shū)务漩。而
這本書(shū)則在軟件領(lǐng)域發(fā)明了“設(shè)計(jì)模式”(design pattern)一詞拄衰。三年后antipattern因
《AntiPatterns》這本書(shū)而獲得普及,而它的使用也從軟件設(shè)計(jì)領(lǐng)域擴(kuò)展到了日常的社會(huì)互
動(dòng)中饵骨。按《AntiPatterns》作者的說(shuō)法翘悉,可以用至少兩個(gè)關(guān)鍵因素來(lái)把反面模式和不良習(xí)慣
、錯(cuò)誤的實(shí)踐或糟糕的想法區(qū)分開(kāi)來(lái):
* 行動(dòng)居触、過(guò)程和結(jié)構(gòu)中的一些重復(fù)出現(xiàn)的乍一看是有益的妖混,但最終得不償失的模式
* 在實(shí)踐中證明且可重復(fù)的清晰記錄的重構(gòu)方案
很多反面模式只相當(dāng)于是錯(cuò)誤、咆哮轮洋、不可解的問(wèn)題制市、或是可能可以避免的糟糕的實(shí)踐,它
們的名字通常都是一些用反話構(gòu)成的詞語(yǔ)弊予。有些時(shí)候陷阱(pitfalls)或黑色模式(dark
patterns)這些不正式的說(shuō)法會(huì)被用來(lái)指代各類反復(fù)出現(xiàn)的糟糕的解決方法祥楣。因此,一些有
爭(zhēng)議的候選的反面模式不會(huì)被正式承認(rèn)。
[1. 已知的反面模式]
[1.1 組織結(jié)構(gòu)的反面模式]
* 從天而降的責(zé)任(accidental ownership):雇員們接手了一個(gè)與當(dāng)前系統(tǒng)完全無(wú)關(guān)的系
統(tǒng)误褪,在沒(méi)有合適的訓(xùn)練床未、學(xué)習(xí)或關(guān)心下就得維護(hù)它(在90年代的電話->網(wǎng)絡(luò)管理員中很常
見(jiàn))
* 分析麻痹(Analysis paralysis):在項(xiàng)目的分析階段付出的努力太少
* 引擎室里的船長(zhǎng)(Captain in the engine room):團(tuán)隊(duì)帶頭人把時(shí)間和精力全花在技術(shù)
問(wèn)題上,沒(méi)有人開(kāi)船
* 搖錢樹(shù)(cash cow):盈利的老產(chǎn)品通常會(huì)導(dǎo)致對(duì)新產(chǎn)品的自滿
* 持續(xù)退化(Continuous obsolescence):不成比例地投入精力把系統(tǒng)移植到新環(huán)境下
* 經(jīng)費(fèi)轉(zhuǎn)移(Cost migration):項(xiàng)目經(jīng)費(fèi)轉(zhuǎn)移到弱勢(shì)的部門或商業(yè)伙伴那里
* 危機(jī)模式(Crisis mode)或救火模式(firefighting mode):硬是等到火燒屁屁的時(shí)候
才去解決問(wèn)題振坚,結(jié)果是每個(gè)問(wèn)題都成了危機(jī)問(wèn)題
* 委員會(huì)設(shè)計(jì)(Design by committee):很多人同時(shí)進(jìn)行設(shè)計(jì)薇搁,卻沒(méi)有統(tǒng)一的看法
* 委員會(huì)擴(kuò)張(Escalation of commitment):明知錯(cuò)了還不能收回之前的決定
* 英雄模式(Hero-mode):長(zhǎng)期依賴成員的英雄式的努力來(lái)滿足不可能的任務(wù)期限,同時(shí)
又忽視從一開(kāi)始就沒(méi)有注重軟件品質(zhì)帶來(lái)的損失
* 我早就說(shuō)過(guò)(I told you so):某人之前的警告沒(méi)得到重視渡八,事后又被人發(fā)現(xiàn)是正確的
啃洋,并引起了關(guān)注
* 主觀管理(Management by hope):認(rèn)為平靜的表象就代表一切順利
* 通過(guò)忽視的管理(Management by neglect):過(guò)多地委任
* 用數(shù)字管理(Management by numbers):過(guò)于關(guān)注非本質(zhì)而又不易取得的數(shù)字指標(biāo)
* Perkele管理(Management by perkele):用完全聽(tīng)不進(jìn)異議的獨(dú)裁作風(fēng)進(jìn)行管理
* 思考管理(Management by wondering):希望一個(gè)團(tuán)隊(duì)定義自己的目標(biāo),然后考慮他們
要做什么
* 精神危險(xiǎn)(Moral hazard):不讓做決定的人知道他的決定會(huì)帶來(lái)什么結(jié)果
* 蘑菇管理(Mushroom management):有事也不通知雇員或是錯(cuò)誤地通知(像種蘑菇一樣
放在黑地里施肥)
* 不是這里發(fā)明的(Not invented here):拒絕使用組織外的主意或方案
* 精益求精(Polishing the polish):把已經(jīng)完成的項(xiàng)目交給下屬去做屎鳍,禁止他們做其它
的事宏娄,又報(bào)怨他們低效率
* 規(guī)模爬行(另外兩個(gè)類似的詞是復(fù)雜度陷阱和功能主義者):不適當(dāng)控制項(xiàng)目的規(guī)模的增
加
* 煙囪(Stovepipe):結(jié)構(gòu)上支持?jǐn)?shù)據(jù)主要在上下方面的流動(dòng),卻禁止平行的通信
* 客戶套牢(Vendor lock-in):使一個(gè)系統(tǒng)過(guò)于依賴外部提供的部件
* 小提琴弦組織(Violin string organization):高度調(diào)整和裁減卻沒(méi)有靈活性的組織
[1.2 項(xiàng)目管理的反面模式]
* 死亡征途(Death march):除了CEO逮壁,每個(gè)人都知道這個(gè)項(xiàng)目會(huì)完蛋孵坚。但是真相卻被隱瞞
下來(lái),直到大限來(lái)臨
* 拖后腿的無(wú)知(Heel dragging blindness):項(xiàng)目經(jīng)理的無(wú)知拖了后腿窥淆。出于某些動(dòng)機(jī)
卖宠,員工趨向于減少努力來(lái)延長(zhǎng)項(xiàng)目時(shí)限。例如忧饭,他們是按時(shí)間(而非結(jié)果)付費(fèi)扛伍,又沒(méi)有
能順利轉(zhuǎn)移過(guò)去的后續(xù)項(xiàng)目
* 煙和鏡(Smoke and mirros):展示還沒(méi)完成的函數(shù)會(huì)是怎樣
* 軟件膨脹(Software bloat):允許系統(tǒng)的后續(xù)版本使用更多的資源
[1.3 團(tuán)隊(duì)管理的反面模式]
* 缺席的經(jīng)理(Absentee manager):經(jīng)理長(zhǎng)時(shí)間不出現(xiàn)的情況
* Cage match negotiator:經(jīng)理用“不惜一切代價(jià)也要取勝”的方式來(lái)管理
* Doppelganger:某些經(jīng)理或同事剛才還平易近人,過(guò)了一下就變得難于相處
* 無(wú)底洞(Fruitless hoops):經(jīng)理在做出決定前要求大量的(通常是無(wú)意義的)數(shù)據(jù)
* 黃金小孩(Golden child):依據(jù)人情而不是實(shí)際的表現(xiàn)词裤,特殊的責(zé)任刺洒、機(jī)會(huì)、認(rèn)可吼砂、獎(jiǎng)
勵(lì)被給予團(tuán)隊(duì)成員
* 無(wú)頭蒼蠅(Headless chicken):經(jīng)理總是處于恐慌中
* 領(lǐng)導(dǎo)而非經(jīng)理(Leader not manager):經(jīng)理是一個(gè)好的領(lǐng)導(dǎo)逆航,卻缺乏行政和管理能力
* 管理克隆(Managerial cloning):經(jīng)理對(duì)所有人的雇傭和指導(dǎo)的方法都是一樣的:像他
們的老板
* 經(jīng)理而非領(lǐng)導(dǎo)(Manager not leader):經(jīng)理能勝任行政和管理職責(zé)渔肩,卻缺乏領(lǐng)導(dǎo)能力
* 指標(biāo)濫用(Metric abuse):惡意或是不適當(dāng)?shù)厥褂弥笜?biāo)
* 好好先生(Mr. nice guy):經(jīng)理想成為每個(gè)人的朋友
* 鴕鳥(niǎo)(Ostrich):有些人員整天做些空洞的事情卻忽視那些需要在最后期限前被解決的
事情還以為會(huì)沒(méi)事因俐,通常更希望看起來(lái)很忙,但實(shí)際上會(huì)浪費(fèi)和用盡時(shí)間
* 平民英雄(Proletariat hero):口頭上稱贊普通員工技術(shù)如何如何之牛赖瞒,實(shí)際上管理層
只是把他們當(dāng)成棋子女揭,目的是有借口更多的攤派任務(wù)以及增加生產(chǎn)目標(biāo)
* 得勢(shì)的暴發(fā)戶(Rising upstart):指這樣一些潛在的新星,他們急不可耐地想要爬上去
栏饮,不愿花費(fèi)量些必要的時(shí)間去學(xué)習(xí)和成長(zhǎng)
* 海鷗管理(Seagull management):飛進(jìn)來(lái)吧兔,弄得雞飛狗跳、一片兒狼藉袍嬉,然后就拍拍屁
股走人
* 懦弱的執(zhí)行者(Spineless executive):管理者沒(méi)有勇氣來(lái)面對(duì)當(dāng)前形勢(shì)境蔼、來(lái)承擔(dān)責(zé)任
灶平、或是來(lái)保護(hù)自己的下屬
* 三個(gè)腦袋的騎士(Three-headed knight):沒(méi)有決斷力的管理者
* 終極武器(Ultimate weapon):有些人完全依賴自己的同事或是組織,好像他們自己只
是一個(gè)導(dǎo)體箍土,把問(wèn)題全部傳給別人
* 熱身狀態(tài)(Warm bodies):指有些員工幾乎不能達(dá)到工作的最低要求逢享,因此不斷地從一
個(gè)項(xiàng)目轉(zhuǎn)到另一個(gè)項(xiàng)目,或是從一個(gè)團(tuán)隊(duì)換到另一個(gè)團(tuán)隊(duì)吴藻。
* 只會(huì)說(shuō)是的人(Yes man):指一些管理者當(dāng)面對(duì)CEO說(shuō)的每句話都說(shuō)是瞒爬,CEO不在的情況
下他可能說(shuō)的又是另一回事
[1.4 分析方式的反面模式]
* 尿布說(shuō)明(Napkin specification):把給開(kāi)發(fā)團(tuán)隊(duì)的功能或技術(shù)說(shuō)明寫(xiě)在尿布上(即是
說(shuō),不正式沟堡,又缺乏細(xì)節(jié))侧但,和根本就沒(méi)有說(shuō)明一樣
* 假需求(Phony requirements):所有的需求都是通過(guò)網(wǎng)絡(luò)會(huì)議或是電話通知給開(kāi)發(fā)團(tuán)隊(duì)
的,沒(méi)有任何功能航罗、技術(shù)上的說(shuō)明或其它說(shuō)明文檔
* 火箭說(shuō)明(Retro-specification):在項(xiàng)目已經(jīng)啟動(dòng)之后才開(kāi)始寫(xiě)技術(shù)禀横、功能說(shuō)明
[1.5 通常的設(shè)計(jì)反面模式]
* 抽象倒置(Abstraction inversion):不把用戶需要的功能直接提供出來(lái),導(dǎo)致他們要
用更上層的函數(shù)來(lái)重復(fù)實(shí)現(xiàn)
* 用意不明(Ambiguous viewpoint):給出一個(gè)模型(通常是OOAD粥血,面向?qū)ο蠓治雠c設(shè)計(jì)
)卻沒(méi)有指出用意何在
* 大泥球(Big ball of mud):系統(tǒng)的結(jié)構(gòu)不清晰
* 斑點(diǎn)(Blob):參考上帝對(duì)象(God object)
* 氣體工廠(Gas factory):復(fù)雜到不必要的設(shè)計(jì)
* 輸入問(wèn)題(Input kludge):無(wú)法指出和實(shí)現(xiàn)對(duì)不正確的輸入的處理
* 接口膨脹(Interface bloat):把一個(gè)接口做得過(guò)于強(qiáng)大以至于極其難以實(shí)現(xiàn)
* 魔力按鍵(Magic pushbutton):直接在接口的代碼里編寫(xiě)實(shí)現(xiàn)柏锄,而不使用抽象
* 競(jìng)爭(zhēng)危機(jī)(Race hazard):無(wú)法知道事件在不同順序下發(fā)生時(shí)產(chǎn)生的結(jié)果
* 鐵軌方案(Railroaded solution):由于沒(méi)有預(yù)見(jiàn)和在設(shè)計(jì)方面欠缺靈活性,提出的方
案即使很爛复亏,也成了唯一選擇
* 重復(fù)耦合(Re-coupling):不必要的對(duì)象依賴
* 煙囪系統(tǒng)(Stovepipe system):根本就不能維護(hù)的被病態(tài)的組合在一起的組件
* (Staralised schema):指這樣的數(shù)據(jù)庫(kù)方案趾娃,包含了兩種用途的表,一是通用的蜓耻,另
一種是有針對(duì)性的
[1.5.1 面向?qū)ο笤O(shè)計(jì)的反面模式]
* 貧血的域模型(Anemic Domain Model):僅因?yàn)槊總€(gè)對(duì)象都要有屬性和方法茫舶,而在使用
域模型的時(shí)候沒(méi)有加入非OOP的業(yè)務(wù)邏輯
* (BaseBean):繼承一個(gè)工具類,而不是代理它
* 調(diào)用父類(Call super):需要子類調(diào)用父類被重載的方法
* 圓還是橢圓問(wèn)題(Circle-ellipse problem):基于變量的子類化關(guān)系進(jìn)行子類化(原句
是Subtyping variable-types on the basis of value-subtypes)
* 空子類的錯(cuò)誤(Empty subclass failure):創(chuàng)建不能通過(guò)“空子類測(cè)試”的類刹淌,因?yàn)樗?/p>
和直接從它繼承而來(lái)沒(méi)有做其它任何修改的子類表現(xiàn)得不同
* 上帝對(duì)象(God object):在設(shè)計(jì)的單一部分(某個(gè)類)集中了過(guò)多的功能
* 對(duì)象糞池(Object cesspool):復(fù)用那些不滿足復(fù)用條件的對(duì)象
* 不羈的對(duì)象(Object orgy):沒(méi)有成功封裝對(duì)象,外部可以不受限制地訪問(wèn)它的內(nèi)部
* 幽靈(Poltergeists):指這樣一些對(duì)象讥耗,它們唯一的作用就是把信息傳給其它對(duì)象
* 順序耦合(Sequential coupling):指這樣一些對(duì)象有勾,它們的方法必須要按某種特定順
序調(diào)用
* 單例愛(ài)好者(Singletonitis):濫用單例(singleton)模式
* 又TMD來(lái)一層(Yet Another Fucking Layer):向程序中添加不必要的層次結(jié)構(gòu)、庫(kù)或是
框架古程。自從第一本關(guān)于編程的模式的書(shū)出來(lái)之后這就變得很普遍蔼卡。
* 唷唷問(wèn)題(Yo-yo problem):一個(gè)結(jié)構(gòu)(例如繼承)因?yàn)檫^(guò)度分裂而變得難于理解
[1.6 編程方面的反面模式]
* 意外的復(fù)雜度(Accidental complexity):向一個(gè)方案中引入不必要的復(fù)雜度
* 積累再開(kāi)火(Accumulate and fire):通過(guò)一系列全局變量設(shè)置函數(shù)的參數(shù)
* 在遠(yuǎn)處行動(dòng)(Action at distance):意料之外的在系統(tǒng)分離的部分之間迭代
* 盲目信任(Blind faith):缺乏對(duì)bugfix或子函數(shù)返回值的正確性檢查
* 船錨(Boat anchor):在系統(tǒng)中保留無(wú)用的部分
* bug磁鐵(Bug magnet):指很少被調(diào)用以至于最容易引起錯(cuò)誤的代碼,或是易出錯(cuò)的構(gòu)
造或?qū)嵺`
* 忙循環(huán)(Busy spin):在等待的時(shí)候不斷占用CUP挣磨,通常是因?yàn)椴捎昧酥貜?fù)檢查而不是適
當(dāng)?shù)南C(jī)制
* 緩存失敼统选(Caching failure):錯(cuò)誤被修正后忘記把錯(cuò)誤標(biāo)志復(fù)位
* 貨運(yùn)崇拜編程(Cargo cult programming):在不理解的情況下就使用模式和方法
* 檢查類型而不是接口(Checking type instead of interface):僅是需要接口符合條件
的情況下卻檢查對(duì)象是否為某個(gè)特定類型∽氯梗可能導(dǎo)致空子類失敗
* 代碼動(dòng)力(Code momentum):過(guò)于限制系統(tǒng)的一些部分塘砸,因?yàn)樵谄渌糠址磸?fù)對(duì)這部分
的內(nèi)容做出假設(shè)
* 靠異常編程(Coding by exception):當(dāng)有特例被發(fā)現(xiàn)時(shí)才添加新代碼去解決
* 隱藏錯(cuò)誤(Error hiding):在顯示給用戶之前捕捉到錯(cuò)誤信息,要么什么都不顯示晤锥,要
么顯示無(wú)意義的信息
* 異常處理(Expection handling):使用編程語(yǔ)言的錯(cuò)誤處理系統(tǒng)實(shí)現(xiàn)平常的編程邏輯
* 硬編碼(Hard code):在實(shí)現(xiàn)過(guò)程中對(duì)系統(tǒng)環(huán)境作假設(shè)
* 熔巖流(Lava flow):保留不想要的(冗余的或是低質(zhì)量的)代碼掉蔬,僅因?yàn)槌ミ@些代
碼的代價(jià)太高或是會(huì)帶來(lái)不可預(yù)期的結(jié)果
* loop-switch序列(Loop-switch sequence)使用循環(huán)結(jié)構(gòu)來(lái)編寫(xiě)連續(xù)步驟而不是switch
語(yǔ)句
* 魔幻數(shù)字(Magic numbers):在算法里直接使用數(shù)字廊宪,而不解釋含義
* 魔幻字符串(Magic strings):直接在代碼里使用常量字符串,例如用來(lái)比較女轿,或是作
為事件代碼
* 猴子工作(Monkey work):指在一些代碼復(fù)用性或設(shè)計(jì)上很差的項(xiàng)目中的反復(fù)出現(xiàn)的支
持性的代碼箭启。通常會(huì)被避免或是匆忙完成,因此易于出錯(cuò)蛉迹,有可能會(huì)很快變?yōu)閎ug磁鐵傅寡。
* Packratting:由于長(zhǎng)時(shí)間不及時(shí)釋放動(dòng)態(tài)分配的內(nèi)存而消耗了過(guò)量的內(nèi)存
* 類似保護(hù)(Parallel protectionism):隨著代碼變得復(fù)雜和脆弱,很容易就克隆出一個(gè)
類似的的結(jié)構(gòu)北救,而不是直接往現(xiàn)有的結(jié)構(gòu)中添加一些瑣碎的屬性
* 巧合編程(Programming by accident):嘗試用試驗(yàn)或是出錯(cuò)的方式解決問(wèn)題赏僧,有時(shí)是
因?yàn)楹軤€的文檔或是一開(kāi)始就沒(méi)把東西搞清楚
* 餛飩代碼(Ravioli code):系統(tǒng)中有許多對(duì)象都是松散連接的
* 軟代碼(Soft code):在配置文件里保存業(yè)務(wù)邏輯而不是在代碼中
* 面條代碼(Spaghetti code):指那些結(jié)構(gòu)上完全不可理解的系統(tǒng),尤其是因?yàn)檎`用代碼
結(jié)構(gòu)
* 棉花里放羊毛(Wrapping wool in cottom):常見(jiàn)的情況是某些類的方法只有一行扭倾,就
是調(diào)用框架的代碼淀零,而沒(méi)有任何其它有用的抽象
[1.7 方法學(xué)上的反面模式]
* 拷貝粘貼編程(Copy and paste programming):拷貝(然后修改)現(xiàn)有的代碼而不是假
造通用的解決方案
* 拆除(De-factoring):去掉功能,把它轉(zhuǎn)化成文檔的過(guò)程
* 黃金大錘(Golden hammer):認(rèn)為自己最喜歡的解決方案是到處通用的(見(jiàn):銀彈)
* 未必有之事(Improbability factor):認(rèn)為已知的錯(cuò)誤不會(huì)出現(xiàn)
* 低處的果子(Low hanging fruit):先處理更容易的問(wèn)題而忽略更大更復(fù)雜的問(wèn)題膛壹。這
個(gè)問(wèn)題有些類似于這種情況:科學(xué)驾中、哲學(xué)和技術(shù)上的發(fā)現(xiàn)在早期都比較容易得到,一旦問(wèn)
題已經(jīng)被人研究過(guò)了模聋,再要有所創(chuàng)新就難了
* 不是這里做的(Not built here):見(jiàn)“重新發(fā)明輪子”肩民、“不是這里發(fā)明的”
* 不成熟的優(yōu)化(Premature optimization):在編碼的早期追求代碼的效率,犧牲了好的
設(shè)計(jì)链方、可維護(hù)性持痰、有時(shí)甚至是現(xiàn)實(shí)世界的效率
* 轉(zhuǎn)換編程法(Programming by permutation):試圖通過(guò)連續(xù)修改代碼再看是否工作的方
式來(lái)解決問(wèn)題
* 重新發(fā)明方的輪子(Reinventing the square wheel):已經(jīng)有一個(gè)很好的方案了,又再
搞一個(gè)爛方案來(lái)替代它
* 重新發(fā)明輪子(Reinventing the wheel):無(wú)法采納現(xiàn)有的成熟的方案
* 銀彈(Silver bullet):認(rèn)為自己最喜歡的技術(shù)方案能解決一個(gè)更大的問(wèn)題
* 測(cè)試人員驅(qū)動(dòng)開(kāi)發(fā)(Tester driven development):軟件工程的需求來(lái)自bug報(bào)告
[1.8 測(cè)試反面模式]
* 敵意測(cè)試(hostile testing):對(duì)抗實(shí)際的開(kāi)發(fā)方案祟蚀,使用過(guò)量的測(cè)試
* 自身測(cè)試(Meta-testing):過(guò)度設(shè)計(jì)測(cè)試過(guò)程以至于它本身都需要測(cè)試工窍,也被稱為“看
門人的看門人”
* 移動(dòng)標(biāo)的(Moving target):連續(xù)修改設(shè)計(jì)和實(shí)現(xiàn)從而逃避現(xiàn)現(xiàn)有的測(cè)試過(guò)程
* 奴隸測(cè)試(Slave testing):通過(guò)發(fā)匿名電郵或賄賂的方式控制測(cè)試人員,從而達(dá)到股
東的要求
[1.9 配置管理反面模式]
* 依賴的地獄(Dependency hell):需要的產(chǎn)品的版本導(dǎo)致的問(wèn)題
* 路徑地獄(Classpath hell):和特定庫(kù)有關(guān)的問(wèn)題前酿,例如依賴關(guān)系和要滿足程序運(yùn)行
所需的版本
* 擴(kuò)展沖突(Extension conflict):蘋果系統(tǒng)在Mac OS X版本之前的不同擴(kuò)展的問(wèn)題
* DLL地獄(DLL hell):不同版本帶來(lái)的問(wèn)題患雏,DLL可見(jiàn)性和多版本問(wèn)題,在微軟的
Windows上尤為突出
* JAR地獄(JAR hell):JAR文件不同版本或路徑帶來(lái)的問(wèn)題罢维,通常是由于不懂類加載模
型導(dǎo)致的