2010-10-01 60 views
1

是否有任何工具可以擴展面向對象的代碼,因此不存在任何共享?例如,如果我有兩個繼承C的類A和B,那麼該工具將調整類A和B以不再使用C.如果該工具執行此操作並且它仍然編譯並生成相同的結果,那麼也會很好。我認爲主要的難點在於如果動態地檢查類類型,就要調整任何條件邏輯。展開面向對象的代碼

我知道從機器的角度來看這完全沒有意義,但這將是一個有趣的學術練習。

+0

這聽起來像是重新分解相反。這可能是可能的,但是*你爲什麼想要*? – FrustratedWithFormsDesigner 2010-10-01 20:38:29

+0

如果沒有意義,你可能不應該期待一個預先存在的工具。這意味着如果你喜歡學術方面,你可能必須自己實施這樣的工具。你需要一個完整的編譯器爲前端提供的所有東西。 – 2010-10-04 04:07:03

+0

看到一個簡短的Hello World例子變成一個100K的LOC怪物會不會很有趣? :) – Telavian 2010-10-04 17:50:17

回答

2

雖然有各種各樣的重構工具,但我懷疑你的問題具有實際應用,因爲它需要大量的上下文知識和人工干預來執行這種自動操作。

在你的例子中,A和B獲得C的方法和屬性還不夠,但事實是在很多情況下,有一些地方你想把A(或B)交給一個方法並讓它處理就像一個C.或者,你可能想把它交給一個需要C的東西,但是調用A(或者B)的特定行爲---想象一個集合,它調用.DoThing()函數對其內部的任何對象進行調用。你不僅需要破解這些類,而且還要有各種其他重載函數以及大量冗餘代碼(尤其是類型,而不僅僅是行爲)。

我想說一個有趣的思想實驗,也許我們應該把它放在糟糕的想法堆中。我懷疑這會對可讀性,可擴展性或性能有所幫助。

+0

這可能會爲高年級課程提供一個有趣而又好的(或者不好的,如果你是學生實施的話)學術練習。 – FrustratedWithFormsDesigner 2010-10-01 20:42:50

+0

好點。我已經接受了商業應用。乾杯! – 2010-10-01 21:01:07

+0

是的,這沒有實際應用,但正如我所說這可能是一個有趣的項目。 – Telavian 2010-10-04 17:22:21

1

的問題,這是採用C而不是A或B是難以對付的代碼:

public void workWithSomeC(C useThis) { ... } 

在我們的面向對象的代碼,我們可以通過其中一個A或B至該功能。如果A和B不再有共同之處,就不能這樣做。

我想通過複製這種代碼的東西可以做工作,但良好的悲傷有什麼可怕的想法;-)

+0

如果你傳遞一個A或B到那個函數,你正在分割使A或B關閉的東西,並且失去所有的多態性。通常情況下,你應該通過const引用,比如'(const C&useThis)'。 – 2010-10-01 21:47:31

+0

@David是的,在C++中,不在Java中 - 在Java中,所有對象都通過引用傳遞。 – djna 2010-10-02 04:52:20

相關問題