質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

命名規則

命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

Q&A

解決済

4回答

10554閲覧

命名規約について

recode

総合スコア31

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

命名規則

命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

2グッド

4クリップ

投稿2016/12/03 11:20

編集2016/12/12 21:15

最近オブジェクト指向を意識し始めて、命名規則を考えるようになりました。
オブジェクト指向は、処理がブラックボックス化するので名前がかなり重要だと思い考えています。

よく公開されているコードで見る変数の命名規則がキャメルケースで書かれていることが多いです。
それとは逆に、変数の命名規則について自分はパスカルケースで書くほうが自然だと思ったのですが、なぜキャメルケースで書くのでしょうか。

よく見る命名規則
クラス:UserController
関数:getUserData()
変数:userName

自分の最適だと思う命名規則
クラス:UserController//必ず先頭は名詞
関数:getUserData()//必ず先頭は動詞
変数:UserName//必ず先頭は名詞

なぜそう思うのか
よく見る命名規則は、変数名がキャメルケースになっていることが多いです。
しかし、関数には演算などの処理をさせる部分を全て書きますし、クラスはインスタンスを作成して使用するので変数と同じくデータを格納しておくものと分類できます。
そのため、変数とクラスは必ず先頭の単語を名詞にし、関数の先頭の単語は動詞にすると自然だと思います。

クラスのインスタンス作成時の違い

//パスカルケース UserController = new UserController(); //キャメルケース userController = new UserController();

上のコードだと、変数の中にはクラスとデータが混同しています。
やはりこの場合だと名前でクラスかどうかを判断するので、記法によってクラスと変数を見分ける要素は薄いと考えます。

下記の例だと、変数を見分ける時、1と2より2と3の方が見分けられやすいと思いました。
また、getNameDataはnameDataを取得するのかNameDataを取得するのでは後者の方が自然な気がしました。

1, nameData; 2, getNameData(); 3, NameData;

質問
自分としては、変数とクラスは同じくパスカルケースで書いたほうが、
関数と変数の見分けがすぐに付くので可読性が上がると思うのですが、なぜ変数をキャメルケースで書く場合が多いのでしょうか?

追記:多くの様々な回答ありがとうございました。
・言語によってメジャーな命名規則が違う。
・ある集団内での独特な命名規則は、多くのコストを生む。
・変数/関数名を頼りにした書き方であると、その集団内での仕様を確認しなけらばならずコストである。
・変数をパスカルケースで書くとクラスメソッドとの違いを見分けられない
・後ほどQiitaにまとめておきます。

h-yoshinaka, maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

解決済みですが多少の違和感について少しだけ。

命名規則はまず言語ありきです。
特定の言語を使うなら特定の言語の命名規則に則って書くのが自然です。
※組織も大事ですが、言語も相応に大事です。新しいメンバーが来た時に通常の言語の規約に反していれば衝突は避けられません。

この話題では言語のタグ付けがされていませんが、関数名がcamelCaseと何らかの言語を前提としています。
C#の関数名はPascalCaseですし、Rubyはsnake_caseです。
これら言語の規約を無視することは憚られる行為だと僕は考えています。

自分自身の何等かの感性にしたがってこのルールを曲げるという行為に反対します。
各言語の規約には、言語の特性に沿った目的があります。
可読性に難があると感じられるのはコーディング方法とか、解釈の仕方とか、そっち方面のミスかもしれませんよ。

投稿2016/12/07 02:11

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Javaでのクラスメソッドとインスタンスメソッドの見分け方はどうしますか?
あなた以外が書いたコードでHoge.getHoge()と書かれた場合、クラスメソッドとインスタンスメソッドをあなたに見分けることができますか?

また、命名規則は特定の組織内での共通認識です。あなたとその他の人で一致してればいいんです、あなただけの考えでそれに反抗してはいけません。

投稿2016/12/03 12:36

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

recode

2016/12/03 13:30 編集

なるほどです。 変数をキャメルケースにしないと、クラスメソッドとインスタンスメソッドを見分けられませでした。 クラスメソッドとインスタンスメソッドを命名規則で分ける方法もあるといえばありますが、 命名規則に頼ってしまうと、その組織内での共通認識の部分が大きく、その認識を知らない場合には、読むときのコストが上がってしまうのですね。 ありがとうございます!
guest

0

コーディング規約に関してはあくまでも私の好みについてで、優劣を論じるものではありません
対象のプログラミング言語を決めないで議論するのでブレブレになるかもしれませんが。。。

よく公開されているコードで見る変数の命名規則がキャメルケースで書かれていることが多いです。

同感です。
プログラミング言語やライブラリーによって傾向が違うので一概には言えないですが、「変数」は確かにlower camel caseが多い気がします。

そこで、変数の命名規則について自分はパスカルケースで書くほうが自然だと思った

私は逆にlowewr camel caseで書くほうが自然と思っていました。
「変数」をパスカルケース(upper camel case)で書くコーディング規約やライブラリーって何かありましたっけ?
ぱっと思いつかないですね。

//パスカルケース UserController = new UserController(); //キャメルケース userController = new UserController();

上のコードだと、変数の中にはクラスとデータが混同しています。
やはりこの場合だと名前でクラスかどうかを判断するので、クラスと変数を見分ける要素というのは少ない気がしました。

この部分に関してはどのような意味か理解できなかったです。

