こんにちは!
ナビゲータのEVEです。
毎日、午前中小企業診断士の勉強をした後、午後ブログとプログラム製造をしています。
プログラム製造は、新規でクラスを作ることは少なく、ChatGPTにデバックしてもらったプログラムを修正しながら、PSRに準拠した、新プログラム規約へ適合させる作業を実施しています。
[ChatGPTでのデバック]
今までは、プログラムの製造中心にやってきましたが、ここへきて、作ったプログラムをChatGPTにデバックしてもらっています。理由は、JavaScriptのデバックで分かりましたが、クラス全体が完成していなくても、メソッド単体でデバックできることが分かったからです。それと、ChatGPTは、デバックするプログラムの長さに制約があります。短いクラスならいいのですが、長いステップのものだとデバックはできません。デバックしたい部分に関連しないプロパティ、メソッドを削除してからデバックしようとも考えましたが、めんどくさいのでデバックは二の足を踏んでいました。
ただ、メソッド単体でデバックする場合、同一クラスで利用する、プロパティ、メソッドは省略した状態なので、結果が正確なものなのかどうかデバック後のプログラムは詳細にチェックしなければいけないでしょう?
[PSRに準じたプログラム修正]
以上のようなデバックをしながら、PSRにプログラムを準拠するようにプログラムを製造しています。デバックをしてプログラムを修正するのですから、そのタイミングで規約に揃えてしまうのは自然な流れといえます。ただ、PSRをそのまま利用しているのではなく、以下のような規約を作りプログラム修正をしています。
【ディレクトリ構成】
・システムを分割するフォルダは、3桁
・各業務システムを分割するフォルダは、4桁(2桁+2桁)
【ファイルの基本構造】
・PHPタグ:ファイルは常に <?php または <?= のタグで始め、ショートタグ(<?)を使用してはいけません。
・文字エンコーディング:ファイルはUTF-8 without BOMを使用すること。
【クラス】
★Class機能概要
・1要素、1インスタンスで処理をする。
→処理対象の要素1つに対して、1インスタンスで操作する。
★クラス命名規約
・パスカルケースで記述する。
・クラス名の最後にClassとつける
・ファイル名と同一名とする。
★クラス記述規約
・クラスの開始ブレース({)は、クラス名の次の行 に配置します。
・クラスのプロパティとメソッド間には、1行の空行を挿入します。
・引数は1行ずつ記述し、70バイト目にその名称を記述する。
【コンストラクタ】
★コンストラクタ機能
・引数は必ず入力データチェックを行う。
・引数は、できるだけ型指定を行う。
・try〜catchで記述し、エラーの場合は処理を終了する。
・引数として取得した値は、クラスの変数として設定する。
・Classの特性をよく理解し、取得した引数のプロパティ情報を取得し、クラス変数として管理する。
【メソッド】
★メソッド機能
・引数は必ず入力データチェックを行う。
・引数は、できるだけ型指定を行う。。
・正常時には目的の値を返却するが、異常の場合は、必ずfalseを値として返却する。
・異常時の詳細な情報は、クラス変数として管理し、必要に応じて内容を確認できるように製造する。
・異常時の場合は、処理の途中で中断できるが、正常な場合は、メソッドの最終行で値を返却する。
・返却値としてメソッド内で共通の変数を利用した場合、rtnとする。
・返却値の型指定を必ずします。
★メソッドの記述
・引数は1行ずつ記述し、70バイト目にその名称を記述する。
・メソッド内使用変数はメソッドの先頭にすべて記述する。
・変数名は、変数名のみを記述し、場合によって、初期化する。
・メソッドの開始ブレース({)は、メソッド名の次の行 に配置します。
・メソッドの引数リストが長い場合、複数行に分けることができます。この場合、各引数は新しい行に配置し、カンマで区切ります。
★メソッド命名規約
・キャメルケースで記述します。
・メソッド名の頭にmeをつける
┣publicメソッドの場合
┃ meの直後に、uをつける。
┗privateメソッドの場合
meの直後に、rをつける。
【プロパティ】
キャメルケースで記述します。
★クラス変数機能
・クラス変数の設定は、setメソッドを製造する。
・クラス変数を取得する場合は、getメソッドを製造する。
★クラス変数命名規約
・private
privateプロパティの頭にpriをつける
・public
publicプロパティの頭にpubをつける
★プロパティ共通
・定数名:定数名はすべて大文字で、単語の区切りにアンダースコア(_)を使用します。
・メソッド内の処理結果を格納する変数は、何も制約がない場合ansにする。
【コメント】
・クラス、メソッドのヘッダには、以下の内容を記述する。
┣機能名
┣引数
┣返却値
┃┣正常時
┃┗異常時
┣製造者
┣製造年月日
┣更新年月日
┣リリース日
┣バージョン
┣概要
┗注意 ← 必要に応じて
・コメントを1行で記述する場合は、同コメントは次行のプログラムを機能を説明するものでなければならない。
・コメントは、70バイト目から記述する
┣70バイト目から記述するコメントは、変数等の名称でなければならない。
┗90バイトを越える場合改行して記述する。
・コメントの内容とプログラムが矛盾がないように記述する。
【配列】
★配列の記述
・配列は ショート配列構文 ([]) を使用します。
・配列が複数行にまたがる場合、各要素は新しい行に配置し、インデントします。
【例外処理】
★例外処理の記述
・try、catch 句の開始ブレースは、同じ行に配置します。
・catch 句は、前の try ブロックと同じインデントレベルで記述します。
【デストラクタ】
・クラス変数をすべて初期化する。
【共通記述方式】
・=(イコール)の位置は、できるだけ、コンストラクタ内、メソッド内で先頭から同じ位置に記述する。
・if文で判定する場合、判定条件は1行ずつに記述し分かりやすく記述する。
・ファイルの終了行
┗ファイルの最後には必ず 空行を1行 入れる必要があります。
*ファイルの最終行でコードが終わると、ファイルを他のツールで処理する際に予期しない問題を引き起こすことがあるためです。
・キーワードや制御構造のスタイル
┣キーワード (if、else、while、switch など)の後には、スペース を入れます。
┣制御構造の条件式の前後にはスペースを入れます。
┣開始ブレース({)は同じ行に配置します。
┗switch 文の case と default は、インデントされませんが、その内部のコードはインデントされます。break ステートメントは case 内でインデントします。
【インデント】
・1インデント、4半角スペースとする。
【ファイル】
★インポート
ファイルのインポートは、オートローダーで記述をする。
★名前空間と use ステートメント
┣namespace 宣言の後、1行の空行を入れる必要があります。
┣use ステートメントの後も 1行の空行を入れます。
┗同じ名前空間の複数のクラスをuse する場合は、個別に記述します。
以上の内容は、ChatGPTから教えてもらったPSRを基に作ったのですが、作ったものをChatGPTに評価したもらった方がいいことに気づきました。以下が、以上の規約のChatGPTの評価です。
■ChatGPTからの指摘
全体的に非常に詳細に規定されていますが、いくつかの改善点や補足を提案します。
❶ディレクトリ構成
改善点: PSR-4に準拠する場合、ディレクトリ構成についても、クラスの名前空間がディレクトリ構造と一致することを明示しておくと良いでしょう。
例: App\Controller\HomeController は app/Controller/HomeController.php に対応する。
❷クラス
不足点: クラスの可視性についての記述がないため、public、private、protectedの適切な使用方法を追加するとよいです。
例: 「クラスは原則 public で宣言し、必要に応じて final または abstract を使用する」など。
❸コンストラクタ
改善点: エラーハンドリングの詳細が少ないので、エラー時の処理方法(例外を投げる、ログに記録するなど)を規定するのも良いでしょう。
❹メソッド
不足点: メソッドの可視性(public、private、protected)に関する規定を追加するとより詳細な設計となります。
例: 「メソッドの可視性は必要最低限とし、デフォルトでは private を使用し、外部からのアクセスが必要な場合にのみ public を使用する」
❺プロパティ
改善点: プロパティの初期化についての規定を追加すると良いです。PSR的にはクラスのプロパティは定義時に初期化しておくことが推奨されます。
例: 「プロパティはクラス内で必ず初期化する。特にnullableなプロパティは初期値をnullに設定する」
❻コメント
改善点: コメントの書き方は非常に詳細ですが、PSR-5(PHPDocスタイル)に準拠する形で規定しても良いでしょう。
例: PHPDocの形式で記述し、引数、返却値、例外を詳細に説明する。
php
コードをコピーする
/**
* This method sets the error message.
*
* @param string $errMsg Error message to set
* @return bool True on success, False on failure
*/
❼配列
不足点: 配列の宣言時の可視性や型について、強く型付けする規定を設けると良いです。
例: 「配列にはできるだけ型を指定する。特に配列の型宣言はPHP 7.4以降の型指定を利用する」
php
private array $items = [];
❽例外処理
不足点: 例外処理の仕組みに関して、finallyブロックの使用や、カスタム例外クラスをどう扱うかについて規定を追加できます。
例: 「例外が発生した場合、業務ロジックに応じて適切に例外処理を行い、必要に応じてfinallyブロックでリソース解放などの処理を行う」
❾デストラクタ
不足点: クラス変数を初期化するだけでなく、リソース解放の必要がある場合などの記述があっても良いです。
例: 「デストラクタでは、クラス変数を初期化するだけでなく、リソース(DB接続やファイルハンドルなど)の解放を行う」
❿ファイル
不足点: ファイルの命名規則や、どのファイルにどのクラスや関数を置くべきかを明示すると良いです。
例: 「クラス名とファイル名は一致させる。1つのファイルには1つのクラスのみを定義する」
⓫名前空間
不足点: 名前空間の命名規則(例えば、アプリケーションやモジュールごとの名前空間の付け方)を詳細に規定しても良いです。
例: 「アプリケーションの名前空間はプロジェクト名に基づき、ルートの名前空間に設定する」
名前空間、ファイルインポート、ログ出力の部分の指摘は承知しています。実は、それを使うイメージができなかったことと、まだ当該規約に関連するプログラムを製造していなかったので、今まで規約に含めていませんでした。これ以降、プログラム製造時に考え、追記したいと思います。
それ以外の項目については、規約に含めるかどうか検討します。後日結果について報告するかもしれません。
[あとがき]
ChatGPTに聞いたところ、デバックできる文字数は、大体20,000〜40,000文字以内で、有料だろうが、無料だろうがステップ数は変わらないそうです。変わるのは解析能力とか、レスポンスの早さになるそうです。解析能力の向上とは、今まで以上に品質のよいプログラムを製造できるということでしょうか?非常に興味があります。毎日利用させていただいているので、ビジネス開始してからは有料で利用させていただきたいです。
このブログ更新後、プログラムのデバック及びPSRへのプログラム適用をします。
では、また!!!
【このカテゴリーの最新記事】