Piemērs no dzīves: ko dara nekārtīgs programmētājs, ja vajadzīga funkcija, kas “sakabina” kopā divus faila pilnās takas fragmentus? Raksta funkciju
Function getFullPath(ByVal spRoot As String, ByVal spSub As String) As String
Return spRoot & "/" & spSub
End Function
Viss būtu labi, bet gadījumos , ja spRoot
jau beidzas ar “/” simbolu, izveidosies neglīta taka ar divām slīpsvītrām pēc kārtas. Tāpēc kārtīgāks programmētājs cenšas notīrīt liekos “/” no Root beigām:
Function getFullPath(ByVal spRoot As String, ByVal spSub As String) As String
'korekti ir nemainīt parametra vērtību funkcijā - nokopēsim
Dim sRoot As String = spRoot
'kamēr vien rinda beidzas ar /, dzēšam tos nost
While Right(sRoot, 1) = "/"
'ja būs atkārtoti / beigās, notīrīs visus
sRoot = Left(spRoot, Len(sRoot) - 1)
End While
Return sRoot & "/" & spSub
End Function
Ir jau labi, tikai darba daudz. Un vispār – kāpēc tā darīt, ja ir izveidota String klases funkcija TrimEnd. Lietojot to, varam atkal funkcijas būtību ierakstīt vienā rindiņā:
Function getFullPath(ByVal spRoot As String, ByVal spSub As String) As String
Return spRoot.TrimEnd("/"c) & "/" & spSub
End Function
TrimEnd un TrimStart funkcijām parametros var nodot sarakstu ar dažādiem simboliem, kurus mēģināt nodzēst no rindas beigām. Piemēram, ja gribam pārliecināties, ka apakšdirektorijas daļa spSub
patiesībā nav līdzīga šai “../../../../windows/system32/”, varam nodzēst arī punkta simbolus no otrā parametra abu parametru savienojamajiem galiem.
Function getFullPath(ByVal spRoot As String, ByVal spSub As String) As String
Return spRoot.TrimEnd("/"c, "/"c) & "/" & spSub.TrimStart("."c, "/"c)
End Function
Cīņa par drošu kodu? Nu, tā laikam būs.
P.S. Uzmanīgi, ja kāds no parametriem būs Nothing, funkcija metīs kļūdu!
Šito gan laikam ir vienkāršāk atrisināt ar System.IO.Path.Combine funkciju.