自分としては、変数とクラスは同じくパスカルケースで書いたほうが、
関数と変数の見分けがすぐに付くので可読性が上がると思うのですが、なぜ変数をキャメルケースで書く場合が多いのでしょうか?

関数と変数の見分けをつけ易くするために変数をパスカルケースで書くという趣旨でしょうか?

その場合、私はその意見に反対です。
理由は関数を変数として扱える(関数が第一級オブジェクト)プログラミング言語も多いので、
変数をパスカルケースで書いても関数と変数の見分けをつけることはできないからです。

命名規則は言語仕様にも強く依存するので難しいですね。
例えばJavascriptでこんなコードを欠くとバグになります。

class X {} X = new X();

投稿2016/12/03 13:24

編集2016/12/03 13:40
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

recode

2016/12/03 14:02

パスカルケース(upper camel case)で書くコーディング規約やライブラリは自分も見たことがありません。 自分の違和感だった部分としては、getNameDataやnameDataと、namedataの記法が変わるところに名前から処理を推論しづらくなるのではという部分です。 「 //パスカルケース UserController = new UserController(); //キャメルケース userController = new UserController(); 」 ここについては、クラス名と変数名を記法によって分けても、結局内部ではクラスとデータが混同するので、分ける必要はないのではという意味です。 「理由は関数を変数として扱える(関数が第一級オブジェクト)プログラミング言語も多いので、 変数をパスカルケースで書いても関数と変数の見分けをつけることはできないからです。」 なるほどです。確かにJavaScriptなどでは、関数を変数のように扱えました。その場合関数か変数か見分けるにはそれようの名前にしなければいけなくなり、書き手の命名規則に依存してしまいよくないですね。 ありがとうございます!
Takahashi-Ei

2016/12/11 08:03

オヤジのたわ言ですが、パスカルケースだけに、PascalやDelphiはそうでした。 Visual Basicではハンガリアン記法でfrmMainとやるところを、DelphiではFormMainとしてましたね。 いずれにせよ、コンピュータ言語が文化である以上、命名規則もそれ自体立派な文化だと思います。『命名規則における文化的考察』みたいなタイトルで本一冊かけるんじゃないでしょうか?
退会済みユーザー

退会済みユーザー

2016/12/21 08:50

Takahashi-Eiさん > パスカルケースだけに、PascalやDelphiはそうでした ありがとうございます。変数もパスカルケースだったのですね初めて知りました。 > 『命名規則における文化的考察』みたいなタイトルで本一冊かけるんじゃないでしょうか? こんな本があったら是非読んでみたいですねえ。
guest

0

こんにちは。

私が使っている命名規則は異なりますが、雰囲気は理解できます。
クラス名と変数名は混同しやすいように感じます。私が使っている言語が主にC++だからかも知れませんが。
でも、関数名と変数名は混同しにくいです。文法が異なりますから。

あと、1つしかインスタンスを生成しないようなクラスも時々あります。そのような時、命名規則が異なるなら「同じ名前」を流用できてちょっと楽できます。

投稿2016/12/03 12:40

編集2016/12/03 12:44
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

recode

2016/12/03 14:28

C++だと関数と変数名は文法として違うのでわかりますね。 自分の思ったところは、オブジェクト指向は処理がブラックボックス化するので名前がかなり重要になるはずというところです。 getNameDataやnameDataではnamedataの記法が変わるのは、namedataというデータは共通のものであるのに記法が変わるのは、名前から処理を推論しづらくなるのではという部分です。 「あと、1つしかインスタンスを生成しないようなクラスも時々あります。そのような時、命名規則が異なるなら「同じ名前」を流用できてちょっと楽できます。」 なるほどです。 NameController->getName(); と nameController = new NameController(); nameController->getName(); の2つは混同せず、クラスメソッドとインスタントメソッドでは記法が異なる場合は、同じ名前でも使えるということですね。 ありがとうございます!
Chironian

2016/12/03 15:02

> getNameDataやnameDataではnamedataの記法が変わるのは、namedataというデータは共通のものであるのに記法が変わるのは、名前から処理を推論しづらくなるのではという部分です。 ああ、なるほど。同じものなのに、大文字と小文字の差とは言え、異なるのは如何なものか?ってことですね。 > クラスメソッドとインスタントメソッドでは記法が異なる場合は、同じ名前でも使えるということですね。 クラスメソッドとインスンタスメソッドについては、今のところ記法は変えていません。 C++の場合、文法が異なるので気にならないからですね。 NameController NameController = new NameController; C++では上記のようにかけますが、書くとハマります。次の行からは、変数としてNameControllerが解釈されてしまうため、クラスとしてのNameControllerを使えなくなります。(他の言語も似たようなものでは?) で、別名を考えるよりは、安易に下記のようにすると楽だろうと思います。 NameController nameController = new NameController; さて、私自身は、パスカル、ロアキャメル、スネークと、名詞始まり、動詞始まり程度では、名前を見ただけで区別したいだけのものを判別するには全く足りないです。 なので、私が命名規則を決めることができる場合には、変数や仮引数については全て小文字のプリフィクス1文字で始めるようにしています。例えば、メンバ変数はmで始めるロアキャメル(mNameControllerなど)、ローカル変数は a開始、入力仮引数は i、テンプレート・パラメータは t、マクロ・パラメータは d などなど・・・です。 ひと目でスコープや寿命、性質を見分けられると、結構楽です。 なので、上記のNameCotrollerは私の場合は下記のようにしています。 NameController aNameController = new NameController;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問