名づけについての覚書
📅 2024-11-30
📛 Rerurate_514
名づけについての覚書
概説
どうも、T科2二年のK.Y.(HN Rerurate_514)です。 今回は「綺麗なコードを書くために」と題しまして、読みやすいコードの書き方について解説します。今回は、第一回目として名づけについてです。 以下、読んだほうがいい導入。
私は常々、友達や先生の書いたコード、教科書内のコードを読むたびにこう思っていました。 「なぜコードを綺麗に書かないのか」、と。
もちろん、生徒などはまだコードを綺麗に書くというものが何なのか知らない人もいるわけですから無理もないでしょう。しかし、その手本となるような先生や教科書のコードまで汚いのは何事でしょうか。
変数名を一文字で書くのはもちろん、クラス名まで頓珍漢なもの、課題の名前をクラス名につけるというのは本来あってはならないことです。数学でいうところのf(x)やG(x)などはプログラミング的には言語道断です。 例:
class Kadai1:
...名は体を表すという言葉があるのと同じように、プログラミングでは名前がそのオブジェクトの役割、性質を表すのです。
アルゴリズムとかオブジェクト指向とかなんだの言う前に、まず見通しのいいコードとは何なのかを覚える必要があります。
弊学の授業では全くもって綺麗なコードを書くことを教えないわけですから、このソフトウェア技術研究会所属の私が責任もって論説していこうと思います。
名づけ
関数名と変数名を使用した例
授業では全くもって変数名、関数名の大事さやクラス名について扱いません。
例えばこのようなコードがあるとします。
def func(a):
b = 0
for(i in range(0, a)):
b += i
return bちょっと例が短すぎる気もしますが。。。
そして、この例に書いてあるコードを呼び出してみます。
temp = func(10)
print(temp)皆さんはこの呼び出された側のコードを見て、何をしているかわかりますか? まあなんかfuncっていう関数に数字を入れて、そしたら値が返ってくるみたいなことはわかります。しかしそれだけなんです。 ちなみに何の型が返ってくるかもわかりません。booleanなのかstringなのか。。。これはPythonのせいでもありますが、funcという名前のせいでもあります。
こういった見るだけでわからないコードがあると、そのコードが何をしているか確認するというプロセスが入ります。 今回の例では、実装先のコードfunc()関数の中身までもが、ちょっと読みづらいです。 さらにこの関数の中身を解読するというプロセスもすごい無駄です。 この解読の際、最初に変数を見た場合、どのような思考を行うのかというと、
- 変数を見て、まずどこで、どんなふうに、宣言されているかを確認する。
- そして、コードを上から見ていってどこで使用されているかを見る。
- その周辺のアルゴリズムを頭で実行してみる。
- そのコードにおける変数の役割を知る。 みたいな感じでしょうか。
そして、funcという関数を使用したコードを見た場合、何をしているのかを確認する場合には、実行するか頭で考える以外にはありません。 いちいち、実行したり、実装先まで見に行ったりするのは面倒くさいですよね。 そこで名前を適切に設定するのです。
先ほどのコードでは、おそらく総和を求めていそうなのでそれをもとに書き直してみます。
def calculateSum(limit):
result = 0
for(i in range(1, limit)):
result += i
return result呼び出し先では、
total = calculateSum(10)
print(total)になります。 この呼び出し先のコードだけ見ても、何をしているコードなのかが明確にわかるかと思います。 計算を行うことを示すcalculate(「計算する」の略)と、総和を示すSumの合わせですね。
変数名、関数名そのものがアルゴリズムに影響を与えたり、UX上の問題があるわけではないですが、開発効率上にとっては大事なことなのです。そのため、軽視されがちです。
文字の区切りの法則
忘れていましたが、変数名や関数名、クラス名などで単語の区切りは、基本的には大文字で区切ります。 例えば、先ほどのcalculateSumを全部小文字にすると、
calclatesumとなります。 これではぱっと見、とても分かりづらいですよね。ローマ字を読むときにとても見ずらいのと同じです。(ro-mazittemecchamiduraidesuyone puroguraminngudekonnnanogaattarahakkyousichaimasu)
因みにこの大文字で単語を区切るやり方をキャメルケースといいます。 さらに関数は小文字から始まっているので、これをロウワーキャメルケースといいます。 反対に、大文字から始まっていたらアッパーキャメルケースといいます。
そのほかにも_(アンダーバー)で区切るスネークケースというものもあります。 CSSやHTMLなどでclassやidを付けるときには、-(ハイフン)で区切るケバブケースをよく使用します。
関数名について、名付けるときの注意点
関数名について、名前を付けるときの注意点として大事なものがあります。 それは、「必ず動詞から始める」です。
先ほどの、calculateSumTotalでもそうでしたが、必ず関数は動詞から始まる英文である必要があります。
よく使用するものであれば、fetch~やdelete~などでしょうか。 ここら辺の命名法則はかなり奥が深く、高度で幅広い知識が要求されます。(ついでに英語力も)
この記事では解説しないというか、私がその域に達していないので各自で調べてみてください。Qiitaにほぼ辞書のような分量の記事があります。
関数名は原則、ロウワーキャメルケースです。
ただ、何の型を返すかによっても何から始めるかが決まるときもあります。 例えば、Booleanを返すようなメソッドの時です。 Booleanを返す時、関数名の動詞を自分でかんがえう
クラス名について、名付けるときの注意点
関数名では最初、動詞から始めなければいけませんでしたが、クラスではどうでしょうか。
クラスにも大事な点があります。 それは、「必ず名詞にする」です。
クラスはオブジェクトそのものを表すがために、名詞である必要があります。 例えば、このようなクラスがあったとします。
class ShowPerson:
...このShowPersonというクラス、人物の情報を保持するクラスなのか、人物情報を表示するクラスなのか判別がつきません。
この時、
person = ShowPerson("太郎", 20)と書いたとしても、関数と区別がつかない問題もあります。 このあたりの問題は副次的なものですが、本質的にはクラスはモノを表すからです。
ShowPersonが人物の情報を保持する人物オブジェクトならば、
class Person:
...と書くことで分かりやすくなります。
さらにメソッドを実装した場合、
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def walk(self):
...と書くと、
tarou = Person("太郎", 20)
tarou.walk()となり、動詞から始めたメソッドと英語的に主語-動詞でつながります。 このようなコードは何をしているかが明確なのです。
基本的に、クラス名とメソッド名で英文が完成するような命名を心がけましょう。
クラス名は原則、アッパーキャメルケースです。
変数名について、名づけるときの注意点
変数名については明確にどう名付けるかは決まっていません。 しかし、その変数について明確に説明を果たしていなければなりません。
よく、このような変数名が使用される場合が多いかと思います。
tmp = keisan()tmpまたはtempです。
tempは一時的という意味ですから、よく使用する人が多いかと思います。 しかし、変数はよっぽどのことがない限り、ほぼ一時的なものです。関数を出たら、関数内の変数は使用できなくなりますし、ifを出たらその中で定義している変数も使用できなくなります。(できる言語もあります。)
例外として、tmpを使用してもいい場面もあります。それは本当の意味で一時的に値を格納する場合です。
x = 10
y = 20
# xとyを入れ替えたい
tmp = x
x = y
y = tmpこのような入れ替えの際に一時的に必要になる変数についてはtmpを使用しても良いです。
そして、cやpなどの一文字だけの変数名もやめましょう。 これでは変数が何を表しているかが不明です。 ただし、forループ内のインデックス変数であるiやjだけは例外です。 これはスコープがforの中で限定されることが確定していますし、慣例的にもiが何をしているかが分かるためです。
さらに、その変数の型によって命名規則が決まるものがあります。 それは、boolern型などのフラグ変数です。 最近はそうでもないかもしれませんが、UIを制御する際にフラグ変数を使用することが多いです。
selectFlg = falseこの時、flgという変数名はとても曖昧なものなので使用しない方が良いです。 フラグがtrueの時に動作するのか、falseの時に動作するのかも曖昧です。
この時、プログラミング業界的にflgではなく、isで表します。
isSelected = trueこの場合ですと、英文でisSelectedがtrueという意味になります。 日本語に直すと、選択されている = trueになり、意味が明確になります。 基本的に受け身で記述します。
さいごに
私もまだまだ勉強不足ですからに、間違っている箇所があるやもしれません。 その時はDiscordの僕宛にメンション投げてくださるとありがたいです。 それとこれも書いたほうがいいんじゃないのみたいなのも言ってください。
私の知識はかなりリーダブルコードや良いコード悪いコードに偏ってますから見たことがあるかもしれません。そこはご容赦ください。。。