2012-01-31 19 views
4

我正在創建一個調度算法。我的代碼變得很長。任何人都可以建議我怎樣才能讓我的代碼更短,因爲我必須在下面多次重複相同的事情,而外部的其他位置是4或5,我必須重複更多:我可以簡化這個VB.net代碼嗎,所以我不必重複這麼多?

下面是我的部分示例代碼:

ElseIf Val(jobs_txt.Text) = 3 Then 
      If (a < b And b < c) Then 
       awt1_lbl.Text = Val(0) 
       awt2_lbl.Text = a 
       awt3_lbl.Text = a + b 
       y = (Val(awt1_lbl.Text) + Val(awt2_lbl.Text) + Val(awt3_lbl.Text))/3 
       awt_ans.Text = y 
      ElseIf (a < c And c < b) Then 
       awt1_lbl.Text = Val(0) 
       awt2_lbl.Text = a + b 
       awt3_lbl.Text = a 
       y = (Val(awt1_lbl.Text) + Val(awt2_lbl.Text) + Val(awt3_lbl.Text))/3 
       awt_ans.Text = y 
      ElseIf (b < a And a < c) Then 
       awt1_lbl.Text = a 
       awt2_lbl.Text = Val(0) 
       awt3_lbl.Text = a + b 
       y = (Val(awt1_lbl.Text) + Val(awt2_lbl.Text) + Val(awt3_lbl.Text))/3 
       awt_ans.Text = y 
      ElseIf (b < c And c < a) Then 
       awt1_lbl.Text = a + b 
       awt2_lbl.Text = Val(0) 
       awt3_lbl.Text = a 
       y = (Val(awt1_lbl.Text) + Val(awt2_lbl.Text) + Val(awt3_lbl.Text))/3 
       awt_ans.Text = y 
      ElseIf (c < a And a < b) Then 
       awt1_lbl.Text = a 
       awt2_lbl.Text = a + b 
       awt3_lbl.Text = Val(0) 
       y = (Val(awt1_lbl.Text) + Val(awt2_lbl.Text) + Val(awt3_lbl.Text))/3 
       awt_ans.Text = y 
      ElseIf (c < b And b < a) Then 
       awt1_lbl.Text = a + b 
       awt2_lbl.Text = a 
       awt3_lbl.Text = Val(0) 
       y = (Val(awt1_lbl.Text) + Val(awt2_lbl.Text) + Val(awt3_lbl.Text))/3 
       awt_ans.Text = y 
      End If 
+0

開始通過解釋你的代碼做什麼,那麼我們也許能夠幫助... – 2012-01-31 14:40:19

+0

我有一個用戶可以輸入該程序將有多少職位處理文本框。該文本框將只允許2到5的值。當用戶單擊輸入時,他在文本框中輸入的作業數將出現在列表框中。我還有5個文本框將根據用戶輸入的作業數量啓用。在這些文本框中,用戶需要輸入運行時值。我希望獲得平均等待時間和平均週轉時間,而不必對工作號碼和運行時間進行排序。提前致謝。 – 2012-01-31 14:46:25

+3

這應該被遷移到http://codereview.stackexchange.com/。它不符合SO的範圍以及代碼審查的範圍。 – Incognito 2012-01-31 14:47:20

回答

3

是的,有幾件事情,你可以做:

  • y計算是在任何情況下是相同的,所以您不必重複。
  • 最後ElseIf永遠是真實的,所以只需使用一個Else
  • 使用Val(0)會造成大量的隱式轉換的,它實際上將最終被CStr(Val(Cstr(0))),所以只需使用"0"

代碼:

ElseIf Val(jobs_txt.Text) = 3 Then 
    If (a < b And b < c) Then 
    awt1_lbl.Text = "0" 
    awt2_lbl.Text = a 
    awt3_lbl.Text = a + b 
    ElseIf (a < c And c < b) Then 
    awt1_lbl.Text = "0" 
    awt2_lbl.Text = a + b 
    awt3_lbl.Text = a 
    ElseIf (b < a And a < c) Then 
    awt1_lbl.Text = a 
    awt2_lbl.Text = "0" 
    awt3_lbl.Text = a + b 
    ElseIf (b < c And c < a) Then 
    awt1_lbl.Text = a + b 
    awt2_lbl.Text = "0" 
    awt3_lbl.Text = a 
    ElseIf (c < a And a < b) Then 
    awt1_lbl.Text = a 
    awt2_lbl.Text = a + b 
    awt3_lbl.Text = "0" 
    Else 
    awt1_lbl.Text = a + b 
    awt2_lbl.Text = a 
    awt3_lbl.Text = "0" 
    End If 
    y = (Val(awt1_lbl.Text) + Val(awt2_lbl.Text) + Val(awt3_lbl.Text))/3 
    awt_ans.Text = y 

其實,如果值沒有被轉換爲字符串,然後返回到數字,你可以簡單地計算y這樣的:

y = (a * 2 + b)/3 
+0

a,b,c都是唯一的數字嗎?如果'a = b'或'a = c'怎麼辦? – jon 2012-01-31 14:48:08

+0

