動詞を三人称単数化することでBoolを返すことを表せる

iOS系の動画を扱うフレームワークの中に [**AVplayerViewController**](https://developer.apple.com/documentation/avkit/avplayerviewcontroller) というクラスが存在します。

このクラスのメソッドを調べてみると 動詞を三人称単数化して Booleanを返すアクセッサメソッドがいくつか用意されていることに気づきました。

```
var showsPlaybackControls: Bool
```

```
var allowsPictureInPicturePlayback: Bool
```

```
var entersFullScreenWhenPlaybackBegins: Bool
```

```
var exitsFullScreenWhenPlaybackEnds: Bool
```

```
var updatesNowPlayingInfoCenter: Bool
```

```
var appliesPreferredDisplayCriteriaAutomatically: Bool
```

```
var requiresFullSubtitles: Bool
```

これ系のメソッド名でとても有名な `exists` が存在しますが、[Appleのコーディング規約](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html)では動詞を三人称単数としてBool値を返すアクセサメソッドが許容されています。

> If the property is expressed as a verb, the format is:
> - (BOOL)verbObject;
> 
> \- (void)setVerbObject:(BOOL)flag;
> 
> For example:
> 
> ```
> - (BOOL)showsAlpha;
> - (void)setShowsAlpha:(BOOL)flag;
> ```
> The verb should be in the simple present tense.

この時、動詞は三人称単数であるべきと説明されています。

これは一般的なのだろうかとググったところ以下の[解説](https://softwareengineering.stackexchange.com/questions/348649/naming-of-bool-methods-is-vs-can-vs)に出会いました。

> ...省略
> Meanwhile, "can" more clearly indicates a capability, e.g. CanEdit, CanRead, CanSeek. In each of these cases, can is followed by a verb.
> 
> Since "Support" is a verb, I think in your case CanSupportContentType is better.
> 
> **Shorter alternative**
> 
> On the other hand, the conventions say the prefix is optional. What's more, it's kind of cheesy to include the argument type in the method name, since a developer can see the type of the argument in intellisense. So you could just name your method Supports and define it like this:
> 
> public bool Supports(System.Net.Mime.ContentType contentType)
> ...which is shorter and still clearly communicates the purpose. 


グーグル翻訳


> 一方、「can」は、機能をより明確に示します。 CanEdit、CanRead、CanSeek。
> これらの各ケースでは、canの後に動詞が続きます。

> 「サポート」は動詞なので、あなたの場合、CanSupportContentTypeの方が良いと思います。
> 
> **より短い代替案**
> 
> 一方、慣例では、プレフィックスはオプションです。さらに、開発者はインテリセンスで引数のタイプを見ることができるため、メソッド名に引数のタイプを含めるのはちょっと安っぽいです。したがって、メソッドにSupportsという名前を付けて、次のように定義できます。
> 
> ```
> public bool Supports(System.Net.Mime.ContentType contentType)
> ```

# 三人称単数化する意味を考える

一般的にオブジェクト指向においてメソッド名に**動詞の原形**を使うことは、オブジェクトに対して **命令する** という意味付けがあるためです。
[参照 How should I name functions that return values in Python?
](https://softwareengineering.stackexchange.com/questions/334135/how-should-i-name-functions-that-return-values-in-python)
これはgitのコミットログを命令形にすることに通じると考えられます。

これをわざわざ三人称単数にすることで、今度は逆に**オブジェクトを主語として読むことが出来る**と考えられます。
つまりAVPlayerControllerの以下のメソッドは、主語がAVPlayerControllerとして読むことが出来、 「AVPlayerControllerが再生コントローラーを表示する」→ 「AVPlayerControllerが再生コントローラーを表示する(かどうか)」と補えると考えられます。

```
var showsPlaybackControls: Bool
```


# 大切なことはリーダブルであること

英語の変数名でとても重要なことは **英語としてリーダブル** であるかどうかだそうです。

[参照 Boolean method naming readability](https://stackoverflow.com/questions/1566745/boolean-method-naming-readability)
> The goal for readability should always be to write code the closest possible to natural language. 
> So in this case, `userExists` seems the best choice. 
> Using the prefix "is" may nonetheless be right in another situations, 
> for example `isProcessingComplete`

グーグル翻訳

> 可読性の目標は、常に自然言語に可能な限り近いコードを記述することです。
> したがって、この場合、userExistsが最良の選択のようです。
> それでも、isProcessingCompleteのように、接頭辞「is」を使用することは別の状況で正しい場合があります。

ちなみに `isUserExists` はネイティブからすると非常に奇妙に聞こえるようです。

> first one sounds like `isBabbyFormed`
 
`isBabbyFormed` はググるとどうやらアメリカのヤフーの質問で `How is babby formed?` という質問が由来だそうです。
日本のゲームがやらかした [All your base are belong to us](https://ja.wikipedia.org/wiki/All_your_base_are_belong_to_us) に通じるものがあるのだろうと思います。

# 参照

* [AVPlayerViewController](https://developer.apple.com/documentation/avkit/avplayerviewcontroller)
* [コーディング規約 Naming Methods](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html)
* [Boolean method naming readability](https://stackoverflow.com/questions/1566745/boolean-method-naming-readability)
* [Naming of bool methods: Is vs. Can vs.?](https://softwareengineering.stackexchange.com/questions/348649/naming-of-bool-methods-is-vs-can-vs)
* [昔の日本語ゲームの伝説的クソ英語翻訳](https://cpplover.blogspot.com/2013/06/blog-post_27.html)
* [外国人が語る：英語でクラスやメソッド等の名付け方](https://qiita.com/gazayas/items/3d352d1b6ec9a225c6f6)
* [Git Commits: Past or Imperative?](https://www.danclarke.com/git-tense)
    * git自身が命令形を使うことを推奨していることが解説されている