“大家好,這是【產(chǎn)品線工程(PLE)專題】更新的第四篇,上一篇我們介紹了‘版本、變體和其他的基礎(chǔ)定義’,這一篇我們介紹特征模型和特征-這是什么”
非正式地談?wù)摽勺冃允呛苡腥さ囊患拢罱K還是需要以一種“標(biāo)準(zhǔn)”的方式來(lái)捕獲可變性的信息。在研究和工業(yè)界中有很多方法來(lái)捕獲可變性信息,其中較流行的方法被稱為特征建模。本文將對(duì)特征模型的基本概念進(jìn)行解釋,并且對(duì)于回答“什么是特征?”這個(gè)有趣的問(wèn)題給出一些提示。
? pure-systems GmbH
問(wèn)題空間的特征
簡(jiǎn)而言之,特征模型是簡(jiǎn)單的、分層的模型,其可以捕獲到產(chǎn)品線的共性和特異性。問(wèn)題空間(Problem Space)中的每個(gè)相關(guān)特性都會(huì)成為特征模型中的一個(gè)特征。這意味著,特征是系統(tǒng)中與利益攸關(guān)者(Stakeholder)相關(guān)特性。根據(jù)利益攸關(guān)者的利益不同,一個(gè)特征可以是一個(gè)需求、一個(gè)技術(shù)功能、一個(gè)功能組,或一個(gè)非功能(質(zhì)量)特征。壞消息是:特征模型是一個(gè)用于描述共性和特異性的抽象概念。需要為每條產(chǎn)品線單獨(dú)決定特征究竟是什么。不過(guò),特征的定義一般是與它們的實(shí)現(xiàn)是解耦的,即與解空間(Solution Space)解耦。
例如,如果汽車顏色是一個(gè)特征,其有個(gè)不錯(cuò)的名字“深海藍(lán)”。這個(gè)名字永遠(yuǎn)不會(huì)提到特定的油漆供應(yīng)商的訂單號(hào)。這是因?yàn)樘囟ǖ墓?yīng)商與其訂單號(hào)是存在于解空間的。對(duì)軟件來(lái)說(shuō)也是一樣的:特征是映射到單個(gè)功能還是分布在數(shù)十個(gè)組件中,是無(wú)關(guān)緊要的。如果利益攸關(guān)者認(rèn)為它是一個(gè)相干的屬性并且其代表了特異性,那么它就是一個(gè)特征。
特征樹(shù)和變形類型
特征模型有一個(gè)樹(shù)狀結(jié)構(gòu):特征構(gòu)成樹(shù)的節(jié)點(diǎn),可變性由節(jié)點(diǎn)之間的弧及其通過(guò)變形類型分到的組中表示(譯者注:特征是節(jié)點(diǎn),特征之間的關(guān)系是邊。特征的父節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn),每個(gè)特征都具有變形類型并且會(huì)按照變形特征分組)。目前在大多數(shù)特征建模方法中,有四種的變形類型可供選擇?!皬?qiáng)制”(Mandatory)、“可行”(Optional)、“多選一”(Alternative)、“或”(Or)。每個(gè)特征可以有多個(gè)具有不同變形類型的特征組作為子組(假設(shè)某個(gè)變形類型子組中特征總數(shù)為n)。在進(jìn)行某一個(gè)變體的特征選擇時(shí),規(guī)則為:當(dāng)一個(gè)父特征在該變體中被選擇時(shí),其子特征中:
???? 所有“強(qiáng)制”類的子特征必須被包含(n from n)
???? 選擇任何數(shù)量的“可選”類的子特征(m from n,0≤m≤n)
???? 必須從“多選一”類的子特征中準(zhǔn)確地選擇一個(gè)特征(1 from n)
???? 至少有1個(gè)類型為“或”類的子特征被選擇(m from n,m≥1)
顯然,所有這些術(shù)語(yǔ)(例如可選或多選一)都被映射到一個(gè)可以被有效選擇的特征組的上下限上(譯者注:可選,0≤m≤n,即上限n,下限0)。上述這四個(gè)特殊的例子是較常用的變形類型。一般來(lái)說(shuō),即使在沒(méi)有看到形式化的定義時(shí),也可以通過(guò)這些詞的概念正確的理解(除了“或”,因?yàn)槿藗兺ǔUJ(rèn)為它與“多選一”是同義的)。
當(dāng)層級(jí)結(jié)構(gòu)和變形類型還不夠的時(shí)候
???? 跨樹(shù)約束
大多數(shù)方法都允許您指定附加的約束,譬如特征之間的互斥關(guān)系(“正式襯衫”與“粉紅色”相沖突)以及需要關(guān)系(“正式襯衫”需要“白色”或“黑色”)。如果使用了多個(gè)特征模型,這些約束就會(huì)橫跨樹(shù)的不同層級(jí),甚至跨樹(shù)。根據(jù)不同的方法和工具,表達(dá)這種約束的語(yǔ)言可以是簡(jiǎn)單的專用語(yǔ)言或普遍可用的語(yǔ)言,如XPath或OCL。這些語(yǔ)言具有不同的表達(dá)能力和復(fù)雜性。但是,我們應(yīng)該少用這些約束語(yǔ)言,這是因?yàn)榧s束條件越多,用戶就越難可視化和理解模型中的關(guān)系。
???? 復(fù)用特征子樹(shù)
一些方法有特征基數(shù)的概念,其允許表達(dá)特征模型子樹(shù)的多重性規(guī)則。例如,如果您有一個(gè)系統(tǒng),其連接多個(gè)可配置的傳感器,那么不需要為每個(gè)傳感器創(chuàng)建一個(gè)(結(jié)構(gòu)相同的)特征子樹(shù),只需要?jiǎng)?chuàng)建一個(gè)特征子樹(shù),并給它一個(gè)類似于(1-3)的基數(shù)聲明來(lái)表示需要傳感器子樹(shù)至少配置一個(gè),最多配置三個(gè)。
特征模型的圖形化表達(dá)
對(duì)于特征模型的圖形符號(hào),目前還沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn),因此有許多不同的符號(hào),在文獻(xiàn)中,較常用的是原始FODA方法的圖形符號(hào)的擴(kuò)展形式。但是在標(biāo)準(zhǔn)文本工具和圖形庫(kù)中使用這種符號(hào)時(shí)會(huì)導(dǎo)致困難,這就是為什么我們中的一些人更喜歡更簡(jiǎn)單的符號(hào) - 就像我們?cè)趐ure::variants中使用方式的原因。
什么是好的特征模型?
通過(guò)上面給出的特征定義(比較抽象),幾乎所有的東西都可以作為一個(gè)特征。從某種意義上說(shuō),這確實(shí)是事實(shí)。接下來(lái)的問(wèn)題是:什么是特征?如何才能知道哪些要被選入特征模型?
比較重要的行動(dòng)是要明確特征模型是針對(duì)利益攸關(guān)者而制定的。如果特征被終端用戶用來(lái)定義他們所擁有的獨(dú)特的產(chǎn)品變體,顯然特征必須是容易理解的。一個(gè)很好的例子是在大多數(shù)汽車制造商在其網(wǎng)站上提供的汽車配置。除了特征名稱之外,特征模型的結(jié)構(gòu)也應(yīng)該遵循終端用戶的思路。雖然聽(tīng)起來(lái)很簡(jiǎn)單,但創(chuàng)建這樣一個(gè)結(jié)構(gòu)實(shí)際上是困難的?;蛘邍?yán)格的說(shuō),這是不可能的。
???? 特征模型結(jié)構(gòu)
創(chuàng)建一個(gè)結(jié)構(gòu)較完美的特征模型之所以如此困難,原因在于很多情況下,有不同的方法來(lái)對(duì)系統(tǒng)進(jìn)行配置。根據(jù)您的用戶類型,您可能要尋找一些小的、專業(yè)的功能,或者您可能要做一些一般性的決定,例如發(fā)動(dòng)機(jī)的類型和尺寸,汽車的顏色等等。雖然一個(gè)特征模型確實(shí)允許自由導(dǎo)航(它沒(méi)有規(guī)定選擇特征的具體順序),但更一般性的決定是傾向于更接近模型樹(shù)的根部的,這反過(guò)來(lái)又會(huì)引導(dǎo)用戶深入到樹(shù)的這個(gè)部分或那個(gè)部分。
???? 一個(gè)模型或幾個(gè)模型
如果有不同的利益攸關(guān)者有不同的“語(yǔ)言”怎么辦?我們是應(yīng)該建立多個(gè)特征模型(為每一組利益攸關(guān)者)還是只為重要的利益攸關(guān)者群體建立一個(gè)模型(誰(shuí)是重要的呢)?同樣,針對(duì)這個(gè)問(wèn)題給出一個(gè)明確的答案也是近乎不可能的。您使用的依賴關(guān)系越少,則模型越簡(jiǎn)單越好。對(duì)于許多產(chǎn)品線的應(yīng)用,使用一個(gè)特征模型是一個(gè)很好的選擇。然而,如果產(chǎn)品線的一部分本身形成了另一個(gè)獨(dú)立的產(chǎn)品線,那么多個(gè)特征模型幾乎是不可避免的。我們可以想象一下,一個(gè)在可配置的中間件上運(yùn)行的應(yīng)用。中間件的可變性必須使用應(yīng)用開(kāi)發(fā)者的語(yǔ)言來(lái)捕捉,并且應(yīng)該對(duì)所有使用改中間件的應(yīng)用使用相同的特征模型。在這種情況下,應(yīng)用領(lǐng)域的變量與中間件領(lǐng)域的變量之間必須有一個(gè)映射關(guān)系。創(chuàng)建這種映射是應(yīng)用產(chǎn)品線工程師的責(zé)任。在某些情況下,譬如中間件只在一個(gè)特定的配置中使用,因此可能沒(méi)有映射;在其他情況下,映射可能是非常復(fù)雜的。例如,如果應(yīng)用層提供了安全應(yīng)用操作和非安全應(yīng)用操作的選擇,那么只要選擇了“安全應(yīng)用操作”特征,中間件中的某些功能(如加密支持、基于證書(shū)的認(rèn)證和SSL支持)就必須被啟用--除非該應(yīng)用是為移動(dòng)電話設(shè)計(jì)的,因?yàn)樗恢С只谧C書(shū)的認(rèn)證。
???? 顆粒度
另一個(gè)需要考慮的方面是特征的顆粒度。如果特征的顆粒度太粗,有效配置的單個(gè)實(shí)例可能無(wú)法足夠詳細(xì)地描述系統(tǒng),進(jìn)而無(wú)法發(fā)揮預(yù)期作用;如果特征的粒度太細(xì),那么特征的數(shù)量就會(huì)增加,管理和維護(hù)這些特征的復(fù)雜性和工作量也會(huì)增加。再一次地,我們考慮一下背景信息:自動(dòng)產(chǎn)品配置比產(chǎn)品路線圖規(guī)劃和范圍需要更詳細(xì)的信息,同時(shí)也需要記得,后續(xù)增加細(xì)節(jié)比刪除細(xì)節(jié)更容易。
???? 迭代的方法
根據(jù)我的經(jīng)驗(yàn),如果要獲得一個(gè)好的特征模型,那么較簡(jiǎn)單的方法就是創(chuàng)建一個(gè),并嘗試用它來(lái)描述產(chǎn)品線中已知的/設(shè)想的產(chǎn)品變體。在大多數(shù)情況下,我們很快就會(huì)發(fā)現(xiàn)現(xiàn)有的一些決定并不是很明智:有時(shí)所選擇的特征并不能很好地描述可變性(細(xì)節(jié)水平),或者樹(shù)狀結(jié)構(gòu)是錯(cuò)誤的,例如,建模中特征B是特征A的子特征,但是事實(shí)上,您也希望能夠只選擇特征B而不是特征A。
不要怕,這些錯(cuò)誤有助于我們?cè)谙乱惠唲?chuàng)建更好的特征模型。在大多數(shù)情況下,有問(wèn)題的是結(jié)構(gòu)而不是特征本身。關(guān)于特征和特征模型,還可以寫很多,此時(shí)我們按下不表,在后續(xù)文章中將會(huì)介紹。
特征模型的局限性
還有一件事要提:雖然我確實(shí)認(rèn)為特征模型是描述產(chǎn)品線可變性的一種比較重要的技術(shù),但在某些情況下,僅僅靠特征模型是不夠的。甚至在某些情況下,特征模型根本不是可行的方法!如果可變性是組合類型,即有許多基本元素(想想用于建造房屋的磚石)可以按照一些正式規(guī)則進(jìn)行組合。這些規(guī)則允許使用潛在的無(wú)限數(shù)量的磚塊。那么在這種情況下,特征模型根本不允許您有效地描述這一點(diǎn)。然而,當(dāng)談到描述磚石的潛在屬性(顏色、磚材料等)時(shí),特征模型就非常適合用于描述可變性。這些只是為了表明:在很多情況下,特征模型只是可行的方法。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論