プロトタイプ ~プログラミング研究室~


 こんにちは!
 ナビゲータのEVEです。
ペアプログラミング.jpg
 前回までは、オブジェクト指向言語としての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 ) {//②変数定義let error;//③try~catchtry {//④入力データチェックif (typeof str !== 'string') {//⑤引数がエラーの場合this.#priErrorMessage = '引数は文字列でなければなりません';throw new Error(this.#priErrorMessage);}⑥//UTF-8変換を行うconst encoder = new TextEncoder();const strU    = encoder.encode(str);⑦//数値チェックif (isNaN(str)) {//引数がエラーの場合this.#priErrorMessage = '引数は数値を含む文字列でなければなりません';throw new Error(this.#priErrorMessage);}} catch ( error ) {⑧// エラー処理console.error('コンストラクタでエラーが発生しました:', error.message);throw error;}//⑨プライベート変数の設定this.#proString     = str;this.#proStringLen  = str.length;this.#proStringByte = strU.length;}/**************************************************【メソッド名】文字列長取得メソッド*【 引 数 】なし*【返 却 値】* 正常時:文字列長*【製 造 者】EVE*【製造年月日】2024年8月20日*【更新年月日】*【リリース日】*【バージョン】*【 概 要 】* 文字列長を取得する*************************************************/getLength() {//⑩文字列長を取得し、呼び出し元へ制御を移すreturn this.#proStringLen;}/**************************************************【メソッド名】文字列バイト数取得*【 引 数 】なし*【返 却 値】* 正常時:バイト数*【製 造 者】EVE*【製造年月日】2024年8月22日*【更新年月日】*【リリース日】*【バージョン】*【 概 要 】* バイト数長を取得する*************************************************/getByte() {//⑪バイト長を取得し、呼び出し元へ制御を移すreturn this.#proStringByte;}/**************************************************【メソッド名】エラー取得メソッド*【 引 数 】なし*【 返却値 】* 正常時:エラーメッセージ*【製 造 者】EVE*【製造年月日】2024年8月22日*【更新年月日】*【リリース日】*【バージョン】*【 概 要 】* エラーメッセージを取得する*************************************************/getMessage() {//⑫バイト長エラーメッセージを取得し、呼び出し元へ制御を移すreturn this.#priErrorMessage;}}


[プログラム解説]
 ①では、クラス内で利用するプログラム変数を定義しています。変数の頭に#ついていますが、これがプライベート変数の宣言になります。ここで、変数をプライベート変数とすることにより、カプセル化することができます。なお、カプセル化につきましては、後日解説をします。
 ②では、メソッド内変数を定義しています。
 ③からtry~catch構文を利用しています。オブジェクト指向言語の場合、コンストラクタでは、returnが使えないことが多いです。JavaScriptも同様なため、ChatGPTに聞くまで、コンストラクタで引数がエラーでもエラーとすることができないと思い込んでいましたが、ChatGPTからtry~catchを使う方法を教えてもらいました。多分PHPでも利用することが可能です。このプログラム完成後、PHPの方も修正することにします。
 ④では、引数のチェックをしています。最初、UTFエンコード後入力データチェックをする仕様としていましたが、何も入力されていない場合などでは、エンコード処理がエラーとなるため、まずstringチェックをし、文字列が入力されていることを確認後、処理することを、ChatGPTから勧められました。
 ⑤では、引数をUTF-8に変換しています。この関数のデフォルトがUTF-8なので何も指定がないのですが、別の文字列への変換も可能です。
 ⑥では、UTF-8に変換しています。変換することにより、文字のバイト数を取得することが可能になります。なお、constと宣言していますが、これは定数宣言をしています。const宣言された変数は、以降定数として扱われ、変更することができません。
 ⑦では、数値チェックをしています。JavaScriptの場合、”12345″は数値ではなく、文字列と判定されます。文字列扱いがされている数値の存在をここで確認しています。
 ⑧では、tryでエラーとなった処理をここで取得し、エラーを画面上に表示しています。
 ⑨では、取得した値をそれぞれプライベート変数へ再設定しています。
 ⑩~⑫は、取得した値をプライベート変数へ設定しています呼び出し元へ返却し、制御を移します。

[あとがき]
 JavaScriptで改めて、プログラムを検証してみて、いろいろと勉強になりました。コンストラクタ内で引数をチェックし、エラーとすることができることを知ったのは収穫でした。ただ、PHPのプログラムを今から修正するのは大変です。
 この製造方法は、まさに、XPペアプログラミングです。今回は、ChatGPTの意見を聞きながら独りよがりの部分があったことに気づきました。これから、常にChatGPTに相談しプログラムを作っていきたいと思います。
 では、また!

コメント