外国人が語る:英語でクラスやメソッド等の名付け方

  • 1668
    いいね
  • 17
    コメント

私は外国人です。
アメリカ人です。
Hello笑

正確に言うとプエルト・リコ人で1歳の時にアメリカに引っ越してずっとアメリカで育ったけど、それはまた別の話ですw

この記事の目的

多くの日本人は自分の英語力には自信がないではないでしょうか。残念ながら「英語がわからん」、「英語が全然できない」という声をしょっちゅう聞いています。でも、英語ができる何人かの日本人に出会ったことがありますし、完璧でなくても意図がちゃんっと伝わったことが確実です。ペラペラに話せるのではなく、自分の思いが伝わって、仕事を進むことができること。それはオープンソースのプログラムや英語系のプログラムに手を出すためには一番大事なことだと思います(外国人側もすごく助かるし)。日本の文化では「私はできる!」と自慢することは少ない中、この記事を通して、ペラペラでなくても自分のプログラミングの名付け方にはちょっとだけでも自信を持たせたいなと思います。完璧でなくていいです。Let's go!

合わせて読んでいただきたい

プログラミングでよく使う英単語のまとめ【随時更新】
うまくメソッド名を付けるための参考情報
クソコードにならない為に、これだけは守って欲しい7つのこと <- (特に「コメントは綺麗に書こうとするな。思いを込めろ!!!」の部分)

概要

  1. 英文らしい書き方
  2. 極力、引数も含めて、クラス、メソッドや引数を1つの文章として扱うこと
  3. 区切りをなくすこと
  4. 変数などの長さ・省略する時の落とし穴

1. 英文らしい書き方

筆者は普通にRubyを書いていますが、RSpecがものすごく好きです。

example_spec.rb
it { is_expected.to eq(10) }

実はRSpecで初めて見たのはdeprecatedになった「should」の方だったけど、こういうのを見たら、「え!?これってアリなん??普通の英語の文章を読んでるみたい!」って思って結構印象が残されました。でもよく考えてみれば、JavaからRubyの勉強を始めた時、またPythonの方を見た時にも、同じような印象が残されました。

実は、プログラミング言語やフレームワークがますますこう展開していくじゃないかと思います。つまり、将来のプログラムやプログラミング言語はRSpecやshoulda_matchersみたいに、英語の一口の集まりで成り立つようになるのではないかと。こういう書き方を見ると、「ああ、これっていいな〜。読みやすっ!」と思います。他人の外国人もそう思うに違いないと思います。

ということはここでポイント!
作りたい英文を考えた上で実装すること!

コードをできるだけ英語で書くことは当たり前だろうと思われるけど、英単語をよく使う書き方ではなく、英らしい書き方というのがポイントです。もちろんしっかりとした英文でなくてもいいです。コードの使いやすさというのは、一口で、短いコマンドを作ることが目的ですから。
書きたいメソッドだけじゃなくて、クラスが何に対して何をするか、という全面的な考えから初めて、自分の作りたい英文を書くこと。紙を出して何文かを書いてみてください!複雑で長い文章じゃなくて、シンプルかつ気持ちのいい文章がポイント!
特に次の項目で気持ちのいい書き方の1つを紹介させていただきたいと思います。

2. 極力、引数も含めて、クラス、メソッドや引数を1つの文章として扱うこと

クラスは大体名詞になってますね。ゲームを作る時はPlayerとか、サービスを作る時はUserとか。
オブジェクトってそもそも何らかのものなのでこれって分かりやすいですよね。

メソッドの名付けでこけることは多いではないでしょうか。
簡単な例なんですが、次のプログラムをみてください。

game.rb
Type = ["♥", "♦", "♣︎", "♠︎"]

class Deck

  attr_accessor :cards

  def initialize
    @cards = []
    4.times do |n|
      1.upto(10) do |i|
        @cards.push([Type[n], i])
      end
    end
  end
end

class Player
  def initialize(name)
    @name = name
  end

  def shuffle deck
    deck.cards.shuffle
  end
end

こんな書き方だと、

player1.shuffle deck

という書き方ができて、かなり読みやすい。

最近は次のような書き方を見て、少し気になりました

def shuffle_deck deck
  deck.cards.shuffle
end

メソッド名を見るだけで分かるような名前なんですけど、大体はメソッドは引数とペアになっていますから、メソッド名と一緒に引数を合わせて文章を作ると結構簡潔な感じになると思います。
RSpecやshoulda_matchersはこれを充分に実現しています。

ポイント!
主語 + 動詞 + 目的語」という書き方が最高w
主語 = クラス
動詞 = メソッド
目的語 = 引数

でも、「主語 + 動詞 + 目的語」で行かないといけない!というわけでもない。
あくまで、何が何に対して何をするかというのを明確にしたいです。

次のはちょっと高度な例です。
筆者は最近こんなメソッドが書きたかったです。
Playerscoreがあって、ゲームで勝つとscoreが上がります。
英文を考えたら、「Add 1 to score」がパッと頭に浮かんできました。
でもそうすると次のようになってしまう...

player.rb
class Player
  def initialize
    @score = 0
  end

  def add(num)to_score
    @score += num
  end
end

