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
Nun werden die Daten mal als String, Double, Integer, Long,.... abgefragt.
Hierfür habe ich auch einige Funktionen erstellt - 2 Beispiele:
Spoiler anzeigen
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
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:
VB.NET-Quellcode
- ''' <summary>
- ''' Abfrage von FEATURE-Attributen
- ''' </summary>
- ''' <param name="FeatureElement">Objekt</param>
- ''' <param name="Name">Name des FEATURE-Attributes</param>
- ''' <param name="DefaultValue">Vorgabewert, wenn nichts gefunden wird</param>
- ''' <param name="FormatDefinition">Genauigkeit (Zeichenkette,Meter, Dezi, Zenti, Milli)</param>
- ''' <returns>Zeichenkette</returns>
- <Global.System.Diagnostics.DebuggerStepThroughAttribute()>
- 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
- ' ------ http://ma22-wiki-001/eblwiki/index.php?title=MapData(Klasse_von_EBL.MapService)#GetFeatureAttribut ------
- _Log?.WriteFuncName((New StackTrace).GetFrame(0).GetMethod.Name, AddText:="Feature")
- If IsNothing(FeatureElement) Then
- _Log?.WriteAsError("Feature fehlt!")
- MessageBox.Show("Feature fehlt!", k_CompanyName, MessageBoxButtons.OK, MessageBoxIcon.Hand)
- Return ""
- End If
- _Log?.WriteParameter("FID", FeatureElement.FID.ToString)
- _Log?.WriteParameter("Name", Name)
- _Log?.WriteParameter("DefaultValue", DefaultValue)
- _Log?.WriteParameter("FormatDefinition", FormatDefinition.ToString)
- Try
- If FeatureElement.Attributes.Contains(Name) Then
- If Not FeatureElement.Attributes(Name).IsDBNull Then
- Select Case FormatDefinition
- Case Genauigkeit.Zeichen
- Return CStr(FeatureElement.Attributes(Name).Value)
- Case Genauigkeit.Meter
- Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 0).ToString("0.")
- Case Genauigkeit.Dezimeter
- Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 1).ToString("0.0")
- Case Genauigkeit.Zentimeter
- Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 2).ToString("0.00")
- Case Genauigkeit.Millimeter
- Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 3).ToString("0.000")
- Case Genauigkeit.SubMillimeter
- Return Math.Round(CDbl(FeatureElement.Attributes(Name).Value), 4).ToString("0.0000")
- Case Else
- MessageBox.Show("ungültige 'PunktDefinition' Zuweisung (Fall 2 Stützpunkte) in EBL.MapService.MapGeometrie.GetLineStringPoint!", k_CompanyName, MessageBoxButtons.OK, MessageBoxIcon.Hand)
- _Log?.Write("ungültige Formatdefinition")
- Return CStr(FeatureElement.Attributes(Name).Value)
- End Select
- End If
- Else
- _Log?.Write("gefordertes Attribut '" & Name & "' nicht vorhanden in diesem Feature!")
- End If
- Catch ex As Exception
- Dim ClassName As String = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name
- Dim CurrentMethodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name
- Dim StackTrace As New System.Diagnostics.StackTrace(True)
- Dim CallMethodName As String = StackTrace.GetFrame(1).GetMethod().Name
- Dim ErrInfo As String = ClassName & " > " & CurrentMethodName & " > " & CallMethodName
- _TryReport.Show("unerwarteter Fehler in " & ErrInfo, ex, StackTrace,
- "Name:" & Name & Environment.NewLine &
- "Defaultwert: " & DefaultValue & Environment.NewLine &
- "Formatdefinition: " & FormatDefinition.ToString & Environment.NewLine, Log:=_Log)
- End Try
- _Log?.WriteResult("DefaultValue", DefaultValue)
- Return DefaultValue
- End Function
Nun werden die Daten mal als String, Double, Integer, Long,.... abgefragt.
Hierfür habe ich auch einige Funktionen erstellt - 2 Beispiele:
VB.NET-Quellcode
- Public Function GetFeatureAttributAsInteger(ByVal Feature As Autodesk.Map.IM.Data.Feature, ByVal Attribut As String) As Integer?
- _Log?.WriteFuncName((New StackTrace).GetFrame(0).GetMethod.Name)
- If Feature.FID = 202313071 Then
- Dim test As Integer = 1
- End If
- Dim Rückgabewert As String = GetFeatureAttribut(Feature, Attribut, "", Genauigkeit.Zeichen)
- If Rückgabewert.Length = 0 Then
- Return Nothing
- Else
- Return CInt(Rückgabewert)
- End If
- Return Nothing
- End Function
VB.NET-Quellcode
- Public Function GetFeatureAttributAsLong(ByVal Feature As Autodesk.Map.IM.Data.Feature, ByVal Attribut As String,
- Optional ByVal CDocument As Autodesk.Map.IM.Forms.Document = Nothing) As Long
- _Log?.WriteFuncName((New StackTrace).GetFrame(0).GetMethod.Name)
- If CDocument Is Nothing = True Then CDocument = _Document
- Dim Rückgabewert As String = GetFeatureAttribut(Feature, Attribut, "", Genauigkeit.Zeichen)
- If Rückgabewert.Length = 0 Then
- Return -1
- Else
- Return CLng(Rückgabewert)
- End If
- Return -1
- 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