2012-10-15 20 views
4

作爲上this website描述,將順序內聚轉化爲功能內聚?

與(僅)程序凝聚力是一個支撐不同的,可能不相關的活動,其中,控制從一個活動到下一個道次的模塊。頁 - 瓊斯給出了(一個模塊的例子,其名稱可能是這樣的,``準備節日大餐:「」

  • 清潔用具從以前的膳食
  • 準備土耳其烤
  • 製作電話呼叫
  • 採取淋浴
  • 扒蔬菜
  • 將表

現在的問題是,如果每個這些活動,即進行電話呼叫,提取到自己的方法,但它們仍然都被稱爲在相同的順序 即

private void PrepareForHolidayMeal() 
    { 
    CleanUtensilsfromPreviousMeal(); 
    PrepareTurkeyforRoasting(); 
    ... 
    SetTable(); 
    } 

是這種方法仍然是一個例子程序凝聚力?還是它在功能上具有內聚性,因爲它支持執行一個問題相關任務的活動,在這種情況下,準備吃飯?

回答

1

由於充分的原因,您的示例中的電話被省略。這是無關的任務之一。如果你認爲電話仍然在「......」,那麼整個事情就會再次失去凝聚力。否則,你可能會爭辯說,所有其他活動都是準備膳食所必需的。這可能會開始討論「CleanUtensilsfromPreviousMeal」在這裏實際上是否有效,因爲此活動可能僅在之前沒有清理的情況下是必需的。 StackExchange的問題不適合這樣的討論......所以我們需要一個更清晰的例子來讓決策得到多個軟件架構師的同意。否則有些人可能會與其他人爭辯不同。

+0

我明白你的意思是關於cleanUtensils和makePhoneCall的有效性。我的問題的重點不在於與方法本身的實際內容有關,而在於主要的prepareHolidayMeal方法的結構。即假設所有的操作都是有效的和必要的,將它們移入他們自己的方法是否會將內聚的類型從程序變爲功能? – x1886x

+0

凝聚力意味着「粘在一起」 - 如果你解開它們,事情會更好。一旦你再次開始捆綁,你需要小心。您仍然可以創建至少有幫助的新捆綁包。後續問題可能是信息隱藏被破壞了。所以你需要一個很好的平衡。 –

1

這是一個非常有趣的問題,是的,答案是相對的,取決於我們理解[寫在文章中]的方式以及它們與作者意思相對應的方式。

特別是程序性和功能性內聚之間存在一些細微差別:程序性內聚是包含彼此無關的步驟的東西,即對於程序來說沒有「目標」,它是可重複的並且需要使它「固定定義「並重新使用。而功能內聚力基本上是一個功能(可能接受輸入並給出輸出),它可以用於不同的輸入,並在重新使用時產生正確的輸出(取決於輸入)。

結論,根據你的問題:不,將每個方法放在不同的方法中,並按照相同的順序調用它們不會將其從程序變爲功能,除非你的過程成爲一個真正具有某個「目標」的函數。