Algumas vezes pode não ser tão óbvio perceber uma duplicidade de código. Quando há blocos que fazem a mesma coisa, mas com detalhes diferentes, ainda assim é possível evitar a duplicação de comportamentos semelhantes extraindo a parte em comum para funções separadas.
Por exemplo, ao invés de:
Local cStatus := Substr(cParams, (At("<STATUS>",cParams) + Len("<STATUS>")),; (At("</STATUS>",cParams)-At("<STATUS>",cParams)-Len("<STATUS>")) )
Local cObsEcm := Substr(cParams, (At("<OBS>",cParams) + Len("<OBS>")),; (At("</OBS>",cParams)-At("<OBS>",cParams)-Len("<OBS>")) )
Local cChamado := Substr(cParams, (At("<CODADE>",cParams) + Len("<CODADE>")),; (At("</CODADE>",cParams)-At("<CODADE>",cParams)-Len("<CODADE>")) )
Local cItemCh := Substr(cParams, (At("<CODITEM>",cParams) + Len("<CODITEM>")),; (At("</CODITEM>",cParams)-At("<CODITEM>",cParams)-Len("<CODITEM>")) )
Local cUsuario := Substr(cParams, (At("<USER>",cParams) + Len("<USER>")),; (At("</USER>",cParams)-At("<USER>",cParams)-Len("<USER>")) )
Crie uma função para executar o procedimento padrão e apenas repita as chamadas a ela:
Local cStatus := EntreTags(cParams, "<STATUS>" , "</STATUS>")
Local cObsEcm := EntreTags(cParams, "<OBS>" , "</OBS>")
Local cChamado := EntreTags(cParams, "<CODADE>" , "</CODADE>")
Local cItemCh := EntreTags(cParams, "<CODITEM>" , "</CODITEM>")
Local cUsuario := EntreTags(cParams, "<USER>" , "</USER>")
….
….
Function EntreTags(cTexto, cTagIni, cTagFim)
Local cStrRet := '' // Texto que será extraido e retornado
Local nPosIni := At(cTagIni,cTexto) // Posicao inicial da tag
Local nPosFim := At(cTagFim,cTexto) // Posicao final da tag
cStrRet := Substr(cTexto, (nPosIni + Len(cTagIni)),; (nPosFim-nPosIni-Len(cTagIni)) )
Return cStrRet