![]() |
Das with-Statement in XE4
Ich zitiere jetzt mal aus dem inzwischen geschlossenen
![]() Zitat:
Delphi-Quellcode:
Statt so:
FormComponent.Property1.SubProperty2.SubProperty3.BoolValue:= xyz;
FormComponent.Property1.SubProperty2.SubProperty3.IntValue:= 123; FormComponent.Property1.SubProperty2.SubProperty3.StringValue:= 'xyz';
Delphi-Quellcode:
Oder
with FormComponent.Property1.SubProperty2.SubProperty3 do
begin BoolValue:= xyz; IntValue:= 123; StringValue:= 'xyz'; end;
Delphi-Quellcode:
Statt
var
fFForm: TForm; begin fForm:= TForm.Create; try fForm.AnyThing:= Foo; fForm.OtherThing:= Bar; finally fForm.Free; end; end;
Delphi-Quellcode:
WTF?
with TForm.Create do try
AnyThing:= Foo; OtherThing:= Bar; finally Free; end; |
AW: Das with-Statement in XE4
Ich sag mal: mit einer Variablen, wie in deinem zweiten Beispiel. Das erste finde ich, gelinde gesagt, sch*****. :mrgreen:
Und wirklich überraschend kommt der Move ja auch nicht. |
AW: Das with-Statement in XE4
Nein, das erwartet keiner.
Das Problem mit with ist, dass es Scopes verschleiert. Was ist, wenn Du in einem With-Block, den Wert von Tag des aktuellen Forms auf Sub-Controls schreiben willst? Bam-Scope-Konflikt.
Delphi-Quellcode:
Letzlich sparst Du Dir damit sogar noch eine Zeile ;-)
with FormComponent.Property1.SubProperty2.SubProperty3 do
begin BoolValue:= self.BoolValue; IntValue:= self.IntValue; StringValue:= self.StringValue; end; // wird dann zu var myObject: TypeOfSubProperty3; //... myObject := FormComponent.Property1.SubProperty2.SubProperty3; myObject.BoolValue:= BoolValue; myObject.IntValue:= IntValue; myObject.StringValue:= StringValue; |
AW: Das with-Statement in XE4
Eben. Eine kleine Variable erspart die Tipparbeit, und übersichtlicher als with ist es auch noch.
Delphi-Quellcode:
[edit] 2 L8 :( [/edit]
var
MyRecord: TSomeRecord; begin MyRecord := SomeClass.SomeListClass[0].SomeSubClass.RecordProp; MyRecord.SomeInt := 42; MyRecord.SomeString := 'Wuppdi'; |
AW: Das with-Statement in XE4
Zitat:
Und der Scope-Konflikt hat uns schon einige Tage Fehlersuche gekostet :wall: Mittlerweile bauen wir es überall aus wenn wir eh was an der entsprechenden stelle ändern müssen. |
AW: Das with-Statement in XE4
Und einen Ausdruck anzeigen im Debugger wird dann auch zur Freude...
Frank |
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
Ohne with ist voll daneben...
Besonders beim Zugriff auf XML Dateien über ein Interface... Aktuelles Beispiel
Delphi-Quellcode:
GrundDaten.Verfahrensdaten.Beteiligung.Beteiligter.Organisation.Registereintragung.Items[0].Inlaendisches_Registergericht.Registergericht_Ort.Content := 'Bonn'
Ohne With kann man das nicht mehr lesen oder mit arbeiten... Und jedesmal ne Variable vom entsprechenden Untertypen definieren? Schlechte wahl... Mavarik |
AW: Das with-Statement in XE4
Zudem gibt es immer wieder Probleme, weil Code nicht mehr kompilierbar ist. Ein Beispiel ist die Einführung von zusätzlichen Features in TRect. Dort gibt es ja nun Offset, was aber leider in der VirtualStringTree genau innerhalb eines with benutzt wurde. Und schon war nur deswegen der Code nicht mehr kompilierbar.
Andere Punkte wurden ja schon genannt, wie der dass ein einfaches Debuggen so gut wie unmöglich wird, da man für jede einzelne Auswertung einer Variablen diese komplett in den Auswerten-Dialog schreiben bzw. kopieren muss (zusammen mit dem Anteil in with). Das Zwei-Augen Prinzip beim Einchecken wird auch zur Farce, weil dabei niemand den Überblick wahren kann, wenn überall with steht. Da bleibt daher immer ein Unsicherheitsfaktor. Welche Eigenschaften wo existieren, kann niemand immer auswendig wissen, zumal sich dies auch durch neue Features in der RTL ändert. Davon abgesehen macht with in meinen Augen auch keinen Sinn. Der einzige "Vorteil" ist, dass man vielleicht etwas weniger tippen muss. Aber als Entwickler darf man ja nun wirklich nicht tippfaul sein, viel tippen gehört schließlich dazu...:shock: Der riesige Zeit- und damit Kostenaufwand, der dann aber folgt, weil der Code schlechter zu warten ist, ist damit jedenfalls gar nicht vergleichbar. Ein Musterbeispiel für eine Milchmädchenrechnung. Zitat:
Ich selbst habe es auch nie wirklich viel benutzt. Gut, am Anfang als ich noch nicht beruflich entwickelt habe, da habe ich über die Folgen nicht so sehr nachgedacht und es kam schon mal in meinen Quelltexten vor, aber nur selten. Zitat:
|
AW: Das with-Statement in XE4
Mal ganz davon abgesehen, dass mir das so ziemlich auf den Zünder geht (persönliche Meinung) dürfte das dazu führen dass viele Drittanbieter-Komponenten ziemlich lange brauchen werden bis sie für XE5 (oder wo auch immer with dann rausfliegt) verfügbar sind.
Am Rande bemerkt, ich habe in 16 Jahren Delphi-Coderei keinen Scope-Konflikt erlebt der mich Tage der Sucherei gekostet hätte. Vielleicht liegts ja auch an meinem Programmierstil oder wie ich die IDE bediene, was weiß ich. Jedenfalls käme ich aus heutiger Sicht kaum ohne with-Statement aus. Andererseits, wenn ich meinen 7-Jahre-Migrationszyklus in Betracht ziehe und das "with-CutOff" in 3 Jahren kommt, träfe es mich erst in 10 Jahren. Vielleicht habe ich bis dahin meine betreffenden Synapsen neu vernetzt ^^ Oder ich geh in Rente... |
AW: Das with-Statement in XE4
Zitat:
Bei mittlerweile über 1,5 Mio. Quellcodezeilen und einigen Bibliotheken die man selbst portieren musste (u. a. weil die Entwicklung eingestellt wurde ist man schon auf einge with-Fallen gestoßen die Teilweise sich gut in der SW-Versteckt hatten und man an ganz anderer Stelle zuerst gesucht hatte. |
AW: Das with-Statement in XE4
BTW:
![]() Soweit ich mich erinnere, hat das Castalia-"Eliminate with" aber nicht sooo toll funktioniert. Es wundert mich, dass das weder bei Delphi selbst noch bei Modelmaker dabei ist. |
AW: Das with-Statement in XE4
Zitat:
"7-Jahre-Migrationszyklus" klingt nach "ich arbeite auch noch mit D2007 wegen Unicode Umstellung".. :oops: Ich möchte wissen wieviel prozent der Entwickler immer noch mit D2007 arbeiten, weil die "alten" Projekte zu groß sind um diese auf Unicode um zu stellen... (Aber das ist ein anderer Thread) Ich möchte mal behaupten ich hatte NOCH NIE einen Fehler der aus einen With resultierte... Liegt vielleicht daran, das ich With nicht in der 1. Ebene benutze... Beispiel:
Delphi-Quellcode:
Dann schreibe ich
MyClass.Subclass.Coole.Text := 'Bla'
Delphi-Quellcode:
und nicht
With MyClass.Subclass do
Cool.Text := 'Bla'
Delphi-Quellcode:
So läßt sich das auch nachher immernoch super lesen...
With MyClass.Subclass.Cool do
Text := 'Bla' Mavarik |
AW: Das with-Statement in XE4
Zitat:
Zitat:
Das Debuggen geht deshalb heute mit XE3 auch sehr viel schneller, weil ich nicht ständig Ausdrücke in Strg + F7 auswerten muss, wenn ich in den Delphiquelltexten debugge, sondern einfach die Maus drüberhalten kann. Das hat mich die ganzen Jahre schon genervt... |
AW: Das with-Statement in XE4
Zitat:
Frank |
AW: Das with-Statement in XE4
Zitat:
Habe mir nie die Hände gewaschen, bevor ich die Kontaktlinsen wechsel'... ... ist mir noch nie was bei aufgefallen. Also KANN da ja garnix schiefgehen. Wirklich geile Logik und auch sehr professionell, wirklich. :thumb: Es gibt Sachen, die kann man persönlichem Geschmack überlassen, selbst beim Programmieren. Zum Beispiel bescheuerte Naming-Conventions, die Studien schon vor Jahrzehnten als sinnlos bis hinderlich überführt haben. Sind bescheuert: ja. Lassen sich nur entziffern, aber nicht lesen: ja. Aber sie schaffen keine wirklich fiesen Scoping Issues, da der Code selbst ja nur bescheuert aussieht, aber nicht per-se falsch ist. Manche Sachen sind aber objektiv schlechter als mind. eine ihrer Alternativen. Dann ist es falsch belehrungsresistent weiterhin darauf zu bestehen, dass linksüberholen sicher ist. "With" war mal im alten TP eine Optimierung im Umgang mit Records. d.h. Obwohl es sprachl. Mist war und eigentlich hätte gemieden werden müssen, gab es damals einen Grund das zu nutzen. (Weil es es einen vllt. messbaren Geschwindigkeitsvorteil brachte) Heute gibt es das nicht. Es ist ein Feature, das schlimmer als Goto ist. Denn Goto kann nicht plötzlich die Beudeutung deines Codes ändern, wenn du eine neue Version einer Library nutzt. Dein "super lesbares" Beispiel ist auch ganz toll geeignet um "With"s Problem aufzuzeigen: Die Library, die "Cool" deklariert, bekommt ein Update und "Text" heißt jetzt "Title". Jetzt änderst du "Text" aus dem nächsthöheren Scope. Super :thumb: Zitat:
|
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
So hätte man das With-Statement auch gestalten und die Unsicherheiten beim Scope vermeiden können:
Delphi-Quellcode:
Und als verschärfte Variante:
with FormComponent.Property1.SubProperty2.SubProperty3 as x do
begin x.BoolValue:= xyz; x.IntValue:= 123; x.StringValue:= 'xyz'; end;
Delphi-Quellcode:
with FormComponent.Property1.SubProperty2.SubProperty3 as x, Gameboard.Player[1] as y do
begin x.BoolValue:= y.Active; x.IntValue:= y.Score; x.StringValue:= y.Name; end; |
AW: Das with-Statement in XE4
Zitat:
Man müsste alle Bezeichner innerhalb des with-Statements auflösen. Also den nächstmöglichen Scope finden, aus dem sie kommen können. Das ist aber fehleranfälliger als man es erwartet. Gerade in Delphi, wo man als Tool nie weiß, ob man jetzt die Saucen nehmen kann, oder die .DCU hernehmen muss. |
AW: Das with-Statement in XE4
Zitat:
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
Delphi-Quellcode:
Man hat also nicht nur eine Variable, sondern diese existiert auch nur innerhalb des Blockes. :thumb:
with x := SomeExpression() do
x.DoSomething(); |
AW: Das with-Statement in XE4
Zitat:
Mag sein dass with allgemein nicht sehr beliebt ist. Aber das ist genauso eine persönliche Sicht der Dinge. Wenn es with nie gegeben hätte würde es mir wahrscheinlich gar nicht fehlen. So aber habe ich sogar in anderen Sprachen nach einem with-Äquivalent gesucht und enttäuschenderweise keins gefunden (z.B. PHP). Jetzt dürft ihr frohlocken... Zum Glück! Egal, es soll keine philosophische Diskussion werden. Zitat:
Ok, um wieder auf das Thema zurück zu kommen: Angenommen, with ist tatsächlich so unschön wie ihr es beschreibt und ich hatte es bisher bloß nicht als Problem wahrgenommen. Ganz ehrlich: Der Compiler (egal ob das alte D7 oder das neuere XE2) geben Hinweise und Warnungen en masse aus für jeden erdenklichen Firlefanz. Variablen, die deklariert und nicht verwendet werden z.B. Aber wenn with tatsächlich solche Scope-Probleme impliziert, warum gabs dafür bisher keine Hinweise? Ich meine, dann braucht sich wirklich niemand wundern, dass so eine Kreuzung aus Gewohnheitstier und Betonschädel wie ich sich dann aufregt ^^ @sx2008: Dein Vorschlag zur Erweiterung der with-Syntax finde ich exzellent! x und y könnten sogar untypisierte Ausdrücke sein, der Compiler wüßte durch das with-Statement auf was sie sich beziehen. Die Lösung wäre viel besser als das ersatzlose Streichen von with. |
AW: Das with-Statement in XE4
Zitat:
Zitat:
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
Zitat:
Andererseits hat ein Tool wie der ![]() |
AW: Das with-Statement in XE4
Zitat:
Hä? Wo ist denn da der Vorteil? Kann ich doch direkt so schreiben:
Delphi-Quellcode:
x := SomeExpression();
x.DoSomething(); Übrigens: Bei mir fliegt "With" auch überall raus, wo ich es finde. Aber Emba sollte es nicht einfach so aus dem Compiler entfernen. Ein deprecated oder ein anderer Compilerhinweis würde erst mal genügen. |
AW: Das with-Statement in XE4
Der Vorteil ist, dass mit der Zeile die Variable nicht nur zugewiesen, sondern auch deklariert wird.
|
AW: Das with-Statement in XE4
Ach so. Muss man in Oxygen nicht extra deklarieren? So so! Würde aber der Pascal-Syntax wiedersprechen, da alle Variablen eigendlich deklariert werden müssen. Oder?
|
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
Und eine SSD beschleunigt das ganze natürlich enorm, da hat Phoenix Recht, aber hier ist grad keine drin und es sind 10 Sekunden Startzeit. |
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
With nutze ich auch häufig und gerne. Scope Probleme hatte ich ebenfalls noch nicht.
Ich hoffe nur, dass es in "XE5" (oder wann es auch immer soweit sein wird, dass with wegfällt und wir im x86/x64 Compiler 0-based Strings haben) einen ordentlichen, stabilen und zuverlässigen Project Migration Wizard im Delphi geben wird, der alle with Blöcke ersetzen kann, alle String Deklarationen anpasst und alle aufgerufenen Stringfunktionen "korrigiert". Das ganze natürlich so, dass der Code mit IFDEFs optional auch noch abwärtskompatibel zu der Quell-Delphiversion bleibt. Wenn ich mir vorstelle, dass ich demnächst meine 10 Jahre "Tipparbeit" wieder einmal auf den Kopf stellen darf um irgendeiner aufgezwungenen RTL Umstellung gerecht zu werden, dann ... :kotz: ... weis ich nicht, wie lange ich überhaupt noch neue Projekte mit Delphi beginnen werde ... |
AW: Das with-Statement in XE4
Zitat:
|
AW: Das with-Statement in XE4
Zitat:
Code:
Am schönsten wäre es aber, wenn der String ein "1-based String" bleibt und für die zerobased Strings einfach ein neuer Typ mit eigenem Namen eingeführt wird. Der XE"n" Compiler könnte dann im Hintergrund die Strings in zerobased Strings verdrehen und "ZString" 1:1 als 0-basierten String verarbeiten. Dann eventuell noch ein Hinweis beim kompilieren "Variable S ist aus String deklariert. Ändern Sie die Deklaration in "S:ZString" um die interne Konvertierung zu umgehen...".
IFDEF RTLVERSION < "XE.n.Version"
i := pos('x',s); if i > 0 then ... ELSE i := s.indexof('x'); if i > -1 then ... ENDIF |
AW: Das with-Statement in XE4
Äh.. wir entfernen und gerade mit Warp 4 von den With-Statements...
Und ja ich weiss, bei der Startup-Time hab ich mit dem SSD-Hinweis auch schon Offtopic geantwortet... Wir sollten dennoch hier und jetzt weiter auf die With-Statements konzentrieren und für andere Themen dann neue Threads aufmachen. |
AW: Das with-Statement in XE4
Bezüglich 0-Based Strings ab XE4 gehts
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 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