48046
こんにちは、perlのresult結果が定数に入るということがこの前わかりました。

perlファイルコード

```

    $sql = "select ・・・;"; # <- SQL文
    $ret = $conn->exec($sql);
    $ret->resultStatus
    
```

でこの値に

```

      - PGRES_EMPTY_QUERY
      - PGRES_COMMAND_OK
      - PGRES_TUPLES_OK
      - PGRES_COPY_OUT
      - PGRES_COPY_IN
      - PGRES_BAD_RESPONSE
      - PGRES_NONFATAL_ERROR
      - PGRES_FATAL_ERROR
    
```

が入るようですが、この定数の代わりに数値でも大丈夫なんでしょうか？  
直接printして確認出来ました。

・・・上から0・・・7でした。
CC BY-SA 4.0
2018-09-03T05:48:23.370
48042
2018-09-03T08:02:27.777
2018-09-03T07:14:13.560
20350
20350
question
postgresql perl
perlのsql結果について
定数を利用せずに、直接数値を指定して結果判定をしていいかということでしょうか？

まず、動作するかどうかについてですが、定数を利用せずに直接数値で判定を行っても正しく動作すると思います。  
しかし、よほど特別な理由がない限り避けた方がよいです。

プログラムに直接固定の数値を書くことを「マジックナンバー」と呼びます。  
このマジックナンバーを多用すると「可読性低下」「保守性低下」などのデメリットが非常に多いです。  
例えば、簡単な例ですが、次の２つのプログラムを見てください。  
前者がマジックナンバーを使ったもの、後者が定数を使用したものです。

・プログラムA：

```

    $result = func();
    if($result != 1)
    {
        return;
    }
    
```

・プログラムB：

```

    $result = func();
    if($result != SUCCESS)
    {
        return;
    }
    
```

見ての通り、プログラムAはfunc()の定義を見てみないと1が何を示す値なのかわからないため、理解に時間がかかります。  
しかし、プログラムBの方が成功しなかったときに関数を抜けるんだということが、func()の内容を見なくても想像がつきます。  
これが「可読性低下」、プログラムが読みづらくなるということです。  
もちろん正しく定数名をつけてくれていることが前提です。

また、仮に$conn->exec()の返り値の種類が8個から9個に増えて、「PGRES_FATAL_ERROR」が「7」から「8」に変わったとしましょう。  
マジックナンバーを利用していると、「PGRES_FATAL_ERROR」を示す「7」をコード上から探し出し、すべて「8」に変更する作業が発生します。  
プログラム上には「PGRES_FATAL_ERROR」を意味するわけではない「7」も存在しているでしょうから、機械的に「7」を「8」にreplaceすればいいということではありません。  
定数を利用していれば、このようなことを行う必要もなく、ライブラリを置き換えるだけで解決します。  
これが「保守性低下」、プログラムのメンテナンスがしづらくなるということです。

もちろん、マジックナンバーが必要な場面も出てくることはあります。

また、マジックナンバーを嫌いすぎて、何でもかんでも定数で定義する人もいます。  
以下のような定数定義を見たことがありますが、逆に可読性も保守性も下がるのでやめましょう。

```

    use constant ZERO = 0;
    use constant ONE = 1;
    use constant TWO = 2;
    　・
    　・
    　・
    
```

■結論  
定数とは名前を付けて、固定の意味を与えられた数値です。  
ライブラリで定数が定義されている場合は、マジックナンバーの利用を避けて、絶対に定数を利用してプログラムを書くべきです。

とんちんかんな回答だったらすみません。
CC BY-SA 4.0
2018-09-03T08:02:27.777
48046
2018-09-03T08:02:27.777
17014
48042
answer