2012-01-31 43 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