こんにちは!
ナビゲータのEVEです。
前回までは、オブジェクト指向言語としてのJavaScriptが、自分が作りたい形になるかどうか確認するために簡単なモノを作りましたが、本日は、完成形を目指します。
では、早速、プログラムを見ていきましょう!
[プロトタイプ]
以下が完成に近いプロトタイプのstringClassなのですが、以前作っていたPHPと似たような作りにするために、作るに際してChatGPTに質問をしながら製造をしています。
/*************************************************
*【クラス名 】文字列クラス
*【製 造 者】EVE
*【製造年月日】2024年8月19日
*【更新年月日】2024年8月22日
*【リリース日】
*【バージョン】0.1
*【 概 要 】
* 文字列に関する機能を提供する
*************************************************/
class stringClass {
@//プライベート変数を定義
#proString;
#proStringLen;
#proStringByte;
#priErrorMessage
/*************************************************
*【メソッド名】コンストラクタ
*【 引 数 】文字列
*【返 却 値】なし
*【製 造 者】EVE
*【製造年月日】2024年8月19日
*【更新年月日】2024年8月22日
*【リリース日】
*【バージョン】
*【 概 要 】
* 初期の処理を実施する
*************************************************/
constructor( str ) {
//A変数定義
let error;
//Btry〜catch
try {
//C入力データチェック
if (typeof str !== 'string') {
//D引数がエラーの場合
this.#priErrorMessage = '引数は文字列でなければなりません';
throw new Error(this.#priErrorMessage);
}
E//UTF-8変換を行う
const encoder = new TextEncoder();
const strU = encoder.encode(str);
F//数値チェック
if (isNaN(str)) {
//引数がエラーの場合
this.#priErrorMessage = '引数は数値を含む文字列でなければなりません';
throw new Error(this.#priErrorMessage);
}
} catch ( error ) {
G// エラー処理
console.error('コンストラクタでエラーが発生しました:', error.message);
throw error;
}
//Hプライベート変数の設定
this.#proString = str;
this.#proStringLen = str.length;
this.#proStringByte = strU.length;
}
/*************************************************
*【メソッド名】文字列長取得メソッド
*【 引 数 】なし
*【返 却 値】
* 正常時:文字列長
*【製 造 者】EVE
*【製造年月日】2024年8月20日
*【更新年月日】
*【リリース日】
*【バージョン】
*【 概 要 】
* 文字列長を取得する
*************************************************/
getLength() {
//I文字列長を取得し、呼び出し元へ制御を移す
return this.#proStringLen;
}
/*************************************************
*【メソッド名】文字列バイト数取得
*【 引 数 】なし
*【返 却 値】
* 正常時:バイト数
*【製 造 者】EVE
*【製造年月日】2024年8月22日
*【更新年月日】
*【リリース日】
*【バージョン】
*【 概 要 】
* バイト数長を取得する
*************************************************/
getByte() {
//Jバイト長を取得し、呼び出し元へ制御を移す
return this.#proStringByte;
}
/*************************************************
*【メソッド名】エラー取得メソッド
*【 引 数 】なし
*【 返却値 】
* 正常時:エラーメッセージ
*【製 造 者】EVE
*【製造年月日】2024年8月22日
*【更新年月日】
*【リリース日】
*【バージョン】
*【 概 要 】
* エラーメッセージを取得する
*************************************************/
getMessage() {
//Kバイト長エラーメッセージを取得し、呼び出し元へ制御を移す
return this.#priErrorMessage;
}
}
[プログラム解説]
@では、クラス内で利用するプログラム変数を定義しています。変数の頭に#が
Aでは、メソッド内変数を定義しています。
Bからtry〜catch構文を利用しています。オブジェクト指向言語の場合、コンストラクタでは、returnが使えないことが多いです。JavaScriptも同様なため、ChatGPTに聞くまで、コンストラクタで引数がエラーでもエラーとすることができないと思い込んでいましたが、ChatGPTからtry〜catchを使う方法を教えてもらいました。多分PHPでも利用することが可能です。このプログラム完成後、PHPの方も修正することにします。
Cでは、引数のチェックをしています。最初、UTFにエンコード後入力データチェックをする仕様としていましたが、何も入力されていない場合などでは、エンコード処理がエラーとなるため、まずstringチェックをし、文字列が入力されていることを確認後、処理することを、ChatGPTから勧められました。
Dでは、引数をUTF-8に変換しています。この関数のデフォルトがUTF-8なので何も指定がないのですが、別の文字列への変換も可能です。
Eでは、UTF-8に変換しています。変換することにより、文字のバイト数を取得することが可能になります。なお、constと宣言していますが、これは定数宣言をしています。const宣言された変数は、以降定数として扱われ、変更することができません。
Fでは、数値チェックをしています。JavaScriptの場合、"12345"は数値ではなく、文字列と判定されます。文字列扱いがされている数値の存在をここで確認しています。
Gでは、tryでエラーとなった処理をここで取得し、エラーを画面上に表示しています。
Hでは、取得した値をそれぞれプライベート変数へ再設定しています。
I〜Kは、取得した値を
[あとがき]
JavaScriptで改めて、プログラムを検証してみて、いろいろと勉強になりました。コンストラクタ内で引数をチェックし、エラーとすることができることを知ったのは収穫でした。ただ、PHPのプログラムを今から修正するのは大変です。
この製造方法は、まさに、XP、ペアプログラミングです。今回は、ChatGPTの意見を聞きながら独りよがりの部分があったことに気づきました。これから、常にChatGPTに相談しプログラムを作っていきたいと思います。
では、また!