![]() |
Clean Code - Default benutzen
Hallo,
ich bin gerade am grübeln zu der besten Variante. Gegeben sei ein
Delphi-Quellcode:
Dann gibt es ein function irgendwo, da will man das zurücksetzen mit den Werten 0. (In anderen function abers). Was ist da nun am Besten?
TBlaResult = record
one, two: Double; end;
Delphi-Quellcode:
Für mich ist bei a) schön, dass man explizit darstellt, dass es in diesem Fall die Werte 0 sind. Der Nachteil ist, dass wenn man mal TBlaResult erweitert und vergisst das hier anzupassen, man undefinierte Inhalte bekommt. (Hat FixInsight auch nicht gemerkt.)
//a)
function TBlaNullStrategy.DetermineBla(): TBlaResult; begin Result.one := 0.0; Result.two := 0.0; end; //b) function TBlaNullStrategy.DetermineBla(): TBlaResult; begin Result := Default(TBlaResult); end; //c) function TBlaNullStrategy.DetermineBla(): TBlaResult; begin Result := Default(TBlaResult); Result.one := 0.0; Result.two := 0.0; end; Bei b) kann das nicht passieren und ist auch schön kurz. Es ist allerdings nicht explizit, man muss wissen dass der Default-Wrt von TBlaResult eben dann auch 0 ist. c) wäre eine Kombination. Es kann nicht passieren und es ist auch schön explizit. Irgendwie aber auch DRY und auch mehr Code. Meinungen? |
AW: Clean Code - Default benutzen
Was wäre damit ?
Delphi-Quellcode:
TBlaResult = record
one, two: Double; procedure Clear; //das class function CreateNew : TBlaResult; static; // oder das end; |
AW: Clean Code - Default benutzen
Zitat:
Gegen c) spricht nichts - Ich bin kein Compiler-Experte, ich würde einem vernünftigem Compiler zutrauen die eigentlich überflüssigen Zuweisungen wegzuoptimieren. PS: Abgesehen davon dass ich, wie bereits vorgeschlagen, dem Record unbedingt eine Default-Methode verpassen würde. |
AW: Clean Code - Default benutzen
Ich bin nicht davon ausgegangen dass der Compiler das optimieren kann. Habe trotzdem kurz mal nachgeschaut (32-Bit):
Code:
Dass er zweimal die Adresse von Result holt finde ich dann aber schon etwas schwach. (Ich bin mir aber nicht ganz sicher ob nicht eine Optimierung hier ausgeschaltet ist)
Result := Default (...);
mov edx,[ebp+$08] mov edi,edx xor eax,eax stosd stosd stosd stosd Result.one := 0; mov eax,[ebp+$08] xor edx,edx mov [eax],edx mov [eax+$04],edx Result.two := 0; mov eax,[ebp+$08] xor edx,edx mov [eax+$08],edx mov [eax+$0c],edx |
AW: Clean Code - Default benutzen
genau um dies vollautomatisch an exakt nur einer einzigen Stelle im Programm pro Record zentral zu lösen, wurden doch mit Delphi 10.4 Sydney die "Custom Managed Records" eingeführt :)
So steht nun einer <> NULL Initialisierung und bei Bedarf sogar dem automatischem "Aufräumen" CleanCode mäßig nix mehr im Weg.
Delphi-Quellcode:
type
TMyRecord = record Value: Integer; class operator Initialize (out Dest: TMyRecord); class operator Finalize(var Dest: TMyRecord); end; class operator TMyRecord.Initialize (out Dest: TMyRecord); begin Dest.Value := 10; Log('created' + IntToHex (Integer(Pointer(@Dest))))); end; class operator TMyRecord.Finalize(var Dest: TMyRecord); begin Log('destroyed' + IntToHex (Integer(Pointer(@Dest))))); end; |
AW: Clean Code - Default benutzen
c) ist unnötig, wenn die Defaults eh 0.0 sind - das erledigt Default() schon - nur wenn sie von dem abweichen muss man da was setzen.
Dein gezeigner asm ist ohne Optimierung - mit sieht das so aus:
Code:
Man könnt sich jetzt noch darüber beschweren, dass er mehrfach eax leert, aber so ist er halt unser lieber Delphi Compiler - von Peephole Optimizations kein Plan :mrgreen:
Result := Default(TBlaResult);
0041BDB4 8BFB mov edi,ebx 0041BDB6 33C0 xor eax,eax 0041BDB8 AB stosd 0041BDB9 AB stosd 0041BDBA AB stosd 0041BDBB AB stosd Result.one := 0.0; 0041BDBC 33C0 xor eax,eax 0041BDBE 8903 mov [ebx],eax 0041BDC0 894304 mov [ebx+$04],eax Result.two := 0.0; 0041BDC3 33C0 xor eax,eax 0041BDC5 894308 mov [ebx+$08],eax 0041BDC8 89430C mov [ebx+$0c],eax Project456.dpr.30: end; 0041BDCB 5F pop edi 0041BDCC 5B pop ebx 0041BDCD C3 ret Ein gescheiter Compiler würd da übrigens sowas draus machen:
Code:
pxor xmm0, xmm0
movups [eax], xmm0 |
AW: Clean Code - Default benutzen
So müssen sich ungefähr früher die Bauern gefühlt haben wenn der Pfarrer was Lateinisches aus der Bibel gepredigt hat.
Ich verstehe kein Wort, aber wird schon alles richtig sein. |
AW: Clean Code - Default benutzen
Wir haben uns in dem Fall für b) entschieden, in anderen für c)
"class operator" bringt bei uns nichts. "Default" ist hier ja völig ausreichend. Vielleicht hätte ich auch noch explizit darauf hinweisen sollen, dass das hier in einer Strategie benutzt wird. |
AW: Clean Code - Default benutzen
Zitat:
Lern Assembler (lesen): ![]() |
AW: Clean Code - Default benutzen
Zitat:
Bis bald... Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz