FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: RichardCZ am 13 April 2020, 00:55:19

Titel: if-elsif Anti-Bandwurm Kur (Beispiel: UConv)
Beitrag von: RichardCZ am 13 April 2020, 00:55:19
hier am Beispiel von UConv

https://gl.petatech.eu/root/HomeBot/-/commit/1fba0042c8c14dd4dfa49115eefc1e50a84dcf79#61592d9a606399c3ff575e5d4106ab869efce529

Exhibit A: Tabular Ternaries, PBP 121-123
Exhibit B: Data-Driven Design




Vielleicht finden auch andere Inspiration. Ist jetzt nicht 100% kompatibel, weil ich die Rückgabeliste von bft2condition leicht umsortiert habe um das hier machen zu können: https://gl.petatech.eu/root/HomeBot/-/commit/e54a7f723176a5ad15e9ca8783a15c2e60e20df2
Aber das kann man ja leicht anpassen. (IN der Tabelle müssten die RGB Werte in der Mitte sein)
Titel: Antw:if-elsif Anti-Bandwurm Kur (Beispiel: UConv)
Beitrag von: mahowi am 14 April 2020, 16:24:45
Ich habe jetzt (zumindest bei mir in Github (https://github.com/mahowi/WUup)) in 59_WUup.pm mal ein bißchen rumgespielt:
@@ -240,40 +234,19 @@
             $o //= 0;
             $value = ReadingsVal( $d, $r, 0 ) + $o;
         }
-        if ( $key =~ m{\w+f \z}xms ) {
-            $value = UConv::c2f( $value, $rnd );
-        }
-        if ( $key =~ m{\w+mph [^\n]*}xms ) {
+        $value =
+            $key =~ m{\w+f \z}xms ? UConv::c2f( $value, $rnd )
+            : ( $key =~ m{\w+mph [^\n]*}xms )
+            && ( $unit_windspeed eq 'm/s' )
+            ? UConv::kph2mph( ( UConv::mps2kph( $value, $rnd ) ), $rnd )
+            : $key =~ m{\w+mph [^\n]*}xms ? UConv::kph2mph( $value, $rnd )
+            : $key eq 'baromin' ? UConv::hpa2inhg( $value, $rnd )
+            : $key =~ m{rainin \z}xms ? UConv::mm2in( $value, $rnd )
+            : ( $key eq 'solarradiation' )
+            && ( $unit_solarradiation eq 'lux' )
+            ? UConv::lux2wpsm( $value, $rnd )
+            : $value;

-            if ( $unit_windspeed eq 'm/s' ) {
-                Log3( $name, 5, qq{WUup ($name) - windspeed unit is m/s} );
-                $value =
-                    UConv::kph2mph( ( UConv::mps2kph( $value, $rnd ) ),
-                    $rnd );
-            }
-            else {
-                Log3( $name, 5, qq{WUup ($name) - windspeed unit is km/h} );
-                $value = UConv::kph2mph( $value, $rnd );
-            }
-        }
-        if ( $key eq 'baromin' ) {
-            $value = UConv::hpa2inhg( $value, $rnd );
-        }
-        if ( $key =~ m{rainin \z}xms ) {
-            $value = UConv::mm2in( $value, $rnd );
-        }
-        if ( $key eq 'solarradiation' ) {
-
-            if ( $unit_solarradiation eq 'lux' ) {
-                Log3( $name, 5,
-                    qq{WUup ($name) - solarradiation unit is lux} );
-                $value = UConv::lux2wpsm( $value, $rnd );
-            }
-            else {
-                Log3( $name, 5,
-                    qq{WUup ($name) - solarradiation unit is W/m²} );
-            }
-        }
         $data .= "&$key=$value";
     }


