내 LotusScript 에이전트에 대한 피드백을 제공할 수 있는 사람이 있나요?

StackOverflow https://stackoverflow.com/questions/647198

문제

안녕하세요. 저는 개발자가 아니기 때문에 모범 사례를 알지 못합니다.로그 데이터의 수동 데이터 복사를 우회하기 위해 이것을 만들었습니다.이 에이전트는 각각의 추가 피드에 대해 복사하고 조정하는 단일 피드용입니다.지정된 피드에 대해 오늘과 어제까지 처리된 마지막 시간과 파일 수에 대한 로그를 읽습니다.또한 입력 폴더의 파일 수를 계산하고 서버의 시간대를 읽습니다.각 데이터 항목은 csv용 쉼표로 구분되어 이메일로 전송되며 나중에 웹사이트에서 호스팅됩니다.건설적인 비판에 감사드립니다.

Sub Initialize
    Dim customername As String
    Dim servername As String
    Dim feedname As String
    Dim alertthresholdinhours As Integer
    Dim inputfeedpath As String

    ' Set for each feed
    customername = "gRrhio"
    servername = "gRrhioEdge2"
    feedname = "FF Thompson ADT"
    alertthresholdinhours = 6
    inputfeedpath = "\\mhinec\elycon\data\adt\*.*"

    ' Counts files in input folder
    Dim pathName As String, fileName As String
    Dim inputfeedcounter As Integer
    inputfeedcounter = 0
    pathName$ = inputfeedpath
    fileName$ = Dir$(pathName$, 0)
    Do While fileName$ <> ""
        inputfeedcounter = inputfeedcounter + 1
        fileName$ = Dir$()
    Loop

    Dim entry As NotesViewEntry   
    Dim vc As NotesViewEntryCollection
    Dim filesprocessed As Integer
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim newDoc As NotesDocument
    Dim rtitem As NotesRichTextItem
    Set db = session.CurrentDatabase
    Dim view As NotesView
    Set view = db.GetView( "Sessions\by Feed" )
    Set newDoc = New NotesDocument( db )
    Set rtitem = New NotesRichTextItem( newDoc, "Body" )
    Dim todaysdate As New NotesDateTime("Today")
    Dim flag As Integer
    Dim counter As Integer
    Dim files As Integer
    Dim errors As Integer
    Dim lastdate As String
    Dim lastdayran As String
    Dim lasttime As String
    Dim lasttimeran As String
    Dim filesp As Integer
    Dim lastdayfiles As Integer
    Dim lastdaysfiles2 As Integer
    Dim terrors As Integer
    Dim lastdayerrors As Integer
    lastdate = ""
    lastdayran = ""
    counter = 0
    flag = 0
    filesp = 0
    lastdayfiles = 0
    lastdaysfiles2 = 0
    terrors = 0
    lastdayerrors = 0

    ' Finds date for last time processed, counts files processed and errors
    While flag = 0
        Dim dateTime As New NotesDateTime(todaysdate.DateOnly)
        Dim keyarray(1) As Variant
        keyarray(0) = feedname
        Set keyarray(1) = dateTime

        Set vc = view.GetAllEntriesByKey(keyarray, False)   
        Set entry = vc.GetFirstEntry

        If entry Is Nothing Then
            Call todaysdate.AdjustDay(-1)
        End If

        While Not entry Is Nothing
            files = 0
            Forall colval In entry.ColumnValues
                If counter = 9 Then
                    counter = 0
                Elseif counter = 8 Then
                    counter = 9
                Elseif counter = 7 Then
                    counter = 8
                Elseif counter = 6 Then
                    errors = Cint(colval)
                    counter = 7
                Elseif counter = 5 Then
                    counter = 6
                Elseif counter = 4 Then
                    files = Cint(colval)               
                    counter = 5
                Elseif counter = 3 Then
                    counter = 4
                Elseif counter = 2 Then
                    counter = 3
                    lasttime = colval
                Elseif counter = 1 Then
                    counter = 2
                    lastdate = colval
                Elseif counter = 0 Then
                    counter =  1
                End If           
            End Forall
            filesp = filesp + files
            terrors = terrors + errors
            Set entry=vc.GetNextEntry (entry)
            flag = 1
        Wend
    Wend
    lastdayfiles = filesp
    lastdayerrors = terrors
    lastdayran = lastdate
    lasttimeran = lasttime

    'Counts previous files processed
    filesp = 0
    terrors = 0
    lastdate = ""
    flag = 0
    Call todaysdate.AdjustDay(-1)   
    While flag = 0
        Dim dateTime2 As New NotesDateTime(todaysdate.DateOnly)
        Dim keyarray2(1) As Variant
        keyarray2(0) = feedname
        Set keyarray2(1) = dateTime2
        Set vc = view.GetAllEntriesByKey(keyarray2, False)   
        Set entry = vc.GetFirstEntry

        If entry Is Nothing Then
            Call todaysdate.AdjustDay(-1)
        End If

        While Not entry Is Nothing
            files = 0
            Forall colval In entry.ColumnValues
                If counter = 9 Then
                    counter = 0
                Elseif counter = 8 Then
                    counter = 9
                Elseif counter = 7 Then
                    counter = 8
                Elseif counter = 6 Then
                    counter = 7
                Elseif counter = 5 Then
                    counter = 6
                Elseif counter = 4 Then
                    files = Cint(colval)               
                    counter = 5
                Elseif counter = 3 Then
                    counter = 4
                Elseif counter = 2 Then
                    counter = 3
                Elseif counter = 1 Then
                    counter = 2
                Elseif counter = 0 Then
                    counter =  1
                End If           
            End Forall
            filesp = filesp + files
            Set entry=vc.GetNextEntry (entry)
            flag = 1
        Wend
    Wend
    lastdaysfiles2 = filesp

    ' Prints line of CSV into body of email
    Call rtitem.AppendText ( customername )
    Call rtitem.AppendText ( ", " )
    Call rtitem.AppendText ( servername )
    Call rtitem.AppendText ( ", " )
    Call rtitem.AppendText ( datetime.timezone )
    Call rtitem.AppendText ( ", " )
    Call rtitem.AppendText ( lastdayran )
    Call rtitem.AppendText ( " " )
    Call rtitem.AppendText ( lasttimeran )
    Call rtitem.AppendText ( ", " )
    Call rtitem.AppendText ( lastdayfiles )
    Call rtitem.AppendText ( ", " )
    Call rtitem.AppendText ( lastdayerrors )
    Call rtitem.AppendText ( ", " )
    Call rtitem.AppendText ( lastdaysfiles2 )
    Call rtitem.AppendText ( ", " )
    Call rtitem.AppendText ( inputfeedcounter )
    Call rtitem.AppendText ( ", " )
    Call rtitem.AppendText ( alertthresholdinhours )
    Call newDoc.Save( False, True )
    newDoc.Subject = feedname
    ' Running from server line should be
    'newDoc.SendTo = "Ecmon Feedcheck/Ecmonitor@ECMONITOR"
    newDoc.SendTo = "AX1Forward Feedcheck/ACHQ@company.com"
    newDoc.Send( False )