player1 = Player.new
player1.add(1)to_score

これって有り得ないですよねww
「でも読みやすい!!!ああ、これみたいなメソッド名が書きたいな!」って思いました。
その時、次のメソッドを考え出しました

player.rb
def score_increases_by(num)
  @score += num
end

player1.score_increases_by(1)

「主語 + 動詞 + 目的語」という形じゃないけど、ここでnumはbyの目的語なので、クラスは何に対して何をするかは明確ですし、英語の文章のように読めます。

「プレイヤー1のスコアはnumずつ上がります」
読みやすいですね。「player1のscore」を主語にして、numを引数に。
クラス、メソッド、また引数を1つの文章として扱って、文章の語順・流れが読みやすくて気持ちいいですよね。

もちろん player1.score += 1を書いてもいいけどww例えばの話です!

別の例を挙げると...

object.rb
player1.draw card
player1.send message
player1.forfeit match

などなど

ぜひとも、このテクニックを使ってみてください。

3. 区切りをなくすこと

Rubyではtrueかfalseを確認するためには、「?」のメソッドがよく使われます。

true_or_false.rb
class Player

  attr_accessor :card, :score

  def initialize
    @card = "♥"
    @score = 0
  end

  def has_heart?
    # 真偽を返す
    @card == "♥"
  end
end

if player1.has_heart?
  puts "You have a heart!"
end

これって。。。私的にはちょっと気になりますね。だって、英語で「If player has heart?」ってなんて言わないんですよ。「Ifが含まれる文章に質問?? If... then... の流れでしょう?」って感じ。だから区切りがないはずのところには区切りがあります。
入れ替えたらマシなんですけど、まだ違和感が...

true_or_false.rb
puts "You have a heart!" if player1.has_heart?

なんで質問なんだよ?って感じですww
でも、それはRubyの「文化」だと思うからそう簡単に変えられないと思います。
(私はRubyが大好きです!ディスってないよ!ww)

私だったら、こう書きます

true_or_false.rb
def has_heart
  @card == "♥"
end

if player1.has_heart then
  puts "You have a heart!"
end

こんな感じだと、thenとの関係においては違和感を感じませんね。
うまくメソッド名を付けるための参考情報の「真偽値を返すメソッド」のところはいいと思います

あんまり違いはないと思われるかもしれませんが、これはコードの読みやすさにつながります。
自分のコードをスッと読めますか?一発で言えるはずの文章には区切りがありますか?

作りたい「文章」の中で区切りを感じれば、メソッド名、if文やwhile文などを考えて一発で言えるように作り変えましょう。

4. 変数などの長さ・省略する時の落とし穴

これは英文に関係はないけど、たまに気になるので何かを書いておきたいと思いました。
「合わせて読んでいただきたい」のところにクソコードにならない為に、これだけは守って欲しい7つのことを入れました。その記事の中で下記が書いてありました

「なぜ?」と疑問を持たれるコメントを残すな!!

コードのメソッド名、変数名なども同じです。
最近は「Pelmanism」という言葉を人生で初めて見ました。英語は第一言語なのに、これってどういう意味か全く知りませんでした。
その言葉を紹介した人の話を聞いたら、「Pelmanism」は「神経衰弱」という意味です。
私ですと、「神経衰弱」のことをずっと「Memory Game」と呼んでいましたwww

だから自分には、またコードを読んでいる人には自分の意図がちゃんと伝わるようにメソッド名などを書いてください。かっこよくて長い英語とかじゃなくて、コードの具合を進むための読みやすさを重視してください。シンプルが最高。

ただ、省略することに気をつけてください。
こんなコードを見たことはありませんか?

abbreviations.rb
rlts = db.execute(sql)
rlts.each do |r|
   r = r.to_i
end

「rltsってそもそも何なんだよ?ましてrになると全く分からん!」と言いたいところです。
こういうコードを書くとしたらちょっぴり長くても、意図が伝わるように英単語をそのまま書いてください

abbreviations.rb
results = db.execute(sql)
results.each do |result|
   result = result.to_i
end

まあ、短いのでここで単数形の「result」を「res」にしてもいいかと思いますが、とにかく意図が伝わることが大事だと分かったと思います。そのために、乱暴に英単語を省略しないように心がけましょう。自信がない時は、そのまま英単語を書きましょう。

よく使う省略と、複数の言葉からなる変数の場合では省略をしてもいいと思います。
上のdbdatabaseだと分かりますよね。その略はたくさん使われているのでok。
また馴染みのないものだと、

ppap.rb
# pen pineapple apple pen
ppap = Picotaro.new

# 出たww 馴染みあるかw

という風に、コメント付きで書けばいいと思います。

振り返り

一番大事な項目は次の2つだと思います
1. プログラミングの書き方がますます英文らしく変わっていく現実の波に乗りたい
2. ペラペラな英語、また1つの英単語に納まるメソッド・変数じゃなくて、シンプルかつ分かりやすいものが仕事の効率につながります

「私はできる!」と自分から思うのは難しいかもしれませんが、たくさんの日本人は結構いいコードを書いています!みんなと分かりやすい言い方を共有したりして、拡張しやすいコードを書いていきましょう!

Do your best! And please enjoy programming in English (^_^)