ナビゲータのEVEです。
今日の開発は、 PHP の全体の半数の クラス の コンストラクタ に、 try〜catch ロジックを追加しました。それと同時に、コンストラクタでのエラーを、各 メソッド の先頭で判定しているのですが、そのロジックを削除しています。それに加えて、各メソッドで使用している、変数をメソッドの頭で static で宣言していましたが、問題があるそうなので、削除しています。
[staticを利用する時の問題点]
以下がその問題点です。 ChatGPT から聞いた内容になります。
static 変数の特性
?メソッド内での共有:
メソッド内で static 変数を使用すると、その変数はそのメソッドが呼び出されるたびに再初期化されるのではなく、メソッドのすべての呼び出しで共有されます。これは、一度設定された値がメソッドの次回呼び出し時にも保持されることを意味します。
?メモリ管理:
static変数はクラスがロードされている限りメモリに保持されるため、大量に使用するとメモリ消費が増加する可能性があります。
?スレッドセーフでない:
static変数がスレッドセーフでない状況では、マルチスレッド環境での競合状態が発生する可能性があります。PHPは通常シングルスレッドで動作しますが、共有リソースに対して注意が必要です。
?ユニットテストが困難:
static変数は状態を持ち続けるため、メソッドが実行されるたびに異なる結果を返す可能性がある場合、ユニットテストの結果が予測不可能になります。特にテスト間で状態が共有されるため、テストの独立性が損なわれることがあります。
?依存性注入が困難:
static変数を使用すると、依存性注入(DI)が困難になります。クラスやメソッドが static 状態に依存する場合、他のクラスやコンポーネントとの結合度が高くなり、柔軟な設計が難しくなります。
プログラミングをしていて、気をつかわなければならない点が増えれば増えるほど、 バグ を生み出す原因となります。そのため、すべてのメソッドのロジックからstaticの宣言を削除しました。
[難しい数値判定]
予定の作業を終えた後、 JavaScript を動かしてみました。ただ、ちょっと、おかしい・・・。先日正しく動いていたプログラムが正常に動作しない。
正しく動いていたというのは、ちょっと、問題があるかもしれません。それは、ChatGPTとの対話により、ChatGPTの提案をそのままJavaScriptのロジックに挿入している部分があるからです。
一つ目は、 isNaN() の仕様・・・。ChatGPTから提案されたロジックなのですが、実は関数の引数に数値以外の値が指定されるとtureになります。しかし、数値指定されると、falseになります。
前回のプログラムが求めていたのは、文字列なのだけれど、その文字列は12345といった数字でない文字列が引数として設定されていることを期待し、それ以外の条件の場合は、エラーとしようとしていました。ただ、以下のロジックでは無理なようです。
if ( isNaN(str )) {
//引数がエラーの場合
this.#priErrorMessage = '引数は数値を含む文字列でなければなりません';
throw new Error(this.#priErrorMessage);
}
深掘りして見ると、ちょっと、使い勝手がよくない関数だと判明しました。そのため、現在は、引数を数値変換し、数値変換したものを、 Number.isFinite を使用して、数値かどうか判定する仕様としています。。
[変数定義]
プログラムも複雑になると Google Chrome でエラーとなるケースが増えてきます。 今回のシステム、ローカル変数を各メソッドの頭で宣言しているのですが、 let または const で定義しないとエラーになります。その箇所でエラーになればありがたいのですが、呼び出し元で「Uncaught ReferenceError: error is not defined」エラーになります。理由が分からずかなりの時間がとられました。
使い始めのデバックツールはいつもそうなのですが、その使い勝手が分かるまで時間がかかります。今まで使ってきた全てのデバッカは、エラーとなったところでズバリエラーと表示してくれません。やっぱり、こんなもんですよね・・・
[あとがき]
ChatGPTも完璧ではないですね?まっ、私の意図が伝わらなかったという話はありますが・・・。これを機に、ChatGPTの言っていることを参考に、 Bard 、 Copilot の意見も聞きながらシステムを製造することにします。今までの経験上、システムについては、ChatGPTが一番精度がいいので、利用していたのですが、完ぺきではないということが分かりました。
なお、本日書く予定でしたセキュリティに関する記事ですが、明日に延期します。
では、また!!!
タグ: Copilot
isFinite
isNaN
Google Chrome
let
const
バグ
Bard
php
クラス
コンストラクタ
Try
Number
catch
メソッド
static
ChatGPT
JavaScript
【このカテゴリーの最新記事】