2014-01-09 2 views
0

직장에서 여러 POS 장치 (온라인)가 온라인 상태인지 확인하고 네트워크 ping에 회신 한 후 색상을 지정하는 응용 프로그램을 작성했습니다 ping 응답에 따라 빨간색 또는 녹색의 해당 직사각형. 그것에는 10 개의 '회선'이 있습니다. 각 회선에는 마스터 서버와 최대 60 개의 POS 장치를 표시 할 수 있으며 사이트 번호로 채울 수있는 텍스트 상자가 있습니다. 그런 다음 이동을 클릭하면 2 개의 .ini 파일을 읽어 사이트 IP 구성표와 장치 수 및 주소를 확인하여 각 장치를 ping (또는 ping 된 lol) 할 수 있습니다. 응용 프로그램의 스크린 샷을 첨부했습니다. 이는 내가 만든 것을 설명하는 데 도움이 될 것입니까?!클래스에 코드가 너무 많지만 줄이기위한 방법이 확실하지 않습니다.

그런 다음 하나 이상의 사이트에있는 컴퓨터가 온라인인지, 예를 들어 컴퓨터로 원격 업그레이드를 실행하면 답장을 모두 중단하고 (상자가 빨간색으로 표시됨) 다시 볼 수 있음을 알기 위해 내 응용 프로그램을 사용할 수 있습니다 (상자가 다시 녹색으로 바뀝니다) 그러면 모든 업데이트가 완료되고 컴퓨터가 모두 다시 부팅되면 쉽게 알릴 수 있습니다. 내 문제는 내 코드가 (IMO) 너무 길어서 가능한 한 효율적이지 않을 수 있다는 것입니다 (60k 라인!).

개체의 이름과 변수 이름 등을 제외하고 각 줄 뒤의 코드는 동일합니다 (즉, 첫 번째 'reply'사각형은 'rectSt1Pos1'이라고합니다. 즉 Rectangle Shape-Store1-Pos1), 'rectSt1Pos2'등등 ... 'Pos60'까지, 그리고 모든 10 개의 라인 (마지막으로 'rectSt10Pos60')에 대해 반복). 이것은 내가 (동적으로 그리기에 자신감이 없었기 때문에) 610 개의 개별 상자를 그려야 만한다는 것을 의미했습니다. 그리고 나는 그것에 만족합니다. 그러나 클래스 시작시 모든 변수를 초기화하는 것과 같은 일을했습니다. 값을 할당합니다.)하지만 넘겨 줄 수있는 각 가능한 장치 (마스터 서버가있는 각 사이트, 사이트 당 최대 60 POS, 장치 당 성공 및 실패 카운터 1 개당 성공 및 실패 응답 카운터 포함)가 1200 회선 이상입니다. = 1220 int 값을 ping 카운트를 저장!)

잘하면 응용 프로그램 설명과 함께, 그리고 내 문제에 관해서는, 즉 응용 프로그램에 대한 내 코드 (대부분은 하나의 클래스에 있습니다 (즉, 내가 가지고있는 유일한 다른 수업은 ini 파일을 읽는 것입니다.))는 약 60,000 줄에 달했습니다 (예 .6 만!). 이것은 기본적으로 10 배 크기라고 생각하지만이 문제를 줄일 수 있어야한다고 생각합니다. 그러나 코드를 리팩토링하는 방법에 대해 생각해 볼 수있는 방법을 알지 못합니다 !!

또한 제네릭 클래스 또는 호출 할 수있는 메서드에서 각 줄에 대해 모든 작업을 수행 할 수 있어야한다고 생각하지만 각 줄의 사각형과 주소 등을 어떻게 처리 할 수 ​​있는지 잘 모르겠습니다. . 서로 다르며 크로스 스레드 업데이트가 필요합니다. (크로스 쓰레딩과 나는 잘 맞습니다.)

요약하면 코드 크기를 줄이는 방법에 대한 조언이있는 사람이 있습니까? 어쩌면 괜찮아요 클래스 60,000 + 라인?, 컴파일 할 때 약 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 기능은 Main 대신 Line의 메소드가 될 수 있습니다. 그것은 Line 클래스의 생성자 일 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다 :) - 서브 루틴 '은 같은 클래스의 추가 메서드입니까? 왜냐하면 변수를 초기화하는 일부 서브 루틴을 추가하기 때문에 변수를 업데이트하고 오류를 발생시키는 '현재 컨텍스트'에서 해당 변수를 제거하기 때문입니다. 방법? – RatMonkey

+0

Ooh, 알겠습니다. 예를 들어 앞서 언급 한 핑 카운터를 개선하고 싶다면 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