Meldung: called too early to check prototyp

Begonnen von Navigator, 07 Mai 2020, 14:22:32

Vorheriges Thema - Nächstes Thema

CoolTux

Die leserlichkeit kann man aber beeinflussen

sub test {        # (var1,var2)

}
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

Fuer die, die Prototypen verwenden wollen, und bereit sind, den neuerdings deswegen hier ueblichen Shitstorm zu ignorieren:
bei einem rekursiven Aufruf muss man vor der Funktionsdefinition sie nochmal deklarieren
sub GewHaus_Bewaesserung_pr($$);
sub GewHaus_Bewaesserung_pr($$) {
....
}

Navigator

Nun es ist auch für mich etwas ungewohnt nicht zu wissen wie viele Parameter ich übergeben kann, sollte oder habe wenn ich die Prototypes weg lasse. Ich frage mich nur was mich bewogen hat es immer "falsch" ?! zu machen. Irgendein Perl Buch muss es mir eben ganau so eingetrichtert haben oder hat sich an der Handhabung da mal was geändert?

Das Thema scheint ja ziemlich sensibel zu sein.  ;D

Christoph Morrison

Zitat von: rudolfkoenig am 07 Mai 2020, 15:59:45
Fuer die, die Prototypen verwenden wollen, und bereit sind, den neuerdings deswegen hier ueblichen Shitstorm zu ignorieren:
bei einem rekursiven Aufruf muss man vor der Funktionsdefinition sie nochmal deklarieren
sub GewHaus_Bewaesserung_pr($$);
sub GewHaus_Bewaesserung_pr($$) {
....
}


Da hat man ja total was gewonnen! Mehr Code um ein Warning loszuwerden, das man mit weniger Code überhaupt nicht hätte. Und dann ändert man was an GewHaus_Bewaesserung_pr, vergisst die Dublette und bums.

Mich würde mal interessieren, wie der OP überhaupt dazu gekommen ist, Prototypen zu verwenden?

MadMax-FHEM

Zitat von: rudolfkoenig am 07 Mai 2020, 15:59:45
Fuer die, die Prototypen verwenden wollen, und bereit sind, den neuerdings deswegen hier ueblichen Shitstorm zu ignorieren:
bei einem rekursiven Aufruf muss man vor der Funktionsdefinition sie nochmal deklarieren
sub GewHaus_Bewaesserung_pr($$);
sub GewHaus_Bewaesserung_pr($$) {
....
}


So wie ich es in "meiner" Welt kenne:

Prototyp ins h-File
Implementierung ins C(++)-File

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

CoolTux

Zitat von: Dittel am 07 Mai 2020, 16:09:37
Nun es ist auch für mich etwas ungewohnt nicht zu wissen wie viele Parameter ich übergeben kann, sollte oder habe wenn ich die Prototypes weg lasse. Ich frage mich nur was mich bewogen hat es immer "falsch" ?! zu machen. Irgendein Perl Buch muss es mir eben ganau so eingetrichtert haben oder hat sich an der Handhabung da mal was geändert?

Das Thema scheint ja ziemlich sensibel zu sein.  ;D


Es ist nicht sensibel. Und wenn Du mit Prototypen arbeiten willst dann mach es, ist ok.
Frühere Perlbücher so bis 2006 glaube haben das auch noch so gemacht. Alles danach arbeitet komplett ohne.
Beispiel: Der Perl Programmierer
Dicker Wälzer. Wieso es empfohlen wird ohne Prototypen zu arbeiten kann man in Perl Best Praxis nach lesen.

Man kann einfach sagen es ist eine modernere Form für Perl. Gut zu lesen im Buch Modern Perl von 2014.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Navigator

ZitatMich würde mal interessieren, wie der OP überhaupt dazu gekommen ist, Prototypen zu verwenden?


Als ich ich mit Fhem und Perl angefangen habe, waren mir nur die Sprache BASIC geläufig aus früheren C64 Kindertagen. Dann kam mit Perl ja gleich mal der Hammer und ich hab mich mit einer Ausgabe von 2005 "Mit Perl programmieren lernen" mal wieder an die Sache herangetraut. Dort muss es sich wohl festgesetzt haben, Parameter zu "zählen". Da ich aber rein privat noch wilden Code in Python schreibe, war mir das nicht fremd und auch dort ist es in ähnlicher Form ja gegeben. Das jetzt im nachhinein wieder "umzubiegen" ist ja wie schreiben lernen mit links.  :o

