![]() |
AW: Eure besten Quellcode Kommentare...
@Himitsu:
Pack mal inen Funktionsnamen nen LR-Overwrite Character rein. Das ist lustig :D. Dann kannst du die dinge Teils spiegelverkehrt schreiben, und IDE und Compiler schluckens :D |
AW: Eure besten Quellcode Kommentare...
Geil, Variable rückwärts schreiben und umgedreht anzeigen.
Selbst wenn jemand den Namen abschreibt und sich in deine Klasse häcken will, dann kompiliert nichts, weil er ja verkehrtrum schreibt. :lol: Die extrem jugendgefährdeten Kommentare hab ich aber besser mal weggelassen. Sorry, war etwas genervt. TJSONObject.ParseJSONValue gibt einfach wortlos NIL zurück, und keine Ahnung warum, denn in der Datei ist jetzt ein valides JSON-Objekt drin. Vorher JSONObject.ToString entdeckt, dass es totalen Schrott produziert, wie z.B. keine " und sonstige Steuer und Nicht-ASCII-Zeichen zu kodieren, aber vorallem \ und " unkodiert zu lassen ist der Megaburner und gehört eigentlich mit Steinigung bestraft. Und JSONObject.Parse hört einfach mitten drin auf, wenn ihm was nicht gefällt und lässt dann netterweise defekte/unvollständige Subobjekte zurück. Delphi DBXJSON.pas aus Delphi XE.
Delphi-Quellcode:
Der Code, wie er schön aussähr, aber nicht funktioniert:
J := TJSONObject.Create;
try J.AddPair(...); J.AddPair(...); ... // der DRECK im ToString kodiert die Steuerzeichen nicht //TFile.WriteAllText(Datei, J.ToString, TEncoding.UTF8); B := TEncoding.UTF8.GetPreamble; i := Length(B); SetLength(B, i + J.EstimatedByteSize); J.ToBytes(B, i); while B[High(B)] = 0 do Delete(B, High(B), 1); // Trim, denn EstimatedByteSize gibt etwa 4 Mal zuviele Bytes zurück TFile.WriteAllBytes(Datei, B); finally J.Free; end; //J := TJSONObject.ParseJSONValue(TFile.ReadAllText(Datei)) as TJSONObject; J := TJSONObject.Create; try J.Parse(TFile.ReadAllBytes(Datei), Length(TEncoding.UTF8.GetPreamble)); // Bei Ladefehler hat das letzte SubObjekt (Size-1) eventuell keinen Namen und es knallt dann bei der Namenssuche if not Assigned(J) then raise Exception.Create('Fehler beim Laden der Datei'); if not ((J.Size > 0) and Assigned(J.Get(J.Size-1).JsonString) and Assigned(J.Get('last_sql_columnwidth'))) then raise Exception.CreateFmt('Fehler beim Laden der Datei (Item %d)', [J.Size]); S := J.Get(ValueName).JsonValue.Value; // Dieses .Value ist natürlich leer, darum oben auch .JsonValue.Value ... finally J.Free; end;
Delphi-Quellcode:
J := TJSONObject.Create;
try J.AddPair(...); ... TFile.WriteAllText(Datei, J.ToString, TEncoding.UTF8); finally J.Free; end; J := TJSONObject.ParseJSONValue(TFile.ReadAllText(Datei)) as TJSONObject; try S := J.Get(ValueName).Value; ... finally J.Free; end; |
AW: Eure besten Quellcode Kommentare...
Delphi-Quellcode:
:-D
try
(Gedöns) except // Gibt schlimmeres end; |
AW: Eure besten Quellcode Kommentare...
Zitat:
Ich hatte mal ein mittelgroßes Projekt (ca. 200 Forms) übernommen, bei dem das grundsätzlich so gemacht wurde. Die Anwender hatten sich daran gewöhnt nach einer durchgeführten Aktion noch mal zu prüfen ob es geklappt hatte. Die Mitarbeiter in der Abteilung wunderten sich nur, warum immer wieder falsche, unvollständige oder defekte Datenbankeinträge da waren. Da wurde jeden Tag auf der Datenbank "repariert". Als ich das Projekt übernahm, habe ich alle
Delphi-Quellcode:
gesucht und entfernt.
except end;
Ergebnis: Die Anwendung war unbenutzbar. Im Sekundentakt sind Fehlermeldungen aufgetreten. Bei jedem Create eines Formulars ist eine GPF aufgetreten. (Fehler in der Basisklasse) Viele Copy & Pase Fehler. (Ein Mal falsch gemacht und immer wieder kopiert.) Durch einige einfache Suchen & Ersetzen Aktionen waren mehrere 100 Fehler weg. Die Anwender mussten umlernen. Keine Fehlermeldung = hat geklappt. Dafür gabs ab und zu Fehlermeldungen, die automatisch geloggt und abgearbeitet wurden. Nach ein paar Monaten war es dann "fehlerfrei". Und 2 Leute arbeitslos, da sie nicht mehr den ganzen Tag die Datenbank reparieren mussten ;-) Ich hasse Programmierer die so was verwenden :evil:
Delphi-Quellcode:
FixInsight mahnt das zum Glück an.
try
... except end; Ich empfehle immer nur den "erwarteten" Fehler zu prüfen. Es kann ja immer etwas unerwartetes passieren ;-)
Delphi-Quellcode:
In unterem Beispiel wird ein String einer Integer Eigenschaft eines Objekts zugewiesen.
// Zahl in Value in MeinObjekt.IntegerProperty ablegen
procedure Beispiel(const Value: string); begin try MeinObjekt.IntegerProperty := StrToInt(Value); except // Fehlerbehandlung wegen 'Zwei ist kein gültiger Integerwert.' end; end; ... begin Beispiel('Zwei'); end; Der Programmierer hat daran gedacht, dass auch ungültige Zahlen wie z.B. "zwei" übergeben werden können. Aber er geht davon aus , das MeinObjekt immer existiert. Was wenn MeinObjekt = Nil ist? Das Beispiel unten würde dann zumindest eine Exception (oder GPF) werfen.
Delphi-Quellcode:
// Zahl in Value in MeinObjekt.IntegerProperty ablegen
procedure Beispiel(const Value: string); begin try MeinObjekt.IntegerProperty := StrToInt(Value); except on E: EConvertError do begin // Fehlerbehandlung wegen 'Zwei ist kein gültiger Integerwert.' end; end; end; ... begin Beispiel('Zwei'); end; |
AW: Eure besten Quellcode Kommentare...
TryStrToInt :stupid:
Nacholgendes ist Beides das Gleiche, auch wenn es kein schöner Code ist, außer da kommt wirklich "ständig" irgendwelcher Schrott, der aber niemanden interessiert.
Delphi-Quellcode:
Aber beim Debuggen wirst du schnell den Schuldigen erwürgen wollen, welcher Letzeres genommen hat, voallem wenn diese Funktion im Minutentakt mit Nichtintegern ausgeführt wird.
i := StrToIntDef(S, 0);
try i := StrToInt(S); except i := 0; // S ist kein Integer end; |
AW: Eure besten Quellcode Kommentare...
Oh, nichts überbietet ein gepflegtes
Delphi-Quellcode:
in der dpr...
begin
try . . . Application.Run; except end; end. :wall: Sherlock |
AW: Eure besten Quellcode Kommentare...
Nach dem "-->"
Code:
procedure TIsoPositionCmdTest.Test_InitData_CharacteristicID();
begin m_ReferenceSystemInformationServiceMock.SetFunctionResult<referenceSystemCaseET>('DetermineReferenceSystemCase', rsc11EC); m_ReferenceSystemInformationServiceMock.SetFunctionResult<TOrientationSet> ('AvailableToleranceZoneOrientationKinds', []); m_ReferenceSystemInformationServiceMock.SetFunctionResult<TSourceElementsKindSet> ('AvailableToleranceZoneOrientationSources', []); { Puh: Mit dieser Zeile bringt man Wissen um die Implementiereung in den Test. Auch wenn von der Implementierung, von welcher hier die Rede ist, am Besten niemand etwas wüsste ;-). Der Test hier will eigentlich nur herausfinden, ob das richtige Element aus den beiden Elementfenstern für das zu tolerierende Element herangezogen wird. Diese Logik ist allerdings im InitData gut versteckt und eingebettet, so dass auch der Test dazu InitData aufrufen muss. --> InitData ist nun aber einer der schlimmsten Orte auf Erden. Das Ungemach, welches einem dort begegnen kann, ist zu düster und umfangreich um es hier detailliert aufzuzeigen. InitData startet auch die Berechnung. Man versucht es zwar über ValidForCalculation zu verhindern, aber auch diese Methode ist unzureichend implementiert. Man geht dann aber wenigstens davon aus, dass dann das Merkmal in seinem Calculate schon jammert wenn was nicht passt. Würde es auch tun. Allerdings bedient sich das Positionsmerkmal dazu eines Services und der Success jenes Calculate ist im SetUpMocks mit true intialisiert. Darf halt nicht sein und deswegen hier das umstellen auf false.} m_ReferenceSystemGeneratorServiceMock.SetFunctionResult<IReferenceSystemCalculationResult>('Calculate', CreateReferenceSystemCalculationResult(false, identityMat4C, identityMat4C, '', sraUndefinedEC)); Self.InitStatusDatabaseWithIdsAndDelegate('Kr1', 'Zyl1'); CheckInitDataCharacteristicID(); end; |
AW: Eure besten Quellcode Kommentare...
Zitat:
Die eigentlich Frage lautet : Was ist Dir wichtiger...? Beispiel : Gegeben sein eine Software die bei 5000 Kunden im Einsatz ist. Gegeben sein eine Routine die bei diesen Kunden jeden Tag 100 Briefe ausdruckt... Es gibt ein Softwareupdate das im Footer die Seitenanzahl ausgeben kann. In diese Routine hat sich ein Fehler eingeschlichen. Dadurch wird die Seitenzahl nicht eingedruckt. Der try except end Abfänger verhindert eine Fehlermeldung... Status : Alle Kunden sind glücklich - alle Briefe wurde gedruckt. Alle können "fehlerfrei" arbeiten! Bei jedem Kunden 100x pro Tag ein Exception Fenster. Ist keine Option. Das würde nur die Hotline überlasten. Von jeder Exception eine E-Mail (500.000 Stk.) ist auch keine Option. Dann doch lieber einen Anruf von einem Kunden oder zwei (mehr merken es nicht, weil keiner die Neuerungsliste gelesen hat) der mitteilt, dass die Seitenzahl fehlt... Also so pauschal kann man also doch nicht sagen ein "Try Except End" ist immer böse... Gut, die Qualitätskontrolle hat versagt... Aber wer hat schon für so etwas ein Test-Team oder einen Unittest - 30 Jahre alter Software? :twisted: Positiver Nebeneffekt - Die Kunden sagen: "Das ein oder andere Funktioniert noch nicht, aber dafür gibt es keine Exceptions in der Software..." Mavarik PS.: Oje... was werde ich dafür wieder an Kommentaren ernten.. |
AW: Eure besten Quellcode Kommentare...
Es geht vorallem um die leeren Try-Except, also wo im Fehlerfall rein garnichts gemacht wird, bzw. wo der Fehler fahrlässig nicht/falsch behandelt wird.
Fehler abfangen und loggen ist auch eine Behandlung. zu deinem Beispiel: * fehlt nur die Seitenzahl, aber das dokument kommt raus, dann isses OK * wird dennoch die "Zahl" geschrieben, aber mit einem falschen Wert, dann wird es schon problematischer * wird garnichts mehr gedruckt, andere Teile fehlen im Ausdruck oder sind dadurch falsch, dann wäre es nicht nett, wenn der User die Fehlermeldung nicht bekommt |
AW: Eure besten Quellcode Kommentare...
Ich würde zudem argumentieren dass die Qualitätsprüfung insb. dann fehlschlägt, wenn kein offensichtlicher Fehler auftritt. Wenn denen eine Exception um die Ohren fliegt, wird das Update nicht rausgehen. Weil aber Fehler geschluckt werden, sind Kleinigkeiten falsch die den Testern nicht auffallen, und der Kunde bekommt die Bananensoftware zum selbertesten.
Aber gut, jeder darf selbst die Qualität seiner Software bestimmen. (was schreibst du dann eigentlich in deine Patch-/Update-Beschreibungen? "Druckt Seitenanzahl - vielleicht"?) |
AW: Eure besten Quellcode Kommentare...
Zitat:
Zitat:
Wenn Du nicht in der Lage bist Deine Software (wenigstens einigermaßen) zu testen, solltest Du von Deinen 5000 Kunden 25 fragen, ob sie an einen Beta Test teilnehmen möchten. Im Beta Test kannst du schnell neue Versionen ausrollen und die Kunden sind oft dankbar, das sie schon die neuen Funktionen nutzen können. Langfristig hast Du aber viel mehr zufriedene Kunden (, bei denen die Seitenzahlen richtig geduckt werden;) Und diese Kunden haben dann auch zufriedene Kunden, da auf ihren Schreiben keine falschen Seitenzahlen gedruckt wurden. ;) Verstehe mich nicht falsch. Es spricht nichts dagegen Fehler zu klassifizieren und "unwichtige" Fehler "nur" zu loggen und den Anwender nicht damit zu belästigen. Aber durch das fehlende
Delphi-Quellcode:
oder das böse
on E: Fehlerklasse
Delphi-Quellcode:
darauf zu verzichten nicht klassifizierte also unbekannte Fehler zu entdecken, finde ich fraglich.
try ... except end;
Ich möchte beim Autofahren auch erfahren, wenn ein unbekanntes Problem bei meinen Bremsen auftritt. Unwichtige "bekannte" also klassifizierte Fehler interessieren mich hingegen nicht. Das erwarte ich von den Programmierern der Software in meinem Auto. |
AW: Eure besten Quellcode Kommentare...
Zitat:
Nee, Spaß beiseite - schon klar worum es Dir geht... (Ist auch der falsche Thread für diese Diskussion) |
AW: Eure besten Quellcode Kommentare...
Zitat:
Unter dem Strich hast Du natürlich zu 100% Recht. Also gibt es "eigentlich" nix was man hierzu erwidern kann |
AW: Eure besten Quellcode Kommentare...
Zitat:
[edit] In 9 Tagen ist das 10 Jahre her !!! Der 1. Beitrag in diesem Thema ist vom 20. Jul 2007 [/edit] |
AW: Eure besten Quellcode Kommentare...
Zitat:
Delphi-Quellcode:
try
if benutzerMöchteBremsen() then zieheBremsenAn(); except // Gibt schlimmeres end; |
AW: Eure besten Quellcode Kommentare...
Delphi-Quellcode:
Das Microsoft-Auto der Zukunft: "Ein Unfall wurde erkannt, wollen sie, dass der Airbag jetzt auf geht?"
if BenutzerMöchteBremsen then
ZieheBremsenAn; // wenn's nicht klappt ... k.A. was passiert, aber der Benutzer bekommt wenigstens erstmal sofort mit, daß jetzt doch nicht gebremst wird und kann anders drauf reagieren (rausspringen) try if BenutzerMöchteBremsen then ZieheBremsenAn; except NotfallAnhalteProzedur; // Anker abwerfen end; |
AW: Eure besten Quellcode Kommentare...
Ihr werdet offtopic! Bitte diskutiert die Fehlerbehandlung mit try-ecept in einem eigenständigen Thread.
|
AW: Eure besten Quellcode Kommentare...
Irgendwie liest sich
Delphi-Quellcode:
schon etwas komisch :dance:
(...)
else Result := Succ(self); |
AW: Eure besten Quellcode Kommentare...
Das ist zwar kein Kommentar, aber auch nicht schlecht:
Delphi-Quellcode:
ShowMessage('Ups! An error occured!' + sLineBreak + 'The developer didn''t remove some obsolete code.' + sLineBreak + 'Maybe you let him know about this mistake? =)');
|
AW: Eure besten Quellcode Kommentare...
ShowMessage-Fehlerbehandlung?
Delphi-Quellcode:
raise EProgrammerNotFound.Create('Ups! An error occured!' + sLineBreak + 'The developer didn''t remove some obsolete code.' + sLineBreak + 'Maybe you let him know about this mistake? =)');
Wenn Delphi schon einen passenden Typ mitbringt, dann wäre es doch schön, wenn er öfters auch benutzt wird. (ich hab auch das Gefühl, dass Viele ihn nichtmal kennen) Ich hatte auch mal 'nen Code in unserem Programm, der sah etwa so aus
Delphi-Quellcode:
Nja, es sah dann doch einer der Kunden und guckte nicht schlecht.
else
raise EProgrammerNotFound.Create('Das sollte eigentlich niemand sehen, ....'); Bei einem späteren Umbau wurde was vergessen und es sprang dann doch da rein, nach nichtmal 3 Monaten. |
AW: Eure besten Quellcode Kommentare...
Zitat:
Der Code steht in einer Unit die ich nicht mehr verwende. Bzgl EProgrammerNotFound ![]() |
AW: Eure besten Quellcode Kommentare...
// glauben wir an das gute - bis wir es mal wieder besser wissen :-) Läuft übrigens seit Jahren. Eine Portion Zuversicht scheint nie verkehrt zu sein. |
AW: Eure besten Quellcode Kommentare...
Auch wenn es nicht gerade Kommentare sind: Die meisten größeren Projekte haben bei mir eine Art Kernel-Klasse. Die heißt manchmal TNexus, manchmal TNebula und in einem Fall TTasse.
|
AW: Eure besten Quellcode Kommentare...
Das nennt selbstkommentierenden Code.
|
AW: Eure besten Quellcode Kommentare...
Zitat:
![]() |
AW: Eure besten Quellcode Kommentare...
Delphi-Quellcode:
Ich weiß, man könnte auch einfach nur try pi:=Printer.PrinterIndex; // Drucker installiert? MachWasSinnlosesMit(pi); // Warnung unterdrücken H2077 Auf 'pi' zugewiesener Wert wird niemals benutzt except on EPrinter do begin //.. end; end;
Delphi-Quellcode:
aufrufen und den Rückgabewert ignorieren.
Printer.PrinterIndex;
|
AW: Eure besten Quellcode Kommentare...
Was Sinnloses Nutloses mit PI, denn der Compilier ist nicht schlau genug, um zu erkennen, das hier nichts gemacht wird:
Delphi-Quellcode:
if pi = 0 then ;
oder ohne Variable
Delphi-Quellcode:
try
if Printer.PrinterIndex < 0 then raise Exception.Create('nö'); except ... Sinnlos finde ich aber den Kommentar am TThread.ForceQueue. Man hätte auch das Queue direkt reparieren können und wenn man mag, dem einen Parameter
Delphi-Quellcode:
verpassen. :wall:
WennDuWillstDannEbenDochSofortFallsImHauptthread: Boolean=False;
|
AW: Eure besten Quellcode Kommentare...
Nachdem wiederholte "Optimierungsversuche" eines Kollegen an dieser Stelle zu überraschend zeitaufwendiger Fehlersuche geführt haben:
Delphi-Quellcode:
begin
{!!!hier nicht ändern!!!} ... |
AW: Eure besten Quellcode Kommentare...
Zitat:
|
AW: Eure besten Quellcode Kommentare...
Message für Merge-Commit: Ab jetzt hilft nur noch beten...
|
AW: Eure besten Quellcode Kommentare...
Zitat:
|
AW: Eure besten Quellcode Kommentare...
Delphi-Quellcode:
beim durchstöbern entdeckt (:
//[07/05/09 - 21:07] [#62] Du magst ja Herausforderungen, hier ist eine aber ich erhalte immer Access Violations (dll<>programm)
//[07/05/09 - 23:12] [#7] wieso alles so verschachtelt bis zum getno, nochma von vorn mit mehr struktur ---kotz und danke für die arbeit //[07/05/09 - 23:51] [#7] -> fertig & lass deine hände davon, gucken erlaubt -> anfassen NEIN |
AW: Eure besten Quellcode Kommentare...
Es ist nicht direkt ein Quellcode-Kommentar, sondern mehr ein kleines Easteregg:
Vor vielen vielen Jahren gab es mal ein schrecklich kompliziertes Matlab-GUI, mit GUIDE gebaut. Auf einem Form lagen diverse Groupboxes mit unterschiedlichen Bedeutungen. In jeder Groupbox gab es einen Button zum Laden einer Binärdatei mit der Caption "Bin Laden" (in genau dieser Schreibweise). Der Komponentenname hieß logischerweise "Osama1", "Osama2" usw. Hielt mal STRG-SHIFT-ALT gedrückt beim Anklicken, versteckte sich ein kleiner Taliban in den "Bergen", die auf einer Graphenausgabe gezeichnet wurden. Im Falle eines visualisierten Übersteuerns der Kurve, also Fehlerfall, sprang der kleine Bösewicht hervor. Ich glaube, das Programm wurde in der Form viele Jahre an die Anwender ausgeliefert ^^ |
AW: Eure besten Quellcode Kommentare...
Delphi-Quellcode:
procedure TSpielerMensch.SpielFortfahren; override;
begin //Der Mensch sieht das selbst. end; |
AW: Eure besten Quellcode Kommentare...
Heute darübergestolpert (ßßß von mir ersetzt)
Delphi-Quellcode:
unit ßßß;
{****************************************************************************** PROJECT : ßßß SUBPROJECT : ßßß ............................................................................. DESCRIPTION: Contains DTOs (Data Transfer Objects) for carriage manager testautomation services. All DTOs contain are fields of data - there is no logic implemented in here. I did my best to prevent 'mistakes' of this sort, but please please do not implement logic in the DTOs. ---- WARNING ---- WARNING ---- WARNING ---- WARNING ---- WARNING ---- WARNING ---- WARNING ---- WARNING ---- ************************************************************************************************************* * If you want to use the Embarcadero JSON classes, there is one braindead implementation * * detail you NEED to know about, before implementing your classes. They absolutely require * * your fields to be in the form: * * * * FSomeField : String; * * property SomeField : String read FSomeField write FSomeFields; * * * * The reason for this is that they hardcoded add a 'F' character to the field names coming in from * * JSON. So if the JSON code says the field's name is 'foobar', they change that to 'Ffoobar', without * * any checks, without any choice, without any error message if (when) that braindead hack kills inter- * * operability. Anything not in that form (for example a member variable called m_something) will NOT * * be reconstituted back into the object, even though the parser DOES find the field in the JSON code, * * since THAT TOO WILL BE RENAMED to Fm_something! They do NOT check whether a field is a property before * * messing up the name! Furthermore, subsequent calls of serialization / deserializatoin lead to field * * names like FFFFFMyField. So please, just follow embarcadero's religion about how field names gotta * * look. * * * * This is literally the worst JSON implementation I've ever seen and shows the complete lack of skill of * * embarcadero's 'engineers'. -- ßßß * * * ************************************************************************************************************* If you want to see where that hack is located, it's in the unit REST.JsonReflect, the function TJSONUnMarshal.ConvertFieldNameFromJson starting at line 2446 ff. } interface |
AW: Eure besten Quellcode Kommentare...
Wahnsinn wie dieses blödsinnige F-Prefix die Emotionen immer wieder hochkochen lässt.
Natürlich auch hier. Zitat:
Zitat:
|
AW: Eure besten Quellcode Kommentare...
Ist halt ein Pseudostandard, so wie Ereignisse immer mit einem "On" beginnen sollten, aber auch nicht immer tun in der VCL. Letztlich sollte man einfach konsequent bei einem Stil bleiben. Besonders im Team. Ich finde nichts schlimmer als Code, den nur der Autor lesen kann.
|
AW: Eure besten Quellcode Kommentare...
Zitat:
|
AW: Eure besten Quellcode Kommentare...
"Ich weiß, Sie sind unersetzlich, aber ich liebe Herausforderungen."
Gruß K-H |
AW: Eure besten Quellcode Kommentare...
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 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