[DUG] Why re-use when you can duplicate!

David Brennan dugdavid at dbsolutions.co.nz
Mon Jun 4 13:52:47 NZST 2012


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: delphi-bounces at listserver.123.net.nz [mailto:delphi-bounces at listserver.123.net.nz] On Behalf Of Jolyon Smith
Sent: Sunday, 3 June 2012 9:03 p.m.
To: todd.martin.nz at gmail.com; 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 <todd.martin.nz at gmail.com> 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: delphi at listserver.123.net.nz
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to delphi-request at listserver.123.net.nz with Subject: unsubscribe

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserver.123.net.nz/pipermail/delphi/attachments/20120604/e429ea1d/attachment.html 


More information about the Delphi mailing list