End Sub
도움이 되었습니까?

해결책

개발자가되지 않으려면 많은 코드를 쓸 수 있습니다 :)

좋은 개발자가되기 시작하는 몇 가지 교훈을 찾고 있다면 Mitch의 조언을 받아 (의견에서) 이것을 서브 루틴으로 나눕니다. 제 1과 : 여기에는 확실히 일부 반복 코드가 있으며, 반복적 인 코드를 메소드 (함수 또는 서브 루틴)에 넣는 것이 항상 좋은 생각입니다. 그래서 한 번만 존재합니다. 처리 된 파일을 계산하고 이전 파일을 처리하는 섹션은 비슷해 보이며 다음과 같은 일상에 넣을 수 있습니다.

Function GetCountFilesProcessed() As Integer

    'code here

End Function

그러나 코드를 올바르게 이해하면 필요성을 절약 할 수도 있습니다. 중간에 이상한 루프를하는 대신, 당신은 단순히 뷰 엔트리 열에서 값을 얻으려고하는 것 같습니다. 4 열 값에서 상호 작용한다고 가정 해보십시오. 인덱스별로 액세스하여 원하는 열의 값을 간단히 얻을 수 있습니다. 예를 들어, 파일 변수는이 라인에서 4 열 값으로 직접 설정할 수 있습니다.

