Day17で「三角関数の波」を追加しました。GitHub Copilotコードレビューに対応してみます。
リポジトリ:
GitHub Page(最新):
GitHub Copilotコードレビューとは
公式情報
今まで使ったことなかったのですが、うっかり、クリックしてしまったので、使ってみたいと思います。
VSCodeからも使えるようですが、今回はGitHub.comのプルリクエスト画面です。
※Copilot Proライセンスを使っています
対象プルリクエスト
ギャル設定が効いています。レビュアーと開発の相棒は、人格を分けたいような気持にもなりました。あとで調べてみます。
コメント内容を確認する
コメントをざっと眺めていくとほとんどが「コメントが不親切」というもので、ひとつだけ実装に関する指摘がありました。
「コメントが不親切」というレビューコメント
せんぱい、コメントがちょっと端的すぎるかもです💦
このプロジェクトは学習教材としても使われるので、初学者にもわかりやすいコメントを追加した方がいいですよ✨
sin/cosの基本的な説明や、周波数・振幅・位相の数学的な意味を加えると、初学者にとってもっと理解しやすくなりますよ💖
JSDocブロックに、sinとcosを合成する数学的な意味や、なぜ* 1.3や* 0.4という係数を使っているのか説明を加えると、学習者にとってもっと理解しやすくなります💖
コードに対する指摘
せんぱい、drawSineWaveとdrawCosineWaveの実装を見てみたんですけど、ほとんど同じコードが重複してますね💦
2つの関数の違いは、76行目と113行目でp.sin()かp.cos()を使うかだけです。DRY原則(Don't Repeat Yourself)に従って、共通のdrawWave関数を作って、三角関数を引数として渡すようにすると、コードがもっとシンプルになって保守しやすくなりますよ✨
コメントを修正する
まとめて直してもらう
チャットプロンプト (Agentモード、Claude Sonnet4.5):
このプロジェクトは学習教材としても使われるので、初学者にもわかりやすいコメントを追加してほしい。数学的な説明を丁寧にしつつ、p5.jsについてはインラインで簡潔にお願い。
おや。めずらしく、コードが破壊されています。コメント行がずれてしまったのでしょうか。

チャットプロンプト (Agentモード、Claude Sonnet4.5):
JSDoc部分の書き方が崩れてしまっています。直して。
ざっと眺めて、コメントが親切になっている変更だけが入っているように見えます。だめだったら、もう1回指摘してくれることを期待してコミットしてプッシュしてみます。
よくわかりませんが、プルリクエスト画面でこれを押してみました。

過去の指摘は、特に何も変化せず、全然違う指摘が追加されました。

過去のコメントに対応していくには、プルリクエストを新しく作っていくのが正しいお作法なのでしょうか。

このあたりは、あとで確認することにして、今は、1個ずつ目チェックで行くことにします。
1個ずつ直していく
map関数の説明
レビュー指摘:
他のアート作品(circle.jsやspiral.js)では、p5.jsの関数に詳しい説明コメントがついてます(例:「// map: 値の範囲を変換(マウスX座標0-700を3-15に変換)」)。このプロジェクトは学習教材としても使われるので、初学者にもわかりやすいコメントを追加した方がいいですよ✨
チャットプロンプト (Agentモード、Claude Sonnet4.5):
コメントを// map: 値の範囲を変換(マウスX座標0-700を3-15に変換)」みたいにして。
直りました。
// マウスの位置で波のパラメータを変化させる
let frequency = p.map(p.mouseX, 0, p.width, 1, 5); // map: マウスX座標(0~画面幅)を周波数(1~5)に変換
let amplitude = p.map(p.mouseY, 0, p.height, 20, 100); // map: マウスY座標(0~画面高さ)を振幅(20~100)に変換
コミット、プッシュして、プルリクエスト画面のコメントは無言でResolveしちゃいます。
三角関数の説明
レビュー指摘:
他のアート作品(特にspiral.jsの48-73行目)を見ると、数学の公式や概念についての詳しい説明がJSDocブロックに含まれてます。三角関数の波についても、sin/cosの基本的な説明や、周波数・振幅・位相の数学的な意味を加えると、初学者にとってもっと理解しやすくなりますよ💖
まとめてコメント追加してもらった対応で、以下のように詳しく記載されています。周波数、それでいいのか。と思いつつ、よしとします。
/**
* サイン波(sin波)を描画する関数
*
* 【数式】y = yOffset + A × sin(2πfx + φ)
* - yOffset: 波の中心位置(画面上のどの高さに表示するか)
* - A: 振幅(波の高さの半分)
* - f: 周波数(画面内に何個の波を表示するか)
* - φ: 位相(波の開始位置、時間で変化させるとアニメーションになる)
*
* @param {number} yOffset - Y軸の中心位置(波の基準線)
* @param {number} amplitude - 振幅(波の高さの半分)
* @param {number} frequency - 周波数(波の数)
* @param {number} phase - 位相(波の開始位置のズレ)
* @param {number} hue - 色相(0-360の色)
* @param {number} weight - 線の太さ
*/
function drawSineWave(yOffset, amplitude, frequency, phase, hue, weight) {
cosine波に対する指摘
レビュー指摘:
せんぱい、cosine波の実装もいい感じです✨ ただ、学習教材としては説明がちょっと足りないかもです💦
ループ内の処理や関数(p.beginShape(), p.cos(), p.vertex()など)に、動作を説明するインラインコメントを追加すると、初学者にとってもっと親しみやすくなりますよ!
sin関数側と比べると、確かに不親切ですが、同じ関数であることと、あとでsin関数と一緒にされると予想されるので無視することにします。
合成波の説明
レビュー指摘:
JSDocブロックに、sinとcosを合成する数学的な意味や、なぜ* 1.3や* 0.4という係数を使っているのか説明を加えると、学習者にとってもっと理解しやすくなります💖 他のアート作品(spiral.js)を参考にしてみてくださいね!
まとめて直したコメントでは係数の意味まで言及していなかったので、追加でリクエストしてみます。
チャットプロンプト (Agentモード、Claude Sonnet4.5):
1.3 とか 0.4の数字はどこから出てきたのかわかるようにして
なるほど…そうだったのか…となりつつ、いい感じなのでOKにしていきます。
/**
* 合成波(sin + cos)を描画する関数
*
* 【数式】y = yOffset + (sin(θ) + cos(1.3θ)) × A × 0.4
*
* 複数の波を足し合わせることを「重ね合わせ」と言います。
* 音楽でいうと、異なる音を同時に鳴らして和音を作るようなものです。
* この例では、周波数の異なる sin と cos を足して、
* より複雑で興味深い波の形を作り出しています。
*
* これは「フーリエ変換」という数学の考え方につながります:
* どんな複雑な波も、単純な sin/cos 波の組み合わせで表現できる!
*
* 【使用している定数の意味】
* - 1.3: 周波数の比率(整数比ではない値を使うと、規則的すぎない面白いパターンになる)
* - 0.4: 振幅の調整係数(2つの波を足すと大きくなりすぎるので、0.4倍して他の波と調和させる)
*
* @param {number} yOffset - Y軸の中心位置
* @param {number} amplitude - 振幅
* @param {number} frequency - 周波数
* @param {number} phase - 位相
* @param {number} hue - 色相
* @param {number} weight - 線の太さ
*/
function drawCompositeWave(yOffset, amplitude, frequency, phase, hue, weight) {
キャンバスをつくるところの実装説明
レビュー指摘:
他のアート作品(circle.js:12-13)では「// パディング分を考慮」や「// 高さは幅の70%(最小300、最大500)」のように、計算の意図が詳しく説明されてます。学習教材として、初学者にもわかりやすいコメントを追加するといいですね✨
まあまあ親切になっているのでいいことにします。
p.setup = () => {
// 最初に一度だけ実行される初期設定
const container = document.getElementById('canvasContainer');
const w = container.offsetWidth - 20; // 左右のパディングを考慮
const h = Math.max(300, Math.min(500, w * 0.7)); // 高さを計算
p.createCanvas(w, h); // キャンバスを作成
p.colorMode(p.HSB, 360, 100, 100, 100); // HSBカラーモード(色相、彩度、明度)
};
ここまでで、コメントに関する対応は終わりです。
あとは、コード内容に関する指摘ですが、疲れたので、いったん休憩です。
次やること
コード内容に関するレビュー指摘に対応していきます。-> Day19