Evolution statt Revolution

Begonnen von RichardCZ, 19 April 2020, 12:39:04

Vorheriges Thema - Nächstes Thema

RichardCZ

siehe https://forum.fhem.de/index.php/topic,110348.msg1044267.html#msg1044267 ff

Mein Vorschlag - in dieser Reihenfolge. Refactoring ist eine multi-pass Angelegenheit, aber man muss ja nicht mehr Schritte machen als nötig und einige Schritte bedingen andere, bzw. verringern die Gefahr des "um die Ohren Fliegens":

Steinzeit -> Bronzezeit

  • use strict; use warnings - ohne geht's nicht!
  • perlcritic -5 -4
  • insbes. Prototypen & "Forwarddeklarationen" entfernen
  • return undef -> return
  • subs explizit mit return beenden
  • FHEM-spezifische Bugs: min/max checken
  • my $x = 1 if (blah)  ist tödlich

Bronzezeit->Eisenzeit

* Unterschiede/Gemeinsamkeiten zwischen true, false, 0, 1, leerem String und undef lernen und verstehen. Ohne das geht's nicht, auch als "Hobbyprogrammierer".
* Unterschied zwischen numerischem und string Kontext verstehen (das ist das tiefere Verständnis von o.g. min/max Problem); == vs. eq etc.


  • perltidy
  • shift anstelle @_
  • FHEM-spezifisch: _Init,_Define,... als coderefs anstelle von (symbolischen) Strings
  • unless(x) => if(!x), foreach => for, kein until; (besonders gute Eisenschwerter: De Morgan Transformation kennen)
  • nach for kommt immer my (und nach Komparativ immer "als")
  • schreibt Kommentare, aber bitte keine deutschen Kommentare; Korrekturlesen ist auch gut.

Eisenzeit->Frühmittelalter

  • perlcritic -3
  • regex mit m{...]xms achtung: nicht kopflos! Leerzeichen -> \s; Nun könnt ihr Regexen formattieren, mit Kommentaren versehen...
  • strings mit q{..} bzw. qq{...}
  • defined-or Operator nutzen! (//) (bei den shifts aus der Eisenzeit)
  • CORE Module statt eigener Räder nutzen. Siehe corelist

Frühmittelalter->Hochmittelalter

  • if-elsif Bandwürmer entfernen (tabular ternaries, data-driven design)
  • Generell Komplexität von Funktionen reduzieren. Wenn eine Sub mehr als 70 Zeilen hat, ist irgendwas falsch.
  • entfernt diese peinlichen Changelogs am Anfang der Quelltexte
  • Code-Duplikate entfernen, Daten-Duplikate entfernen
  • Tiefhängende Frucht: __END__ nach dem 1; und vor dem =pod

Hochmittelalter->Spätmittelalter

  • Copyright und Lizenzanmerkungen gehören unter =pod
  • if-elsif Komplexitäten reduzieren; if-elsif Zweige mit returns sind unabhängige if-Zweige
  • Evtl. mal ne Bedingung negieren und früher aus dem Code springen, als riesen if-Oschis zu mästen
  • Generell sollte jetzt der Code einen handwerklich guten Eindruck machen, denn wir wollen in die




Neuzeit (Reformation)

  • Sich unbedingt von main:: lösen => eigener Namespace
  • also dünne main:: Interface-Schicht, und dann package <Eigener Namespace>
  • Erst wenn, aber sobald man einen eigenen Namespace macht, kann man sich einige Sachen mehr erlauben
  • Code soll utf8 kodiert sein, use utf8; HTML-Entities -> native encoding/Zeichen
  • Nicht vorher! Ansonsten pfuscht man anderen rein!
  • Wir denken nach, bevor wir Datenstrukturen machen. Wo eine Liste gebraucht wird, nehmen wir eine Liste, wo ein Hash, ein Hash. Nicht andersherum!
  • Wer sich ständig bei for (sort keys %hash) ertappt (oder ertappt wird) macht was falsch!

So. ;-) Jetzt kann jeder schauen wo er ist. Und jeder kann schauen wo er bleibt.


Weiter machen wir dann, wenn genügend in der Neuzeit angekommen und bereit für die Aufklärung sind.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

zap

Sind einige gute Vorschläge dabei. Insbesondere die Dinge, die man auch für die meisten anderen Programmiersprachen unterschreiben kann.

Viele andere werde ich ignorieren, erstens weil es nur Vorschläge sind und zweitens, weil ich es kann.

