2016-04-15 64 views
0

我有3個類:服務,客戶端和混亂(我應該以某種方式重構)。如何將變量關聯到對象並返回它們?

Class Service { 

    void servicemethod(int a, int b, int c) 
    { 
     //does something with params a, b and c 
    } 
} 

我這就要求從相同的混亂兩種方法的客戶端類

Class Client { 

    main() 
    { 
     Mess.setABC(x) 
     Mess.callintermediatemethod(int x) 
    } 
} 

殘局類什麼也不做,但讀PARAMS A,B和C,這與鍵「X」相關的值在一個文件中,並且調用Service.servicemethod(a, b, c)

Class Mess { 

    static void setABC(int x) 
    { 
     //sets static params a, b and c with values read from json file that has x as its key 
    } 

    void callIntermediatemethod(x) 
    { 
     Service.servicemethod(a, b, c); 
     //here x parameter is not even necessary since it already knows what A, B and C are. 
    } 
} 

很明顯,Mess類做了兩件事。在讀取x之後設置靜態變量,並使用存儲的值調用service方法,並使用僞參數。這顯然是糟糕的設計。但是,如果我決定消除混亂,如何設置參數a,b,c給定變量x?我應該將它們與對象關聯嗎?裝飾他們?使用構建器模式還是依賴注入?如何清理混亂並讓客戶端類直接調用服務方法而不必通過Mess?

+0

除非您有一個令人信服的理由證明靜態需求,否則您應該更喜歡使用非靜態方法和類實例變量。一般來說,你對Mess課程有什麼不好的設計。花一些時間閱讀並利用面向對象的設計。 – pczeus

回答

0

從你寫的,你只使用靜態方法。您應該使用beans與依賴注入框架(如spring)。你可能需要一個包含ABC的類。創建一個特定的bean用於讀取將從您的x返回ABC的XML。那麼你應該直接打電話給你的Service.servicemethod(myAbc);

因此,這將不會停喜歡(我用類和對象不同的名稱,你也應該這麼做,因爲它是一點點在你的僞代碼混淆):

public class Client{ 

    @Service("myXmlReader") //Spring service annotation 
    MyXmlReader xmlRdr; 

    @Service("myService") 
    MyService srvce; 

    int main(){ 
     int x = 12; 
     MyABC abc= xmlRdr.readAbcFromX(x); 
     srvce.serviceMethod(abc); 
    } 
    public class MyABC(){ //Shouldn't be an inner class but you get the idea 
    int a; int b; int c; 
    //getters and setters ... 
    } 
} 

這就是一個例子,這就是我對當前項目的看法,但它不必如此複雜。例如,您可能只需要將MyXmlReader作爲一個單例,或者只是將其作爲一個new,具體取決於它的功能和需求。 MyService同樣的事情。所以你不需要使用Spring。

依賴注入是你需要的,但首先你需要從你的混亂中分離邏輯,然後在需要時使用每個單元(哪個類從文件讀取,從數據庫讀取,寫入文件,處理業務邏輯,只包含數據,從外部調用等)。

您還提到了「如何設置上下文參數a,b,c給定變量x」,這非常模糊。爲什麼b c會與上下文鏈接?

+0

a,b,c是與x關聯的參數。 「上下文」一詞是字面用法。刪除。 :) – Tania

相關問題