I thought similarly but was too busy to reply.
As the developers of the core library used by everyone one of Embarcadero’s goals is to keep the code efficient. Thus they have somewhat legitimate reasons to duplicate code so long as there are benefits and they avoid the corresponding downsides of code duplication, in particular divergence in different copies of the same code. Of course given the difference in the GetUnicodeCategory calls (as also pointed out by Jolyon) one has to wonder if the code hasn’t already diverged! But there could be a good reason for the copies being different too... One would also hope both copies of the routine were commented to point out there were two versions and the reason why – does anyone know if Embarcadero’s comments get stripped before the source goes out to us or do they just not comment their code? ;-) David. From: [email protected] [mailto:[email protected]] On Behalf Of Jolyon Smith Sent: Sunday, 3 June 2012 9:03 p.m. To: [email protected]; NZ Borland Developers Group - Delphi List Subject: Re: [DUG] Why re-use when you can duplicate! Arguably it's an optimisation. This isn't code that is likely to change and incurring an additional function call for such a small snippet of code for the kind of processing such checks might be involved in could be a significant overhead. They could have "inline"d it I guess, but there are all sorts of things that seem to break inlining in Delphi (as in "cause to be rejected by the compiler") and this might fall foul of those. Another explanation (perhaps also optimisation related) might lie in the fact that it isn't a perfect duplication... note the slight differences in the call that the first makes to INTERNALGetUnicodeCategory(UCS4Char), whilst the second uses GetUnicodeCategory(String, Index). Then again, this might also be a sub-optimal variation. Hard to say without probing deeper than is warranted at this point. :) On 3 June 2012 12:15, Todd <[email protected]> wrote: Is this a representative example of the code quality Embarcadero is producing today? class function TCharacter.IsNumber(C: Char): Boolean; begin if not IsLatin1(C) then Result := CheckNumber(InternalGetUnicodeCategory(UCS4Char(C))) else if not IsAscii(C) then Result := CheckNumber(InternalGetLatin1Category(C)) else Result := (C >= '0') and (C <= '9'); end; class function TCharacter.IsNumber(const S: string; Index: Integer): Boolean; var C: Char; begin CheckStringRange(S, Index); C := S[Index]; if not IsLatin1(C) then Result := CheckNumber(GetUnicodeCategory(S, Index)) else if not IsAscii(C) then Result := CheckNumber(InternalGetLatin1Category(C)) else Result := (C >= '0') and (C <= '9'); end; Todd. _______________________________________________ NZ Borland Developers Group - Delphi mailing list Post: [email protected] Admin: http://delphi.org.nz/mailman/listinfo/delphi Unsubscribe: send an email to [email protected] with Subject: unsubscribe
_______________________________________________ NZ Borland Developers Group - Delphi mailing list Post: [email protected] Admin: http://delphi.org.nz/mailman/listinfo/delphi Unsubscribe: send an email to [email protected] with Subject: unsubscribe