Ganz so übersichtlich finde ich allerdings
        $value =
            $key =~ m{\w+f \z}xms ? UConv::c2f( $value, $rnd )
            : ( $key =~ m{\w+mph [^\n]*}xms )
            && ( $unit_windspeed eq 'm/s' )
            ? UConv::kph2mph( ( UConv::mps2kph( $value, $rnd ) ), $rnd )
            : $key =~ m{\w+mph [^\n]*}xms ? UConv::kph2mph( $value, $rnd )
            : $key eq 'baromin' ? UConv::hpa2inhg( $value, $rnd )
            : $key =~ m{rainin \z}xms ? UConv::mm2in( $value, $rnd )
            : ( $key eq 'solarradiation' )
            && ( $unit_solarradiation eq 'lux' )
            ? UConv::lux2wpsm( $value, $rnd )
            : $value;

auch nicht. Bekommt man das noch etwas lesbarer hin?
Titel: Antw:if-elsif Anti-Bandwurm Kur (Beispiel: UConv)
Beitrag von: RichardCZ am 14 April 2020, 17:43:35
Zitat von: mahowi am 14 April 2020, 16:24:45
Ganz so übersichtlich finde ich allerdings
        $value =
            $key =~ m{\w+f \z}xms ? UConv::c2f( $value, $rnd )
            : ( $key =~ m{\w+mph [^\n]*}xms )
            && ( $unit_windspeed eq 'm/s' )
            ? UConv::kph2mph( ( UConv::mps2kph( $value, $rnd ) ), $rnd )
            : $key =~ m{\w+mph [^\n]*}xms ? UConv::kph2mph( $value, $rnd )
            : $key eq 'baromin' ? UConv::hpa2inhg( $value, $rnd )
            : $key =~ m{rainin \z}xms ? UConv::mm2in( $value, $rnd )
            : ( $key eq 'solarradiation' )
            && ( $unit_solarradiation eq 'lux' )
            ? UConv::lux2wpsm( $value, $rnd )
            : $value;

auch nicht. Bekommt man das noch etwas lesbarer hin?

Das ist nicht nur unübersichtlich.  ;)
Natürlich kann man! Wenn man es so macht wie im Beispiel dargestellt:

$value = $key =~ m{\w+f \z}xms                                             ? UConv::c2f( $value, $rnd )
       : ( $key =~ m{\w+mph [^\n]*}xms ) && ( $unit_windspeed eq 'm/s' )   ? UConv::kph2mph( ( UConv::mps2kph( $value, $rnd ) ), $rnd )
       : $key =~ m{\w+mph [^\n]*}xms                                       ? UConv::kph2mph( $value, $rnd )
       : $key eq 'baromin'                                                 ? UConv::hpa2inhg( $value, $rnd )
       : $key =~ m{rainin \z}xms                                           ? UConv::mm2in( $value, $rnd )
       : ( $key eq 'solarradiation' ) && ( $unit_solarradiation eq 'lux' ) ? UConv::lux2wpsm( $value, $rnd )
       : $value;


Überhaupt erst so kapiere ich was der code machen soll. Und erst jetzt sieht man auch, dass einige (nicht all) Äste unabhängig voneinander sind.
Prinzipiell grätschen Dir da diese '&&' Conditions rein. Da ist die Frage ob man deren Wahrheitswert nicht vorher in einer Variablen ablegt:

$mph_metric    = $key =~ m{\w+mph [^\n]*}xms && $unit_windspeed eq 'm/s';
$lux_radiation = $key eq 'solarradiation'    && $unit_solarradiation eq 'lux';

$value = $key =~ m{\w+f \z}xms        ? UConv::c2f( $value, $rnd )
       : $mph_pmetric                 ? UConv::kph2mph( ( UConv::mps2kph( $value, $rnd ) ), $rnd )
       : $key =~ m{\w+mph [^\n]*}xms  ? UConv::kph2mph( $value, $rnd )
       : $key eq 'baromin'            ? UConv::hpa2inhg( $value, $rnd )
       : $key =~ m{rainin \z}xms      ? UConv::mm2in( $value, $rnd )
       : $lux_radiation               ? UConv::lux2wpsm( $value, $rnd )
       : $value;