files = Cint(entry.ColumnValues(4))  'check this, it might be 3 if the array is zero based.

어쨌든, 결론은이 코드가 작동한다면 좋은 출발을 시작합니다!

다른 팁

더 많은 스타일 측면에서, 나는 항상 다른 사람들의 코드를 유지하는 것이 더 쉽다는 것을 알았습니다.

  1. 선언 Option 'Explicit' 선언 섹션에서
  2. 선언 된 변수는 대략 더 높음에서 더 낮은 것 (예 : DOC 전보기 전 DB 이전 세션)
  3. 접두사 노트 유형 (Docmail, Dbmydatabase, ViewOutStandingInvoices)이있는 개체
  4. 모든 선언을 맨 위에 올려 놓습니다 (변수를 만나면 선언을 찾는 데 도움이됩니다)
  5. 다른 사람들이 언급했듯이 해당되는 경우 기능/서브로 분해하십시오.

동일한 문제의 다른 사례에 대해이 에이전트를 복사하는 것에 대한 귀하의 의견도 깃발을 올립니다. 이 에이전트 사이에 공통적 인 것을 해결하고 해당 기능을 스크립트 라이브러리로 푸시하십시오. 이런 종류의 물건은 각 에이전트가 다른 방식으로 생각할 필요가 없으므로 코드를 유지할 때 많은 시간을 절약합니다 (예 :이 에이전트의 모든 인스턴스에 내 변경 사항이 적용됩니까?)

당신은 당신의 코드를 훨씬 더 많이 분해하고 싶습니다 ... 한 가지 작은 것. 대신에

while not item is nothing

이중 부정과 인기있는 뇌 벤더입니다. 쓰기 :

do until item is nothing
  ...
loop

이것은 또한 출구로 루프에서 벗어날 수 있습니다.

Forall 루프를 모두 최적화 할 수 있습니다. 이것이 첫 번째가 보이는 방식입니다.

Forall colval In entry.ColumnValues
    Select Case (counter)
        Case 1: lastdate = colval
        Case 2: lasttime = colval
        Case 4: files = Cint(colval) 
        Case 6: errors = Cint(colval)
    End Select
    counter = (counter + 1) Mod 10    
End Forall

이것이 두 번째가 어떻게 보일지입니다.

Forall colval In entry.ColumnValues
    if (counter = 4) Then files = Cint(colval)
    counter = (counter + 1) Mod 10
End Forall

이 비트에 관한 참고 사항

    While Not entry Is Nothing
        files = 0            
        Forall colval In entry.ColumnValues
            If counter = 9 Then
                counter = 0
            Elseif counter = 8 Then
                counter = 9
    ....

ken이 말했듯이 Entry.ColumnValues(x) 메소드를 사용하여 columnValues를 얻을 수 있으므로 값을 통한 상호 작용은 필요하지 않습니다.하지만;당신은 이것을 할 수 있었어

    While Not entry Is Nothing
        files = 0            
        counter = 0
        Forall colval In entry.ColumnValues
            counter = counter + 1
            Select case counter
                case 6
                    errors = Cint(colval)
      .....
            end select

이미 몇 가지 좋은 점. 공통 개체를 공유하는 변수가있는 경우 클래스를 만듭니다. 해당 클래스에 변수를 추가하십시오.

그래서 말하는 대신 :

Dim userFullName as String
Dim age as Integer
Dim addressLine1 as String
' ... etc.

당신은 가질 수 있습니다 :

Class UserDetails 
  Dim fullName as String
  Dim age as Integer
  Dim addressLine1 as String
  ' ... etc
End Class

및 참조 :

Dim u as new UserDetails
u.fullName = "full name"
u.age = 22
u.addressLine1 = "1 main street"

이것의 장점은 해당 데이터를 조작하는 메소드를 추가 할 수 있으며 코드가 응용 프로그램을 통해 사냥하는 것보다 해당 객체와 관련이 있다는 것을 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top