Beispiel Prototypen bleiben bei mir drin und ich habe keine Angst vor Funktionen mit mehr als 70 Zeilen, sofern es sinnvoll ist.
Wo kommt eigentlich die 70 her? Funktionen dienen v.a. dazu, redundanten Code zu vermeiden. Auch eine Funktion mit 140 oder 500 Zeilen kann übersichtlich sein. Warum sollte ich Code, der nur einmal ausgeführt wird, in eine Funktion auslagern, nur um die aufrufende Funktion unter 70 Zeilen zu bekommen?
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

RichardCZ

Zitat von: zap am 19 April 2020, 13:46:02
Viele andere werde ich ignorieren, erstens weil es nur Vorschläge sind und zweitens, weil ich es kann.

Immer wenn ich mir mit irgendwas Mühe mache, ist es ungemein wichtig, dass Du klarstellst, was alles davon Du ignorieren wirst (nun das dritte Mal wenn ich recht mitzähle).
Schon über ganzseitige Anzeigen in der Lokalzeitung nachgedacht?

Zitat
Beispiel Prototypen bleiben bei mir drin und ich habe keine Angst vor Funktionen mit mehr als 70 Zeilen, sofern es sinnvoll ist.
Wo kommt eigentlich die 70 her? Funktionen dienen v.a. dazu, redundanten Code zu vermeiden. Auch eine Funktion mit 140 oder 500 Zeilen kann übersichtlich sein. Warum sollte ich Code, der nur einmal ausgeführt wird, in eine Funktion auslagern, nur um die aufrufende Funktion unter 70 Zeilen zu bekommen?

Ich habe das jetzt nicht verstanden. War das eine Frage oder ein Statement?
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

igami

Zitat von: zap am 19 April 2020, 13:46:02
Viele andere werde ich ignorieren, erstens weil es nur Vorschläge sind und zweitens, weil ich es kann.
Diese Vorschläge sind für mich sehr Hilfreich, da ich jemand bin, der "es nicht kann".

Ich kann auch sagen "meine Module funktionieren doch, was soll ich daran etwas ändern?" aber ich werde nicht immer Maintainer sein.
Wir hatten schon den Vorfall mit den Modulen von Dietmar, bei dem die Erben den ganzen Code umgeschrieben haben, weil unverständlich. Da wäre es doch schön, wenn wir uns auf gemeinsame Richtlinien einigen könnten.
Wenn du einem Vorschlag nicht zustimmt, dann Begründe das doch bitte und mach einen Gegenvorschlag.
Andernfalls bitte wirklich ignorieren und unkonstruktive Beiträge unterlassen.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Icinger

Jetzt muss/will ich mich auch mal kurz zu Wort melden.

Bin bisher eigentlich nur stiller Mitleser und amüsiere mich teils sehr darüber, was hier abgeht.

Ich kann zwar (bis zu einem gewissen Grad) manche Personen hier verstehen, die gleich mal auf Abwehrhaltung gehen, weil hier plötzlich jemand "neuer" aus dem Nichts auftaucht und ganz ungefragt RambaZamba macht.
Noch dazu, wo Richard nicht unbedingt eine sehr politische Schreibweise hat.
Aber ganz ehrlich, so wie Igami grad geschrieben hat: Es ist irgendwie schade, wenn ständig nur gemeckert wird, aber keine wirklichen Gegenargumente kommen.

Andererseits finde ich die Initiative und Argumente von Richard durchaus als sehr positiv und nehme davon gerne vieles auf.
Bin aktuell auch grad dabei, mein OBIS-Modul ein wenig zu refactorn, da ist durchaus einiges zu verbessern.
Ist ja auch für andere hier von Vorteil, wenn der Code verständlicher ist. Umso leichter kann vielleicht der eine oder andere dann zB einen Patch liefern, weil demjenigen etwas fehlt.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

RichardCZ

Und für alle anderen, die so mitlesen: Die Prototypen in FHEM sind echt schlimm.

zap hat sicher nix dagegen, wenn ich das am Beispiel seiner Kronjuwelen demonstriere.

Man hat kategorisch nicht verstanden wozu das Werkzeug da ist.

Natürlich nicht, denn wer offiziell seinen Status als Ignorant zelebriert - "weil er es kann", der liest auch
keine Doku, wie z.B. https://perldoc.perl.org/perlsub.html#Prototypes
Wo eindeutig steht, dass

a) die Kontrollfunktion der Prototypen zur Kompilezeit sehr limitiert ist
b) dass die Hauptfunktion dazu dient "builtins" zu schreiben

Schon klar: Weiß man nicht, braucht man nicht wissen, kann man ignorieren. Basta. *Fußaufstampf*

Man kann mit dem Werkzeug nicht einmal umgehen.

Ganz überwiegend schei*t man Definitionen hin a la

