一个类中的代码太多,但不知道如何减少它

时间:2014-01-09 16:30:15

标签: c# refactoring simplify

我已经编写了一个在工作中使用的应用程序,用于检查多个POS设备(计算机)是否在线并回复网络ping,然后根据ping响应为红色或绿色对应的矩形着色。它有10个“行”,每个行能够显示主服务器和最多60个pos设备和一个可以填充站点号的文本框。然后,当您单击go时,它将读取2 .ini文件以查找站点IP方案以及设备数量及其地址,以便每个设备可以是pung(或ping lol)。我附上了该应用程序的屏幕截图,这可能有助于解释我的所作所为?!

然后,我可以使用我的应用程序查看一个或多个站点的计算机是否在线,例如,如果我对计算机进行远程升级,我可以看到它们都停止回复(盒子变红)并重新开始(框再次变为绿色)然后我可以轻松地告诉所有更新完成后计算机全部重新启动。我的问题是我的代码(IMO)太长了,可能效率不高(60k行!)。

对于10行中的任何一行或全部,除了对象和变量名等之外,每行后面的代码是相同的(即第一个'reply'矩形称为'rectSt1Pos1'(表示Rectangle Shape-Store1-Pos1) ,然后'rectSt1Pos2'依此类推,直到'... Pos60',并重复所有10行(最后一行是'rectSt10Pos60'))。这意味着我必须绘制610个单独的盒子(因为我不太自信地动态绘制它们),我对此感到高兴,但我已经完成了在课程开始时初始化所有变量的事情(没有分配值)但超过1200行只是为了成功和失败的回复计数器为每个可能是pung的设备(10个站点,每个站点有一个主服务器,每个站点最多60个POS,每个设备一个成功和1个失败计数器= 1220 int值来存储ping计数!)

好的,所以希望足够的应用程序解释,以及我的问题,即我的应用程序的代码(大多数是在一个单独的类(我唯一的其他类是一个读取ini)文件))刚刚达到60,000行(是的六万!!)。这基本上是我认为应该是的10倍,我相信我应该能够减少这个,但我不知道如何开始考虑重构代码!!

另外,我认为我应该能够在可以调用的泛型类或方法中执行每一行的所有操作,但我不知道如何做到这一点,因为每行都是矩形和地址等。是不同的,需要跨线程更新(我;可以用交叉线程;)

总而言之,有没有人对如何减少代码大小有任何建议?或者是否可以拥有一个包含60,000多行的类?,编译时的应用程序大约是1.8Mb并使用大约40Mb的内存, 15-25个线程和400-1100个句柄......这是可接受的开销吗?

非常感谢任何建议,意见或帮助。如果它有帮助,我也可以发布代码片段,因为屏幕截图尚未发布(因为我显然没有足够的声誉点!)如果需要,我可以在其他地方托管它。

非常感谢你的时间,请问是否有什么不太清楚(但不要说全部哈哈!)

干杯,

2 个答案:

答案 0 :(得分:2)

您需要使用子程序:

  • 一个“手柄线”子程序
  • 一个“句柄设备”子程序

调用“句柄行”子程序10次。

每行调用“handle device”子程序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);
  }
}

以上是用于说明帮助程序类(Line和Device)的伪代码。使用C#,您可能希望使用System.Collections.Generic.List而不是数组。

此外,HandleLine功能可以是Line而不是Main的方法。它甚至可以是Line类的构造函数。

答案 1 :(得分:1)

一个文件中有60,000多行! 使用方法/函数/子例程/宏来抽象输入和输出。

如果参数与某些逻辑不同(例如每次+1),也可以考虑使用循环而不是重复相同的命令。