@jonlester:好點。我認爲他們是。我不知道代碼是否有意義,如果它們不是唯一的... – Guffa 2012-01-31 14:53:39

+0

OP已經證實它們是....我會保持我的鼻子! – jon 2012-01-31 14:54:41

3

首先,看起來你可以移動最後兩行

y = (Val(awt1_lbl.Text) + Val(awt2_lbl.Text) + Val(awt3_lbl.Text))/3 
awt_ans.Text = y 

以外的if-then-else,因爲他們在所有六種情況下做同樣的事情。

接下來,因爲它看起來像你的代碼分配瓦爾(0)與最小的關鍵,a+b在中間值的項目,a到最大的一個,你可以把abc在鍵陣列,awt1_lblawt2_lb,和awt3_lbl入值的陣列,並且對它們進行排序,例如:

Dim keys() As String = { a, b, c } 
Dim labels() As LabelType = { awt1_lbl, awt2_lb, awt3_lbl } // put real label type there 
Array.Sort(keys, labels) 
labels(0).Text = Val(0) 
labels(1).Text = a+b 
labels(2).Text = a 
+0

@downvoter你能解釋一下你的投票嗎?這個答案將OP的代碼縮小到僅僅八行,這種方法可能會出錯? – dasblinkenlight 2012-01-31 16:13:35

+0

-1,因爲它不會使用嚴格選項進行編譯,或者可能會導致錯誤的結果(concattening字符串,而不是添加數字)。此外,這種方法可能是最短的,但不可重複使用,可保存或可擴展。它可能在今天工作,但在邏輯(或視圖)發生變化時並不是明天。 – 2012-01-31 16:14:31

+1

@TimSchmelter這不是*代碼*,這是*方法*的一個例子。由用戶決定他的編譯選項,以及如何處理這些數字。就可維護性或可擴展性而言,請給我一個休息時間:基於*標準* .NET庫的**八行**代碼如何不易維護,可重用性較差或以其他方式遜色於具有**四十個**的程序完全自定義代碼的行?附:在主觀意見上下調一個相互競爭的答案總是**是一種輕率的練習,沒有例外。 – dasblinkenlight 2012-01-31 16:24:18

-1

除了其他的答案,這:

If (a < b And b < c) Then 

應該是一樣的:

If (a < b < c) Then 

爲您節省幾個大字!

編輯:MetaKnight是對的,這是無效的語法。但編譯器不抱怨,我不知道它做了什麼。

+0

是的,我創建的程序要求a,b,c,d和e都是唯一的編號。感謝您提出最後一部分。 – 2012-01-31 14:53:12

+0

歡迎您 – jon 2012-01-31 14:53:42

+0

呵呵,這不是有效的語法 – 2012-01-31 15:01:47

1

你應該做一個類的話,那麼它更易於閱讀,再使用維護和擴展:

Dim awt = New AWT(a, b, c) 
awt1_lbl.Text = awt.GetAWT1().ToString 
awt2_lbl.Text = awt.GetAWT2().ToString 
awt3_lbl.Text = awt.GetAWT3().ToString 
awt_ans.Text = awt.GetY().ToString 

這裏是一個可能的實現,我將它Option Strict,以便它可以很容易地被翻譯到C#並且也不太容易出錯。

Public Class AWT 
    Public Property A As Int32 
    Public Property B As Int32 
    Public Property C As Int32 

    Public Sub New(a As Int32, b As Int32, c As Int32) 
     Me.A = a 
     Me.B = b 
     Me.C = c 
    End Sub 

    Public Function GetY() As Int32 
     Return GetAWT1() + GetAWT2() + GetAWT3() 
    End Function 

    Public Function GetAWT1() As Int32 
     If (A < B AndAlso B < C) OrElse (A < C AndAlso C < B) Then 
      Return 0 
     ElseIf (B < A AndAlso A < C) OrElse (C < A AndAlso A < B) Then 
      Return A 
     Else 
      Return A + B 
     End If 
    End Function 

    Public Function GetAWT2() As Int32 
     If (A < B AndAlso B < C) OrElse (C < B AndAlso B < A) Then 
      Return A 
     ElseIf (A < C AndAlso C < B) OrElse (C < A AndAlso A < B) Then 
      Return A + B 
     Else 
      Return 0 
     End If 
    End Function 

    Public Function GetAWT3() As Int32 
     If (A < B AndAlso B < C) OrElse (B < A AndAlso A < C) Then 
      Return A + B 
     ElseIf (A < C AndAlso C < B) OrElse (B < C AndAlso C < A) Then 
      Return A 
     Else 
      Return 0 
     End If 
    End Function 

End Class 
+0

使用班級是個好主意,但我不認爲所有這些If/ElseIf都是非常必要的。請參閱dasblinkenlight的答案。 – 2012-01-31 15:16:03

+0

條件可能會改變,除此之外我不知道背後的邏輯。因此,如果沒有更多的信息,我寧願在封裝複雜性的單獨類中使用方法。除了那些都是整數而不是字符串,所以dasblinkenlight的方法甚至不會使用嚴格選項進行編譯。 OP不想連接字符串,而是添加數字。 – 2012-01-31 15:22:09