sub HMCCU_FindDatapoint ($$$$$);
sub HMCCU_GetChannel ($$);
sub HMCCU_GetDatapoint ($@);
sub HMCCU_GetDatapointAttr ($$$$$);
sub HMCCU_GetDatapointCount ($$$);
sub HMCCU_GetDatapointList ($$$);
sub HMCCU_GetSpecialDatapoints ($$$$$);
sub HMCCU_GetSwitchDatapoint ($$$);
sub HMCCU_GetValidDatapoints ($$$$$);
sub HMCCU_IsValidDatapoint ($$$$$);


Also "$". Selten verirrt sich mal ein @ hin, ganz selten ein ;

von

sub mymegafunc (\[%@]);

hat man natürlich noch nie was gehört, (wie auch, wenn man keine Doku liest),
was natürlich schade ist, denn dann könnten die Protos wenigstens zwischen einem
Skalar und einem Hashref (oder Arrayref) differenzieren.

Also verlässt man sich auf Cargo Cult - das aber standhaft.

Man hat gelernt zu leiden.

a.k.a. "Wer A sagt, muss auch B sagen können."

Nachdem man sich also eine überflüssige Geisel ans Bein getackert hat, muss auch die eigene Leidensfähigkeit ein Upgrade erhalten

    my $readingformat = HMCCU_GetAttrReadingFormat( $hash, $hash );
    my $substitute    = HMCCU_GetAttrSubstitute( $hash, $hash );


Tja. An zwei Argumenten geht halt kein Weg vorbei, also doppelt man einfach was man eigentlich nur einmal hätte übergeben können.
Und der Betrachter kratzt sich am Kopf. Das stört zap nicht, denn er hatte und hat nie vor seinen Code mal aus der Hand zu geben oder für jemanden anderen als ihn selbst verständlich zu schreiben.

Da könnte er ja seinen Kardinalstatus in der frühchristlichen Kirche (300 A.D.) gefährden - denkt er.

Kleiner Tipp: ($;$)




Ich verstehe ehrlich gesagt nicht, warum manche bei solchen Sachen so uneinsichtig sind. Meine Hypothese ist ja, dass diese Leute von der Flache-Erde-Theorie enttäuscht wurden und nun händeringend einen anderen Ersatz für ihr Glaubenssystem suchen.

Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

rudolfkoenig

ZitatIch verstehe ehrlich gesagt nicht, warum manche bei solchen Sachen so uneinsichtig sind.
Vielleicht sind es keine Kinder mehr, bei denen ein "ich sag das, glaubs mir" reicht.
Oder die herabwuerdigenden Kommentare loesen ein "jetzt erst recht nicht" aus.

Ich bitte dich staerker auf die Wortwahl zu achten, und weniger "witzig" auf Kosten von Anderen zu sein, im Sinne der Netikette:
Zitat
Das FHEM-Forum ist ein Ort, wo sich die Forenmitglieder mit gegenseitiger Wertschätzung, höflich und konstruktiv begegnen.
[...]
Unerwünscht sind beispielsweise beleidigende, herabsetzende, sexistisch oder rassistische Aussagen

betateilchen

Soviel Popcorn, wie ich in den letzten Wochen gebraucht hätte, um das Forum weiterhin zu ertragen, gibt es überhaupt nicht.

Vermutlich werde ich bald an den Punkt kommen, an dem ich darüber nachdenken muss, ob ich mich hier weiterhin noch einbringen möchte. Spaß macht mir dieses Hobby im Moment jedenfalls nicht mehr, und das liegt weniger an der inhaltlichen Diskussion, sondern an der Art und Weise ihrer Darbietung.

Insgesamt bin ich im Moment ziemlich traurig darüber, was hier gerade passiert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

RichardCZ

Zitat von: rudolfkoenig am 19 April 2020, 16:55:25
Vielleicht sind es keine Kinder mehr, bei denen ein "ich sag das, glaubs mir" reicht.

Und was macht man, wenn ein

* weil "xxx"
* da steht warum
* da auch
* ...

auch nicht reicht?

Zitat
Oder die herabwuerdigenden Kommentare loesen ein "jetzt erst recht nicht" aus.

Genau. Wenn jemand trotzig ist, ist das dann meine Schuld. Moment... keine Kinder hast Du gesagt?
Ja was jetzt?

Zitat
Ich bitte dich staerker auf die Wortwahl zu achten, und weniger "witzig" auf Kosten von Anderen zu sein, im Sinne der Netikette:

Schöne Gumimparagraphen hat man da. Ich fühle mich von Anfang an hier herabsetzend behandelt.

Das nächste mal werde ich den Thread sperren und nur öffenen wenn ich was editieren muss dazu benötige ich keine Moderator-Macht und spare mir das übliche Hijacking.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.