2017-07-24 67 views
0

我有一些交易行項目,我需要從這些訂單項生成未來的結算時間表。目前有四種不同類型的訂單項,每個訂單項生成邏輯都需要稍微不同的帳單生成邏輯。我預計未來會有更多類型的訂單項。超類應該實例化並調用它的子類嗎?

目前我有一個BillingScheduleGenerator類,它接受行項目列表,對行項目進行排序,從數據庫中檢索所需的配置信息,併爲每組行項目啓動正確的計費計劃生成邏輯。

問題是這個班變得很大。

我認爲最好的辦法就是讓這樣的系列子類:

BillingScheduleGenerator 

LineItemBillingScheduleGenerator extends BillingScheduleGenerator 

PurchaseLineItemBillingScheduleGenerator extends LineItemBillingScheduleGenerator 

CancellationLineItemBillingScheduleGenerator extends LineItemBillingScheduleGenerator 

... 

這種方式更具體的行項目發生器可以分享的越多總路線項目生成邏輯(每月按比例分配,獲取價格信息等),並且不需要共享的特定生成邏輯可以封裝在較小的類中。

所以我現在正在努力的問題是:我在哪裏放置對行項目進行排序並從數據庫檢索配置信息的邏輯?

它應該住在LineItemBillingScheduleGenerator超類中嗎?這將允許調用者使用行項目列表實例化LineItemBillingScheduleGenerator,調用單個方法,並接收計費計劃列表作爲回報。

超類實例化和調用它的每個子類是'錯誤的嗎?

我應該把排序和查詢邏輯放到服務方法中嗎?

+1

恕我直言:如果所有子類的生成邏輯是相同的,然後把它放在超類中。否則,把它放在每個子類中。當然,如果這個過程有共同的方面,那麼將其提取到可以進入超類的方法中。這樣,你避免了代碼重複。一個超類應該不依賴於任何子類!你甚至可以考慮讓你的超類'abstract' – jr593

+0

@ jr593謝謝!子類共享一些生成邏輯;他們還共享從數據庫中檢索的配置信息。由於在這個應用程序中檢索配置信息是昂貴的,我絕對不想爲每個子類的實例進行檢索。最好的方法是在靜態方法中檢索配置信息並將其傳遞給子類的每個實例? – bafuda

回答

0

超類可以實例化並調用其子類。在Java中,每個類的默認父類是對象類。默認情況下,每個類都擴展並繼承此Object類的屬性。也讀了關於Upcasting and downcastingInheritance。仔細閱讀這些基礎知識,你會得到一個關於它如何工作的好主意。

+0

問題是關於什麼是最佳實踐的問題 – bafuda

相關問題