こんにちは!
ナビゲータの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
【このカテゴリーの最新記事】