関数・変数命名とAI活用に関する考察
はじめに
ソフトウェア設計論の授業で、「意味のある関数名・変数名をつける」ための思考プロセスと、AIの活用方法について学びました。本記事では、実際にCプログラムのコードを題材として、以下のステップで命名・検討・考察を行った結果をまとめています。
課題の概要
以下のC言語のコードは、昇順にソートされた単方向リストに新しい値を挿入する関数 add
を定義しています。このコードをもとに、関数名・変数名をよりわかりやすく改名するのが課題です。
#include <stdbool.h> // bool, true, false
#include <stdlib.h> // malloc, NULL
#include <assert.h> // assert
struct entry {
int value;
struct entry *next;
};
struct linked_list {
struct entry *head;
};
extern bool is_sorted(struct linked_list list);
void add(struct linked_list *list, int value) {
struct entry *e = list->head;
struct entry *f;
while(e != NULL && e->value <= value) {
f = e;
e = e->next;
}
f->next = (struct entry *)malloc(sizeof(struct entry));
f->value = value;
f->next->next = e;
}
Step 1:「ものの名前」手法で命名(AI不使用)
関数や変数の役割を自分なりに整理し、名前を考えました。
元の名前 | 役割の説明 | 命名案 |
---|---|---|
add | ソート済みリストに新しい値を挿入する関数 | insert_sorted_ascend |
e | 現在走査中のノード | current |
f | currentノードの一つ前のノード | before |
Step 2:AIに質問だけを投げて名前を提案してもらう(コードなし)
AIにはソースコードを見せず、以下のようなプロンプトで命名案を尋ねました。
使用プロンプト例
-
add について:
ソート済みリンクリストに新しい値を挿入する処理をする関数。処理内容がわかる関数名を考えて。 -
e について:
挿入処理の中で、現在のノードを指して走査に使う変数の名前を考えて。 -
f について:
挿入位置の一つ前のノードを指す変数の名前を考えて。
AIの提案
名前 | 提案された候補名 |
---|---|
add |
insert_sorted , insert_in_order , insert_sorted_order
|
e |
current , curr_node , traversal_node , insertion_point
|
f |
previous_node , prev , before_current
|
Step 3:ソースコードと一緒にAIに命名させる(コードあり)
使用プロンプト
このコードにおいて、昇順でソートされたリンクリストに新しい値を挿入する関数の名前を考えてください。
また、その関数内で使われている変数 e(走査用)と f(挿入位置直前)に適切な名前をつけてください。
AIの提案
名前 | 提案された候補名 |
---|---|
add |
insert_sorted , add_sorted , insert_into_sorted_list
|
e |
current , current_node , cursor
|
f |
previous , prev_node , insertion_point
|
Step 4:比較と考察
命名比較表
工程 | 関数名 |
e (現在のノード) |
f (1つ前のノード) |
---|---|---|---|
1(自分で命名) | insert_sorted_ascend |
current |
before |
2(AIに説明だけ) |
insert_sorted , insert_in_order
|
current , curr_node
|
previous_node , before_current
|
3(AIにコード+説明) |
insert_sorted , add_sorted
|
current_node , cursor
|
prev_node , insertion_point
|
考察
- 自分で考えた Step 1 の命名は、実用的であり、AIの提案とも大きく乖離していないと感じました。
- 特に
e
やf
に関しては、「ノードであることを明示する名前(例:current_node
,prev_node
)」という視点が自分の命名には欠けていたと反省しました。 - 命名の質は、**「その関数や変数が何をしているのかを正しく理解し、説明できる力」**に大きく依存していると実感しました。
- ソースコードをAIに与えるかどうかに関係なく、「その関数・変数が何をするものか」を適切に伝えることが、AIからの命名提案の質を左右する重要なポイントです。
仮説検証:ソースコードだけでAIは意味のある名前をつけられるのか?
仮説
AIは、ソースコードだけでも関数や変数の意味を分析し、それに対応した適切な名前をつけているのではないか?
方法
- ソースコードだけをAIに与えて、
と依頼。
add, e, f に適切な名前をつけてください。
- 結果を Step 2(説明だけ)と比較。
AIの回答要約
名前 | 提案された候補名 |
---|---|
add |
insert_sorted , insert_in_order
|
e |
current , cursor
|
f |
previous , before_insert
|
結論
- Step 2 とほぼ同様の名前が提案された。
- つまり、AIはソースコードからも役割を理解して命名していると考えられる。
- よって、「コードの内容を正しく言語化したプロンプト」を与えることができれば、コードなしでも十分に有効な命名支援が得られることが分かった。
おわりに:AIと命名のこれから
今回の学びから得られた重要な知見は、以下の3つです。
- 意味のある名前は、対象の役割や処理を正確に理解する力が必要である。
- AIに任せる場合でも、その役割を正しく説明できるプロンプトが重要である。
- ソースコードを渡すだけでなく、自分の言葉で役割を整理することで、よりよい命名に近づける。
今後も関数・変数の命名に迷ったときは、自分でその役割を言語化し、それをAIに投げかけてブラッシュアップするというスタイルを継続していきたいと思います。