Firmeninterne Kodierungsrichtlinien

  • Allgemein

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Firmeninterne Kodierungsrichtlinien

    Moin Fans,
    vor mir liegt folgende Aufgabe:
    Ich soll für meine Firma verbindliche Kodierungsrichtlinien aufstellen. Herr Google hat mit da einige Anhaltspunkte, aber keine (firmenintern juristisch) anwendbaren Regeln gegeben.
    Anhaltspunkte sind:
    • Projekteinstellungen
    • Gestaltung von Quelltext
    • Wartbarkeit
    • Länge einzelner Prozeduren
    • Anzahl der Parameter
    • Dokumentation von Quellcode
    • Testfeatures (Tools, automatische Tests)
    • ...
    Hat jemand von Euch / Gibt es bei Euch derartige Dokumente, die sich nachnutzen lassen?
    Kennt Ihr Literatur zu diesem Thema?

    Danke im voraus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @picoflop:
    Danke, sehr informativ und nützlich.
    Leider sind wir hier auf VB festgelegt, auch wenn ich selbst C# bevorzuge.
    @GambaJo:
    Dank auch Dir,
    alle diese Stichworte (und noch viele mehr) sind in meiner Liste bereits vorhanden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    hmm, das Netz ist voll davon, wenn Du nach Coding standards suchst. Versuche Dich eher an Best Practices auszurichten, statt dem deutschen Normalisierungswahn zu verfallen.

    Ein paar Links
    - Microsoft Design Guidelines for Developing Class Libraries
    - C# Coding Standards document ( Lance's whiteboard)
    - C# Code Guidelines & Best Programming Practices
    - Exception Handling Best Practices in .NET auf Codeproject

    Ausserdem könnte Dich das MS Tool FXCop interessieren
    Dank Dir, Kangaroo.
    Achtung Nachnutzer:
    Die Beschreibung im 4. Link von Kangaroo ist nicht ganz korrekt.

    VB.NET-Quellcode

    1. try { ... }
    2. catch (Exception ex)
    3. {
    4. throw ex;
    5. }

    und

    VB.NET-Quellcode

    1. try { ... }
    2. catch (Exception ex)
    3. {
    4. throw;
    5. }

    liefern beide denselben StackTrace!

    VB.NET-Quellcode

    1. try { ... }
    2. catch (Exception ex)
    3. {
    4. throw new Exception("Test", ex);
    5. }

    übergibt den StackTrace an die InnerException
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey,

    @RodFromGermany: Wenn du deinen 1 oder 3 code Verwendest, verwirfst du aber die "Spezifikation" der Exception. Nur bei throw; wird die Exception 1:1 neu ausgelöst.

    Wenn bei Variante 1 eine OutOfMemoryExeption ausgelöst wird, löst du eine normale Exception neu aus -> Deshalb immer nur throw;

    lg.

    LucaWelker
    lg.

    LucaWelker
    Ich kann natürlich in einem Select alle gängigen Exceptions abfangen, das ist nicht unbedingt erforderlich.
    Wichtig ist doch, dass ich genau weiß, wo welcher Fehler aufgetreten ist.
    Ich hab folgende Beispiele (ExecutionEngineException ist willkürlich, Exception sollte es nicht sein):

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Try
    3. Test()
    4. Catch ex As Exception
    5. Stop ' hier kommt "ExecutionEngineException" der Zeile "Throw" an, falsch
    6. End Try
    7. End Sub
    8. Private Sub Test()
    9. Try
    10. Throw New ExecutionEngineException ' diese Zeile benötige ich
    11. Catch ex As Exception
    12. Throw ' diese Zeile kommt oben an, falsch
    13. End Try
    14. End Sub

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Try
    3. Test()
    4. Catch ex As Exception
    5. Stop ' hier kommt "ExecutionEngineException" der Zeile "Throw New ExecutionEngineException" an, richtig
    6. End Try
    7. End Sub
    8. Private Sub Test()
    9. Try
    10. Throw New ExecutionEngineException ' diese Zeile kommt oben an, richtig
    11. Catch ex As Exception
    12. Throw New Exception("Test", ex)
    13. End Try
    14. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @LucaWelker:
    Also das ist leider nicht so.
    Obiger VB-Code in C# umgesetzt liefert selbstverständlich dieselben Resultate.
    Throw leitet zwar den Inhalt der Exception weiter, setzt aber einen neuen Stacktrace auf, und genau das soll nicht sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also bei uns in der Firma werden alle bzw. die meisten Exceptions so weitergeleitet und verarbeitet. In c# sowie in Delphi(raise). Und bei der Weiterverarbeitung in einem anderen Teil, sind immer noch 100% die Exceoption die gleichen.

    lg.

    LucaWelker
    lg.

    LucaWelker
    Erstell Dir mit ein paar Klicks diese Anwendung und sieh nach, was rauskommt.
    Die Praxis ist das Kriterium der Wahrheit. (Lenin ;( )
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Code meiner Klasse:

    Quellcode

    1. public FtpWebResponse loadAllFiles(string path)
    2. {
    3. request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
    4. request.Method = WebRequestMethods.Ftp.ListDirectory;
    5. //request.Credentials = credentials;
    6. request.UsePassive = false;
    7. request.UseBinary = true;
    8. request.KeepAlive = false;
    9. FtpWebResponse response;
    10. try
    11. {
    12. response = (FtpWebResponse)request.GetResponse();
    13. status = response.StatusDescription;
    14. }
    15. catch (Exception ex)
    16. {
    17. //status = ((FtpWebResponse)ex.Response).StatusDescription;
    18. throw;
    19. }
    20. finally
    21. {
    22. request.Abort();
    23. }
    24. return response;

    Code meines Hauptprogrammes:

    Quellcode

    1. try
    2. {
    3. FtpWebResponse response = files.loadAllFiles("ftp://luca-welker.com/test/");
    4. }
    5. catch (Exception ex)
    6. {
    7. Console.WriteLine(ex.GetType());
    8. }




    Und da haben wir die WebException.. Obwohl ich niemals von hand eine WebException ausgelöst habe.

    lg.

    LucaWelker
    lg.

    LucaWelker
    Ich brauche primär die Programmzeile, in der die Exception ausgelöst wurde, denn ich muss ja ggf. den Fehler im Code reparieren. Die Art der Exception ist da zweitrangig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es gibt bestimmt noch andere elegantere Wege (die ich leider noch nicht kenne).
    Für mich habe ich bisher etwa so gelöst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub ShowMyException(ByVal ex As MyBaseException)
    3. MessageBox.Show("Modul : " & ex.Modul & vbCrLf & _
    4. "Methode: " & ex.CallingProc & vbCrLf & _
    5. "Message: " & ex.Message, _
    6. ex.CallingProc, MessageBoxButtons.OK, MessageBoxIcon.Error)
    7. End Sub
    8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. Try
    10. 'Me.Test2()
    11. Me.Test1()
    12. Catch ex As MyBaseException
    13. Me.ShowMyException(ex)
    14. Catch ex As Exception
    15. MessageBox.Show(ex.Message)
    16. End Try
    17. End Sub
    18. Private Sub Test2()
    19. Try
    20. Throw New MyBaseException("Test vom Form1, Methode Test2 ...")
    21. Catch ex As Exception
    22. Throw
    23. End Try
    24. End Sub
    25. Private Sub Test1()
    26. Try
    27. TestClassA.TestClassB.TestProc1()
    28. Catch ex As Exception
    29. Throw
    30. End Try
    31. End Sub
    32. ' Klasse A
    33. Public Class TestClassA
    34. ' Klasse B
    35. Public Class TestClassB
    36. ' Methode 1
    37. Public Shared Sub TestProc1()
    38. Try
    39. Throw New MyBaseException("Blabla ....")
    40. Catch ex As Exception
    41. Throw
    42. End Try
    43. End Sub
    44. End Class
    45. End Class
    46. End Class
    47. ''' <summary>
    48. ''' Eigene Exceptionklasse
    49. ''' </summary>
    50. ''' <remarks></remarks>
    51. Public Class MyBaseException
    52. Inherits System.Exception
    53. Private _CallingProc As String
    54. Private _Modul As String
    55. Public Sub New(ByVal message As String)
    56. MyBase.New(message, Nothing)
    57. _CallingProc = Me.GetCallingProc ' Aufrufende Methode ermitteln
    58. _Modul = Me.GetModul
    59. End Sub
    60. Public Sub New(ByVal message As String, ByVal innerException As Exception)
    61. MyBase.New(message, innerException)
    62. _CallingProc = Me.GetCallingProc ' Aufrufende Methode ermitteln
    63. _Modul = Me.GetModul
    64. End Sub
    65. Public ReadOnly Property CallingProc() As String
    66. Get
    67. Return _CallingProc
    68. End Get
    69. End Property
    70. Public ReadOnly Property Modul() As String
    71. Get
    72. Return _Modul
    73. End Get
    74. End Property
    75. Private Function GetCallingProc() As String
    76. Try
    77. Return (New StackTrace).GetFrame(2).GetMethod().Name
    78. Catch ex As Exception
    79. Return String.Empty
    80. End Try
    81. End Function
    82. Private Function GetModul() As String
    83. Try
    84. Return (New StackTrace).GetFrame(2).GetMethod.ReflectedType.ToString
    85. Catch ex As Exception
    86. Return String.Empty
    87. End Try
    88. End Function
    89. End Class
    Zur Erläuterung noch mal alles zusammengefasst:
    Quelltext:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Try
    4. Test1()
    5. Catch ex As Exception
    6. ' hier kommt "ExecutionEngineException" der Zeile "Throw" an, falsch
    7. rtb.Text = ex.ToString
    8. End Try
    9. End Sub
    10. Private Sub Test1()
    11. Try
    12. Throw New ExecutionEngineException ' die Nummer dieser Zeile benötige ich
    13. Catch ex As Exception
    14. Throw ' die Nummer dieser Zeile kommt oben an, falsch
    15. End Try
    16. End Sub
    17. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    18. Try
    19. Test2()
    20. Catch ex As Exception
    21. ' hier kommt "ExecutionEngineException" der Zeile "Throw New ExecutionEngineException" an, richtig
    22. rtb.Text = ex.ToString
    23. End Try
    24. End Sub
    25. Private Sub Test2()
    26. Try
    27. Throw New ExecutionEngineException ' die Nummer dieser Zeile kommt oben an, richtig
    28. Catch ex As Exception
    29. Throw New Exception("Test", ex)
    30. End Try
    31. End Sub
    32. End Class

    Button1 --> rtb.Text:
    Spoiler anzeigen
    "System.ExecutionEngineException: Interner Laufzeitfehler.
    bei Test1.Form1.Test1() in C:\Projects\Test1\Form1.vb:Zeile 15. :(
    bei Test1.Form1.Button1_Click(Object sender, EventArgs e) in C:\Projects\Test1\Form1.vb:Zeile 4."

    Button2 --> rtb.Text:
    Spoiler anzeigen
    "System.Exception: Test ---> System.ExecutionEngineException: Interner Laufzeitfehler.
    bei Test1.Form1.Test2() in C:\Projects\Test1\Form1.vb:Zeile 30. :)
    --- Ende der internen Ausnahmestapelüberwachung ---
    bei Test1.Form1.Test2() in C:\Projects\Test1\Form1.vb:Zeile 32.
    bei Test1.Form1.Button2_Click(Object sender, EventArgs e) in C:\Projects\Test1\Form1.vb:Zeile 21."
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!