Titel: Antw:if-elsif Anti-Bandwurm Kur (Beispiel: UConv)
Beitrag von: mahowi am 15 April 2020, 08:20:11
    while ( my ( $key, $value ) = each(%$a) ) {
        next if substr( $key, 0, 2 ) ne 'wu';
        $key = substr( $key, 2, length($key) - 2 );
        ( $d, $r, $o ) = split( ":", $value );
       
        if ( defined($r) ) {
            $o //= 0;
            $value = ReadingsVal( $d, $r, 0 ) + $o;
        }

        my $mph_metric =
            $key =~ m{\w+mph [^\n]*}xms && $unit_windspeed eq 'm/s';
        my $lux_radiation =
            $key eq 'solarradiation'    && $unit_solarradiation eq 'lux';

        $value = $key =~ m{\w+f \z}xms       ? UConv::c2f( $value, $rnd )
               : $key =~ m{\w+mph [^\n]*}xms ? UConv::kph2mph( $value, $rnd )
               : $key eq 'baromin'           ? UConv::hpa2inhg( $value, $rnd )
               : $key =~ m{rainin \z}xms     ? UConv::mm2in( $value, $rnd )
               : $mph_metric                 ? UConv::kph2mph( ( UConv::mps2kph( $value, $rnd ) ), $rnd )
               : $lux_radiation              ? UConv::lux2wpsm( $value, $rnd )
               : $value;

        $data .= "&$key=$value";
    }


So sieht das schon besser aus.  :)  Den if..elsif Bandwurm bin ich los und perlcritic -3 ist auch zufrieden.  :D
Titel: Antw:if-elsif Anti-Bandwurm Kur (Beispiel: UConv)
Beitrag von: mahowi am 15 April 2020, 19:23:48
Kann ich eigentlich perltidy irgendwie beibringen, mir die Formatierung hier nicht wieder zu zerschießen?

Ich habe die Einstellungen aus PBC übernommen:

-l=78 # Max line width is 78 cols
-i=4 # Indent level is 4 cols
-ci=4 # Continuation indent is 4 cols
-st # Output to STDOUT
-se # Errors to STDERR
-vt=2 # Maximal vertical tightness
-cti=0 # No extra indentation for closing brackets
-pt=1 # Medium parenthesis tightness
-bt=1 # Medium brace tightness
-sbt=1 # Medium square bracket tightness
-bbt=1 # Medium block brace tightness
-nsfs # No space before semicolons
-nolq # Don't outdent long quoted strings
-wbb="% + - * / x != == >= <= =~ !~ < > | & **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
        # Break before all operators
Titel: Antw:if-elsif Anti-Bandwurm Kur (Beispiel: UConv)
Beitrag von: CoolTux am 15 April 2020, 19:31:47
Zitat von: mahowi am 15 April 2020, 19:23:48
Kann ich eigentlich perltidy irgendwie beibringen, mir die Formatierung hier nicht wieder zu zerschießen?

Ich habe die Einstellungen aus PBC übernommen:

-l=78 # Max line width is 78 cols
-i=4 # Indent level is 4 cols
-ci=4 # Continuation indent is 4 cols
-st # Output to STDOUT
-se # Errors to STDERR
-vt=2 # Maximal vertical tightness
-cti=0 # No extra indentation for closing brackets
-pt=1 # Medium parenthesis tightness
-bt=1 # Medium brace tightness
-sbt=1 # Medium square bracket tightness
-bbt=1 # Medium block brace tightness
-nsfs # No space before semicolons
-nolq # Don't outdent long quoted strings
-wbb="% + - * / x != == >= <= =~ !~ < > | & **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
        # Break before all operators


Ich habe aktuell das selbe Problem.
Titel: Antw:if-elsif Anti-Bandwurm Kur (Beispiel: UConv)
Beitrag von: RichardCZ am 15 April 2020, 21:49:25
Um ehrlich zu sein, benutze ich perltidy (mit default-Werten) bei eigenem Code nur für die Eingangsnormalisierung. Nachdem ich den Code unter meine Fittiche genommen habe, soll den perltidy nicht mehr anfassen.