2014-01-09 70 views
0

我已經編寫了一個應用程序,用於檢查多個POS設備(計算機)是否聯機並回復到網絡ping然後顏色取決於ping響應,相應的矩形爲紅色或綠色。它有10條「線路」,每條線路能夠顯示主服務器和多達60個POS設備以及可以填充站點號碼的文本框。然後,當你點擊開始時,它將讀取2個.ini文件來查找站點IP方案和設備數量以及它們的地址,以便每個設備都可以進行pung(或ping通)。我附上了應用程序的截圖,這可能有助於解釋我做了什麼?!類中的代碼太多,但不知道如何去減少它

然後,我可以使用我的應用程序查看一個或多個網站上的計算機是否在線,例如,如果我運行遠程升級到計算機,我可以看到它們都停止回覆(框變紅)並重新開始(箱子再次變綠),那麼一旦所有更新都完成並且所有計算機都重新啓動,我可以輕鬆地判斷出來。我的問題是我的代碼太長(IMO),可能不如它的效率(60k行!)。

對於10行中的任何一行或全部行,除了對象和變量名等外,每行後面的代碼是相同的(即第一個'回覆'矩形被稱爲'rectSt1Pos1'(意思是矩形形狀 - 商店1 - 位置1 ),然後'rectSt1Pos2'等等等等直到'... Pos60',並且對所有10行重複(最後是'rectSt10Pos60'))。這意味着我必須繪製610個單獨的盒子(因爲我不太自信地動態繪製它們),並且我對此感到滿意,但是我已經完成了諸如在課程開始時初始化所有變量的事情(沒有分配值),但超過1200行只是爲每個可能的設備都有一個成功和失敗應答計數器(10個站點,每個站點有一個主服務器,每個站點最多60個POS,每個設備一個成功和一個失敗計數器= 1220 int值來存儲ping計數!)

好的,所以這對於應用程序的解釋已經足夠了,至於我的問題,即我的應用程序代碼(大部分是在單個類中我唯一擁有的其他課程是閱讀ini文件))約有60,000行(是的六萬!)。這基本上是我認爲應該達到的10倍,我相信我應該能夠減少這個,但是我不知道如何開始思考重構代碼!!

此外,我認爲我應該能夠執行所有的操作,可以調用的泛型類或方法中的每一行,但我不知道如何做到這一點,因爲每一行矩形和地址等。是不同的,需要更新跨線程(我;與跨線程確定))

因此,總之,沒有人有任何關於如何減少代碼大小的建議?也許可以有60000行以上的類,編譯時的應用程序大約是1.8Mb,並且使用大約40Mb的內存,15-25個線程和400-1100個句柄......這是可接受的開銷嗎?

任何意見,意見或幫助與此將不勝感激。我還可以發佈代碼片段,如果它有幫助,並且屏幕截圖尚未發佈(因爲我沒有足夠的聲譽點)。如果需要,我可以在其他地方託管。

您的時間非常感謝,請問如果有什麼不太清楚(但不要說這一切,哈哈!)

乾杯,

丹。

+0

哪種語言? –

+0

對不起,我剛剛看到此評論!,我正在使用C#:) – RatMonkey

+0

您將獲得更多幫助(我使用C#標記標記了您的問題) –

回答

2

您需要使用子程序:

  • 一個 「手柄線」 子程序
  • 一個 「處理裝置」 子程序

調用 「手柄線」 子程序10倍。

每行調用「句柄設備」子程序60次。

不要複製和粘貼相同的代碼:在複製和粘貼的行周圍使用extract method,以便它們只出現一次(在子例程中)而不是被複制。

像這樣:

class Device 
{ 
    // device properties here 
    int deviceState; 
} 

class Line 
{ 
    // line properties here 
    int lineState; 
    // devices associated with this line 
    Device[] devices; 
    // constructor 
    Line() 
    { 
    devices = new Device[60]; 
    } 
} 

class Main 
{ 
    List[] lines; 
    Main() 
    { 
    lines = new Lines[10]; 
    for(int i = 0; i < 10; ++i) 
     HandleLine(i, line[i]); 
    } 
    void HandleLine(int lineNumber, Line line) 
    { 
    // get line status 
    line.status = getLineStatus(lineNumber); 
    // handle devices on this line 
    for(int i = 0; i < 60; ++i) 
     HandleDevice(lineNumber, i, line.devices[i]); 
    } 
    void HandleDevice(int lineNumber, int deviceNumber, Device device) 
    { 
    // get device status 
    device.status = getDeviceStatus(lineNumber, deviceNumber); 
    } 
} 

以上是僞代碼來說明輔助類(線路和設備)。使用C#你可能想使用System.Collections.Generic.List而不是數組。

此外,HandleLine功能可能是Line而不是Main的方法。它甚至可能是Line類的構造函數。

+0

感謝您的回覆:) - 好吧,子例程「是在同一個類中的另一種方法嗎? - 因爲如果我在一些子例程中添加初始化變量(字段),將其從「當前上下文」中刪除,並在其中更新所述變量並導致錯誤......這是否意味着它們必須在方法? – RatMonkey

+0

噢,我明白了,例如,如果我想改進前面提到的ping計數器,而不是在我的主類的頂部初始化1220個int變量,我可以創建一個新的類,我將其稱爲pingCounter,然後添加像這樣的公共屬性:public static int st1MfsCountSucc {get;組; }爲每個計數器我想初始化並添加'pingCounter'。在任何引用主類中的這些計數器的前面?... – RatMonkey

+0

@RatMonkey確切地說,是的,類似的東西(很難在沒有看到代碼的情況下提供更多細節)。 – ChrisW

1

一個文件中有60,000多行! 使用方法/函數/子程序/宏來抽象輸入和輸出。

也考慮使用循環,而不是重複相同的命令,如果參數與某些邏輯不同(例如每次+1)。

+0

我想做一些循環來聲明字段/變量,但我不知道如何(如果有的話)我可以從現有字符串聲明一個變量名稱。即'int st [第一個循環計數圖] Pos [第二個循環計數圖] Succ'文字包含方括號[]是從調用循環傳遞的int變量...? – RatMonkey

+0

請將編程語言添加到您的問題/描述中。 –

+0

@RatMonkey你要找的東西叫做「[數組](https://www.google.com/search?q=c%23+array)」(或者在C#中人們經常使用[所謂的請列出](https://www.google.com/search?q=c%23+list))。 – ChrisW