Frage - wie Code vereinfachen - verschiedene Datentypen im Rückgabewert

  • VB.NET

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

    Frage - wie Code vereinfachen - verschiedene Datentypen im Rückgabewert

    Moin!

    schon seit längerem geht mir die Frage durch den Kopf, wie kann ich Code optimieren oder wie machen es die richtigen Profis an der Stelle.

    Ausgangssitutation: ich habe Werte die über eine API aus einer Datenbank zur Verfügung gestellt werden.

    Hierfür habe ich mir folgende Hauptfunktion geschrieben:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Abfrage von FEATURE-Attributen
    3. ''' </summary>
    4. ''' <param name="FeatureElement">Objekt</param>
    5. ''' <param name="Name">Name des FEATURE-Attributes</param>
    6. ''' <param name="DefaultValue">Vorgabewert, wenn nichts gefunden wird</param>
    7. ''' <param name="FormatDefinition">Genauigkeit (Zeichenkette,Meter, Dezi, Zenti, Milli)</param>
    8. ''' <returns>Zeichenkette</returns>
    9. <Global.System.Diagnostics.DebuggerStepThroughAttribute()>
    10. Public Function GetFeatureAttribut(ByVal FeatureElement As Autodesk.Map.IM.Data.Feature, ByVal Name As String, ByVal DefaultValue As String, ByVal FormatDefinition As Genauigkeit) As String
    11. ' ------ http://ma22-wiki-001/eblwiki/index.php?title=MapData(Klasse_von_EBL.MapService)#GetFeatureAttribut ------
    12. _Log?.WriteFuncName((New StackTrace).GetFrame(0).GetMethod.Name, AddText:="Feature")
    13. If IsNothing(FeatureElement) Then
    14. _Log?.WriteAsError("Feature fehlt!")
    15. MessageBox.Show("Feature fehlt!", k_CompanyName, MessageBoxButtons.OK, MessageBoxIcon.Hand)
    16. Return ""
    17. End If
    18. _Log?.WriteParameter("FID", FeatureElement.FID.ToString)
    19. _Log?.WriteParameter("Name", Name)
    20. _Log?.WriteParameter("DefaultValue", DefaultValue)
    21. _Log?.WriteParameter("FormatDefinition", FormatDefinition.ToString)
    22. Try
    23. If FeatureElement.Attributes.Contains(Name) Then
    24. If Not FeatureElement.Attributes(Name).IsDBNull Then
    25. Select Case FormatDefinition
    26. Case Genauigkeit.Zeichen
    27. Return CStr(FeatureElement.Attributes(Name).Value)
    28. Case Genauigkeit.Meter
    29. Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 0).ToString("0.")
    30. Case Genauigkeit.Dezimeter
    31. Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 1).ToString("0.0")
    32. Case Genauigkeit.Zentimeter
    33. Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 2).ToString("0.00")
    34. Case Genauigkeit.Millimeter
    35. Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 3).ToString("0.000")
    36. Case Genauigkeit.SubMillimeter
    37. Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 4).ToString("0.0000")
    38. Case Else
    39. MessageBox.Show("ungültige 'PunktDefinition' Zuweisung (Fall 2 Stützpunkte) in EBL.MapService.MapGeometrie.GetLineStringPoint!", k_CompanyName, MessageBoxButtons.OK, MessageBoxIcon.Hand)
    40. _Log?.Write("ungültige Formatdefinition")
    41. Return CStr(FeatureElement.Attributes(Name).Value)
    42. End Select
    43. End If
    44. Else
    45. _Log?.Write("gefordertes Attribut '" & Name & "' nicht vorhanden in diesem Feature!")
    46. End If
    47. Catch ex As Exception
    48. Dim ClassName As String = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name
    49. Dim CurrentMethodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name
    50. Dim StackTrace As New System.Diagnostics.StackTrace(True)
    51. Dim CallMethodName As String = StackTrace.GetFrame(1).GetMethod().Name
    52. Dim ErrInfo As String = ClassName & " > " & CurrentMethodName & " > " & CallMethodName
    53. _TryReport.Show("unerwarteter Fehler in " & ErrInfo, ex, StackTrace,
    54. "Name:" & Name & Environment.NewLine &
    55. "Defaultwert: " & DefaultValue & Environment.NewLine &
    56. "Formatdefinition: " & FormatDefinition.ToString & Environment.NewLine, Log:=_Log)
    57. End Try
    58. _Log?.WriteResult("DefaultValue", DefaultValue)
    59. Return DefaultValue
    60. End Function



    Nun werden die Daten mal als String, Double, Integer, Long,.... abgefragt.

    Hierfür habe ich auch einige Funktionen erstellt - 2 Beispiele:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function GetFeatureAttributAsInteger(ByVal Feature As Autodesk.Map.IM.Data.Feature, ByVal Attribut As String) As Integer?
    2. _Log?.WriteFuncName((New StackTrace).GetFrame(0).GetMethod.Name)
    3. If Feature.FID = 202313071 Then
    4. Dim test As Integer = 1
    5. End If
    6. Dim Rückgabewert As String = GetFeatureAttribut(Feature, Attribut, "", Genauigkeit.Zeichen)
    7. If Rückgabewert.Length = 0 Then
    8. Return Nothing
    9. Else
    10. Return CInt(Rückgabewert)
    11. End If
    12. Return Nothing
    13. End Function


    VB.NET-Quellcode

    1. Public Function GetFeatureAttributAsLong(ByVal Feature As Autodesk.Map.IM.Data.Feature, ByVal Attribut As String,
    2. Optional ByVal CDocument As Autodesk.Map.IM.Forms.Document = Nothing) As Long
    3. _Log?.WriteFuncName((New StackTrace).GetFrame(0).GetMethod.Name)
    4. If CDocument Is Nothing = True Then CDocument = _Document
    5. Dim Rückgabewert As String = GetFeatureAttribut(Feature, Attribut, "", Genauigkeit.Zeichen)
    6. If Rückgabewert.Length = 0 Then
    7. Return -1
    8. Else
    9. Return CLng(Rückgabewert)
    10. End If
    11. Return -1
    12. End Function



    Im wesentlichen unterscheiden sich die beiden aufrufenden Funktionen darin, dass vor dem RETURN der Rückgabewert aus der "Arbeitsfunktion" in den entsprechenden Datentyp konvertiert wird.

    Würde Ihr das auch so machen oder gibt es einen eleganteren Weg?

    Vor einer solchen Aufgabenstellung in der Art steht man ja immer wieder.

    Gruß Jan
    @jan99 Da gibt es sicherlich mehrere Methoden.
    Du könntest ein Object zurückgeben, dem per Cast der richtige Datentyp zugewiesen wurde.
    Nur muss hier die aufrufende Funktion die Rück-Konvertierung durchführen, und bei vielen Aufrufen ist das lästig.
    Bei vielen Aufrufen mehrerer dieser Funktionen würde ich wahrscheinlich für jeden Typ eine eigene Funktion schreiben.
    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!
    @ISliceUrPanties Jou, das ist im Prinzip richtig, das hatte ich auch erwogen.
    Bei den "üblichen" generischen Prozeduren ist ein Input-Parameter vom Typ T.
    Hier bei @jan99 ist der Output-Parameter vom Typ T, und da ist es wahrscheinlich, dass dann eine gigantische If / Select Case-Konstruktion das alles abdecken muss,
    das wäre dann zumindest kein guter Programmier-Stil, im schlimmsten Fall wäre das nicht wartbarer Code.
    Deswegen plädiere ich dagegen.
    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!