CoolTux

Auch in Perl gab es mehrere Rechtschreibreformen  ;D
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Navigator

Zitat von: CoolTux am 07 Mai 2020, 16:33:28
Auch in Perl gab es mehrere Rechtschreibreformen  ;D

Dann würde ich auch hier wohl eher zu den Rebellierenden gehören.
Hab gerade mal ohne die Prototypes getestet und mal einen Parameter weggelassen.
Ich bekomme dann eine Fehlermeldung, die ohne den Code zu sichten erst mal nicht schlüssig ist.
Please define GewHaus_Bewaesserung_Manuell_pr first

Mit der Prototype Option weiß man dagegen sofort was klemmt.
Not enough arguments for main::GewHaus_Bewaesserung_pr at (eval 530) line 1, near "1)"

Ein Hoch auf die Prototypes.  ;D

Christoph Morrison

Zitat von: Dittel am 07 Mai 2020, 16:43:38
Dann würde ich auch hier wohl eher zu den Rebellierenden gehören.
Hab gerade mal ohne die Prototypes getestet und mal einen Parameter weggelassen.

Niemand hat gesagt, dass du dich darauf verlassen sollst, dass immer x Parameter kommen. Denn du musst sowieso checken, ob die Parameter auch inhaltlich valide sind. Übergib doch mal undef oder irgendeinen Müll an die Funktion und du bekommst auch einen Fehler - weil deine sanity checks nicht wirklich existieren. Dazu bekommst du mit Prototypes aber auch noch unsichtbare magic:


perl -MData::Dumper -e 'sub t($$) { print Dumper(@_); }; t(1,(2,3,5));'
$VAR1 = 1;
$VAR2 = 5;


Hättest du das erwartet?

rudolfkoenig

Ja, man kann abstruse Faelle konstruieren, wo nicht das passiert, was man erwartet.
Aber so wie ich denke und programmiere, sind die fuer mich hilfreich.

Navigator

Zitat von: Christoph Morrison am 07 Mai 2020, 16:56:20

Hättest du das erwartet?

Ähm, nein aber ein interessantes Beispiel. Das muss ich mal zerplücken und schauen warum das so ist.
Zitat von: Christoph Morrison am 07 Mai 2020, 16:56:20
- weil deine sanity checks nicht wirklich existieren.

Ja das stimmt, darauf sollte ich in Zukunft mehr Wert legen. Eigentlich waren meine Codeschnipsel immer soweit getestet und konsistent, daß größeres Fehlverhalten mir bisher erspart blieb. Aber ich möchte nicht wissen, was passiert wenn mal das Fhem statefile nicht aktuell ist oder verloren geht. Dann ist das Chaos erst einmal perfekt und das Haus lernt fliegen.
Inwieweit man aber auf jede erdenkliche Fehleingabe oder Situation eine Ausnahmebehandlung schreiben sollte sei mal dahingestellt und kommt wohl auf die angestrebte Funktion an. Bei einer Bewässerung ist dies wohl aber sehr wohl mehr von Bedeutung als bei einer Routine für ein paar Lampen.

Christoph Morrison

Zitat von: rudolfkoenig am 07 Mai 2020, 17:04:25
Ja, man kann abstruse Faelle konstruieren, wo nicht das passiert, was man erwartet.
Aber so wie ich denke und programmiere, sind die fuer mich hilfreich.

In deiner Welt sind alles nur "abtruse Fälle" damit du ja nie hinterfragen musst, ob dein bisher Gelerntes vielleicht nicht nur einfach nicht mehr dem aktuellen Stand - also dem von 2005 oder wann PBP erschienen ist - entspricht. So ist es natürlich schön bequem.

rudolfkoenig

Vielen Dank fuer den persoenlichen Angriff.
Du kennst mich schliesslich am besten.

Christoph Morrison

Zitat von: rudolfkoenig am 07 Mai 2020, 19:18:12
Vielen Dank fuer den persoenlichen Angriff.
Du kennst mich schliesslich am besten.

Ach ja, aber "abstruse Fälle" ist natürlich professioneller, nicht-persönlicher Umgang, genau wie das Abqualifizieren von von dir ungeliebten Meinungen als "Shitstorm" (offensichtlich hast du noch keinen erlebt).

Dafür, dass du selbst gerne austeilst hast du aber ein ganz schön dünnes Fell.