Pertanyaan Standar PSR-2 untuk kondisi yang lama


Saya tidak menemukan standar untuk kasus ini:

if ($a == $b && $b == $c && $c == $d && $g == $d) {

}

atau

if (($a == $b && $b == $c) && ($c == $d && $g == $d)) {

}

Bayangkan var-nama lebih panjang dan 80 huruf terlampaui. Bagaimana saya harus menangani ini? Itu bisa terlihat seperti:

if (
       $a == $b
    && $b == $c
    && $c == $d
    && $g == $d
) {

    }

34
2018-05-20 11:44


asal


Jawaban:


Tidak ada rekomendasi / konvensi untuk kasus ini, dan karena Halcyon sudah menyebutkan ini adalah kasus yang sangat luar biasa.

Namun, ada rekomendasi untuk pemanggilan fungsi dengan daftar panjang parameter:

Daftar argumen MUNGKIN dibagi menjadi beberapa baris, di mana masing-masing   baris berikutnya di-indentasi sekali. Saat melakukannya, item pertama di   daftar HARUS berada di baris berikutnya, dan hanya ada satu argumen per   garis.

<?php
$foo->bar(
    $longArgument,
    $longerArgument,
    $muchLongerArgument
);

Jadi jika saya harus membuat pernyataan if yang mirip dengan Anda, saya akan melakukan ini:

if (
    $a == $b &&
    $b == $c &&
    $c == $d &&
    $g == $d
) {
    // do something
}

Seperti yang Anda lihat, ini hampir sama dengan solusi yang Anda usulkan sendiri, tetapi saya lebih suka menambahkan && operator setelah kondisi.


38
2018-05-20 11:56



Secara pribadi, saya lebih suka

if ($a == $b
    && $b == $c
    && $c == $d
    && $g == $d
) {
    // code here...
}

Untuk setiap baris, Anda mulai dengan double ampersand, menunjukkan bahwa pernyataan berikut terpisah dari yang lain. Jika Anda meletakkan ampersand di ujung garis, itu bisa menjadi kurang jelas ketika garis bervariasi banyak panjangnya.

Sebagai contoh;

if ($a == $b && 
    $b == $c && 
    $thisisamuchlongerstatementbecauseofthisvar == $d && 
    $g == $d
) {
    // code here...
}

Dalam hal ini Anda harus memindai kode lebih lanjut untuk mengetahui bahwa setiap baris dihubungkan oleh tanda ganda dan.


33
2017-07-30 07:42



Edit

Satu tahun kemudian, saya akan sangat menyarankan untuk menulis ulang kode Anda agar memiliki pernyataan yang lebih pendek. Melalui variabel atau panggilan fungsi.

Asli

Saya masuk ke dalam situasi ini, jadi saya memutuskan untuk pergi dengan format berikut:

if (
    $a == $b &&
    $b == $c &&
    $c == $d &&
    $g == $d) {
}

Tapi, saya menggunakan phpcbf, yang diubah (mengikuti standar PSR2) kode sebelumnya menjadi:

if ($a == $b &&
    $b == $c &&
    $c == $d &&
    $g == $d) {
}

Saya ingin tahu lebih banyak: bagaimana cara mengetahui bahwa ini adalah perilaku yang diharapkan oleh standar jika tidak ditulis di mana saja? Jawabannya sederhana: kasus ini diperhitungkan oleh standar, dengan kalimat berikut:

TIDAK HARUS ada spasi setelah kurung buka

Ini menjelaskan mengapa cuplikan kedua adalah yang kedua, dan satu-satunya, yang mengikuti standar PSR-2, seperti yang dinyatakan oleh php-ara.


10
2018-06-24 18:25



Pendekatan favorit saya adalah menghapus sub-ekspresi dari pernyataan IF, sebagai berikut:

$c1 = $a == $b;
$c2 = $b == $c;
$c3 = $c == $d;
$c4 = $g == $d;
if ($c1 && $c2 && $c3 && $c4) {
}

Pendekatan ini akan membuatnya lebih mudah untuk didebug.

Kasus kedua yang Anda ekspos adalah setara dengan yang pertama karena properti asosiatif dari operator logika. Karena itu, $a && $b && $c sama dengan ($a && $b) && $c, yang sama dengan $a && ($b && $c)


3
2017-09-24 18:02



Saya akan menyarankan Anda mencoba memikirkan operasi dalam istilah yang berbeda. Sebagai contoh:

if (count(array_unique([$a, $b, $c, $d, $g])) == 1)

Anda mungkin akan menemukan bahwa Anda dapat mengekspresikan seluruh algoritma sebagai lebih dari operasi pada satu set, menggunakan array, bukan variabel individu dan menggunakan operasi logis pada set seperti yang ditunjukkan di atas. Itu bisa mengarah pada kode yang secara drastis berbeda dan lebih mudah dibaca.

Contoh lain dari refactoring:

namespace My;

UnexpectedValueException::assertAllEqual($a, $b, $c, $d, $g);


class UnexpectedValueException extends \UnexpectedValueException {

    public static function assertAllEqual(/* $value, ... */) {
        $args = func_get_args();
        if (count(array_unique($args)) > 1) {
            throw new static(sprintf('[%s] are not all equal', join(', ', $args)));
        }
    }

}

1
2018-05-20 12:04



Saya lebih suka di awal juga:

if (   self::LOG_ALL
    || (    self::DEBUG__EXECUTION_TIME__IS_ENABLED
        && (self::DEBUG__EXECUTION_TIME__THRESHOLD_SECONDS < $trxDurinationSeconds)
       )
) {
    doSomething();
}

1
2017-09-23 21:03



Cara yang baik menurut saya adalah melakukan sesuatu seperti ini

function testString($string)
{
    // define the if criteria
    $criteria = [
        // 0: string starts with A
        substr($string, 0, 1) == 'A',
        // 1: string ends with Z
        substr($string, -1, 1) == 'Z',
        // 2: string length is 10
        strlen($string) == 10
    ];

    // if the array contains false, at leat one creteria failed
    return !in_array(false, $criteria);
}

Tentu saja, ini dapat digunakan tanpa fungsi pembungkus juga. Sangat mudah untuk melakukan debug: cukup var_dump variabel $ criteria, dan Anda mendapatkan daftar apa yang berhasil dan yang gagal.

Hasil

testString('ABCDEFGXYZ')   // true
testString('ABCDEFXYZ')    // false
testString('BCDEFGHXYZ')   // false

Ini hanya contoh, untuk sesuatu yang sederhana seperti deteksi string ini, Anda harus menggunakan regex.


0
2018-05-28 13:00