zappa2 hat geschrieben:- Hints über unused vars oder units:
Geschenkt, droht keine unmittelbare Gefahr. Der Sauberkeit halber sollte doch aber der Entwickler, der als letzter an dieser Unit rumwerkelt das bereinigen. Denn wenn der Berg immer größer wird, den man vor sich herschiebt, wird keiner mehr die Zeit opfern, das in Ordnung zu bringen. 20 Meldungen => kostet ein paar Minuten, weg sind sie. 200 aber: das war ja nicht ich, soll wer anderes machen. Tendenz: Verschlimmerung.
Ja, der großteil ist ja Unused Parameter. Das ist halt bei event basierter Programmierung einfach der Fall das die aufkommen, und da kann man auch nix machen. Wenn man die Argumente von einem Event nicht braucht, braucht man sie einfach nicht. Soweit ich weiß kann man in Lazarus die aber mittlerweile (ich glaub nur projektweit, nicht global) unterdrücken lassen, bin mir aber nicht so sicher (Ich hab sie einfach akzeptieren gelernt

)
zappa2 hat geschrieben:Depcrecatet finde ich einfach nur peinlich: 5 Stellen sind in 2 Minuten gefixed. So was sollte nicht vorkommen, darf nicht vorkommen. Meist steht sogar im Log, was man stattdessen nehmen sollte.
Grundsätzlich ja, aber Deprecation zu ersetzen ist nicht immer trivial. Ich hab mir die Codestellen nicht weiter angeschaut, aber ich habs schon selbst erlebt das die Funktion die genau das macht was man will deprecated ist, und es keine 1-zu-1 ersatz gibt, bzw. es echt kompliziert wird das selbe über andere Methoden zu erreichen. Eventuell warten die entwickler auch auf ein neues feature um das alte zu ersetzen (hatte ich schonmal in nem java projekt, wo wir n deprecated call nicht ersetzen konnten bis die nächste version von ner Lib draußen war die endlich die vernünftige alternative bildet). Da steckt man einfach nicht drin, und es sind immerhin nur 5 stück.
zappa2 hat geschrieben:Zum Signed/Unsigned: Das stimmt, da sollte man schon wissen was man tut. Ich vergewaltige übrigens auch hin und wieder gern negative Integer in Pointer, um sie als definierte Steuerungelemente z.B. TreeViews oder Grids als Object mitzugeben (z.B. negative sind IDs aus der einen Datenbanktabelle, positive aus einer anderen); funktioniert hervorragend. Und ich differenziere, wann ich PtrInt oder PtrUInt nehme - wie Du schon sagtest, man sollte schon wissen, was man wann nimmt.
Solang man weiß was man tut ist alles in Ordnung. Problematisch wirds eher bei der Übersetzung auf andere Plattformen. x86 und x86_64 garantieren soweit ich weiß das das geht (was übrigens nicht trivial ist, 64 bit Betriebsysteme und Prozessoren arbeiten für gewöhnlich auf 48 bit pointern, das so schweinereien also überhaupt gehen ist mehr dem guten willen von Intel und Co zu verdanken statt der unterliegenden technik). Aber auf anderen architekturen sieht das direkt ganz anders aus. Auf ARM ist soweit ich weiß nicht jede Zahl ein gültiger Pointer, d.h. Pointer(x) und Pointer(x+1) kann den selben pointer ergeben (es ist also nicht möglich hin und her zu converten ohne informationen zu verlieren), und damit kann das programm von einem ganz schnell in die Hose gehen. Und grade weil ARM prozessoren mehr und mehr werden (Handies, Raspies, und in zukunft eventuell sogar desktops) Versuche ich mittlerweile sowas ganz und gar sein zu lassen, wer weiß ob ich in 5 jahren nicht eine meiner Anwendungen mal auf ARM porten möchte
zappa2 hat geschrieben:Wegen der Targetplatform-Abhängigkeiten: Es gibt doch die define/ifdef-Clauseln. Für systemnahe Packages halte ich die für Pflicht. Das machen doch selbst wir kleinen Anwendungsentwickler, wenn wir parallel für Linux/Unix und Windows entwickeln. Für Systemprogrammierer sollte das doch dann erst Recht Pflicht sein - oder?
Ja in der LCL (sowie auch der RTL und FCL) wird das normalerweise so gehandhabt das der ganze Plattform spezifische code in eigenen Include dateien hockt, die dann je nachdem eingebunden werden:
Code: Alles auswählen
{$ifdef WINDOWS}
{$include ImplXYZWindows.inc}
{$else}
{$ifdef DARWIN}
{$include ImplXYZMacOS.inc}
{$else}
{$ifdef LINUX}
{$include ImplXYZLinux.inc}
{$endif}
{$endif}
{$endif}
Das problem ist, der FPC merkt sich nicht ob er jetzt in einem IFDEF Windows block ist oder nicht, und wenn er einen nicht portablen code findet meckert er, obs angebracht ist oder nicht. Genauso, selbst wenn der FPC sich das merken würde, gibt es ja noch "soft constraints", so kann man davon ausgehen wenn man windows hat das es auf ner x86 architektur läuft, weils einfach kein wirkliches Windows gerät auf einer anderen Architektur gibt (Windows phone ist tot und selbst das Surface läuft wieder auf x86)
zappa2 hat geschrieben:Und ja: unkritische Hints, die der Entwickler wohlwissend in Kauf nimmt, weil er an dieser Stelle um ihre Nichtrelevanz weiß, könnte man ja einfach mal unterdrücken. Ein Rechtsklick mit der Maus und im Kontextmenü den Punkt 'Meldungen xyz unterdrücken' = Klick - fertig.
Man kann auch über Compiler Switches bestimmte Warnings oder Hints für einen Code abschnitt deaktivieren. Wenn man also weiß das ein No-Portable Hint auftreten soll, kann man theoretisch einfach sagen: Für die folgende Funktion ignoriere alle No-Portable Hints. Aber um ehrlich zu sein kann ich den Lazarusentwicklern nicht verübeln sich nicht den Aufwand zu machen, ich würds wahrscheinlich nicht besser machen (bzw. ich weiß das ichs in meinen projekten nicht besser mache)
zappa2 hat geschrieben:Nochmal: die Jungs machen einen hervorragenden Job - das wird viel zu selten gewürdigt. Es sind nur diese kleinen Stolperstellen, die einen doch hin und wieder grübeln lassen.
Auf jeden Fall. Vor allem wenn man sich ansieht was da auch in den Letzen jahren geschehen ist. Als ich damals zu Lazarus 0.9.28 angefangen hab (Ist mittlerweile 10 Jahre her) war Lazarus zwar schon benutzbar und für ne Open Source IDE recht solide, aber im vergleich was seit dem alles geschehen ist, ist Lazarus mittlerweile zu einer Echt Top IDE geworden. Wenn ich eine GUI anwendung schreiben will, gibts mMn. kaum vernünftige alternativen. Für C++ und QT darf man mindestens mit dem doppelten aufwand rechnen für das selbe ergebnis (und muss unter Windows noch die paar hundert MB QT Libs mitliefern), bei .Not darf man entweder seine Seele an Microsoft verkaufen (i.e. Visual Studio/Xamarin benutzen) oder mit MonoDevelop sich auf GTK festschießen und mit einer deutlich schlechteren IDE arbeiten, oder bei Java direkt auf seinen Formulareditor verzichten und alles über Code regeln.
Zwar mach ich aktuell recht viel mit anderen Programmiersprachen (Arbeite mit C++, benutz Java für die Uni, etc.) und ich kritisier Lazarus auch sehr oft weil ich einfach sehe das andere Programmiersprachen einige sachen einfach besser machen (z.B. stackobjekte in C++ vs Objects oder Advanced Records in Pascal, oder Memory management mit Refrence count, etc.), aber letzendlich macht Pascal programmieren immernoch am meisten spaß, denn egal was, ich kann mir sicher sein ich bekomm es relativ einfach und schnell gelöst mit Lazarus. Einfach die Fähigkeit mal eben in 5 minuten eine schnelle form zu designen und simple sachen auszuprobieren ist schon gold wert (In der zeit in der ich in C++ überhaupt die toolchain aufgesetzt hab hab ich ja schon ein halbes projekt mit Lazarus fertig). Es ist vielleicht nicht optimal für alles, macht aber alles so gut das es immer meine goto lösung ist wenn ich nicht grade besondere vorraussetzungen hab.
Das einzige was mMn seit jahren fehlt ist endlich eine vernünftige Möglichkeit Lazarusprojekte über die Kommandozeile zu kompilieren ohne das GUI benutzen zu müssen (selbst für Lazbuild musst du zu erst über das GUI alle packages die du brauchst installieren)