新人プログラマーです。

あるオブジェクトを生成するサービスの名前を、

> Hoge_Service.web.Services.CreateObjectService

と名付けたら、先輩に名前空間もクラス名もダメだと言われました。  
いったい何がおかしいのでしょうか。

`質問時のメールアドレスを間違えて登録してしまいました。`
CC BY-SA 4.0
2018-10-03T13:11:51.747
48934
2018-10-04T04:49:22.127
2018-10-04T04:49:22.127
30353
30349
question
c#
C#のいい名前空間とクラス名とは？CreateObjectServiceはなんでだめなの？
.NET Frameworkには[名前付けのガイドライン](https://docs.microsoft.com/en-
us/dotnet/standard/design-guidelines/naming-guidelines)があります。この中に

> Do not use underscores to differentiate words, or for that matter, anywhere
> in identifiers.

とあり`Hoge_Service`について`_`で区切るべきではありません。

> The PascalCasing convention, used for all identifiers except parameter
> names, capitalizes the first character of each word

とあり`web`についてパラメーター以外は大文字から始めるべきです。

* * *

[名前空間の名前](https://docs.microsoft.com/en-us/dotnet/standard/design-
guidelines/names-of-namespaces)には

>
```

>     <Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]
>  
```

とあります。`Hoge_Service.web.Services`がこの名前付けルールに従っているとは言いがたいです。

* * *

[クラス名の名前](https://docs.microsoft.com/en-us/dotnet/standard/design-
guidelines/names-of-classes-structs-and-interfaces)には

> name classes and structs with nouns or noun phrases, using PascalCasing.

とあります。`CreateObjectService`では名詞や名詞句ではありません。`CreateObjectService`はむしろメソッド名に適切です。
CC BY-SA 4.0
2018-10-03T13:53:04.703
48936
2018-10-03T13:53:04.703
4236
48934
answer
基本的なことは sayuri さんが書かれているんですが、クラス名についてはもう１個。

「あるオブジェクトを生成するサービス」と言うことですが、それに`Object`なんて名前を使っちゃったら、「別のオブジェクトを生成するサービス」に付ける名前はどうするんでしょうか?

`Object`なんて単語は(`String`や`Boolean`等々ではなく)`object`型(`System.Object`)に関わるものであることを明示したいときに(他に意味のある名前がどうしても見つからない時にだけ)使用するべき([Avoiding
Language-Specific Names](https://docs.microsoft.com/en-
us/dotnet/standard/design-guidelines/general-naming-conventions#avoiding-
language-specific-names)より)です。

`Object`なんてなんでもありの単語は使わずに、「あるオブジェクト」の性質なり機能なりを表す単語を使うべきでしょう。

* * *

名前空間については、C# のプロジェクトに Java のパッケージ名用の命名規則をそのまま使っている会社もあったりしたんで、会社の決めたルールは
Microsoft のルールに優先すると思わないといけないんですが…。

名前空間やクラス名ではないですが、こんなルールはあまり守られていません。

[General Naming Conventions](https://docs.microsoft.com/en-
us/dotnet/standard/design-guidelines/general-naming-conventions#word-choice)より

> **X DO NOT** use Hungarian notation.
>
> **X** ハンガリアン記法は使っちゃ **ダメ** 。
CC BY-SA 4.0
2018-10-03T14:57:29.303
48938
2018-10-03T14:57:29.303
13972
48934
answer
naoki fujita さんのおっしゃるとおりです。答えは先輩が知っています。ただ、人間関係が悪くなってしまい聞きづらい状況です。

言語的感性を磨きたいとうことではありません。  
あのときの先輩の口ぶりからは名前空間やクラス名の付け方に一般的な規則があるような感じでしたので、ここで質問させていただきました。それはsayuriさんやOOPerさんにいただいた回答なのだと思います。

お二人からいただいた回答に従えば次のようになるのかと思います。

> Hoge.Service.Web.Services.SomethingCreationService

このように改めて書いてみると、名前空間にService、Servicesと同じ意味の単語があり、いい名前空間ではないと思います。これはnaoki
fujitaさんがおっしゃる言語感性によるものかと思います。名前空間をどのように構築するかを熟慮できていないのだと思います。その名前空間の良し悪しは先輩に聞いてみたいと思います。

sayuriさん、OOPerさん、naoki fujitaさん、本当にありがとうございました。

`質問時に登録したメールアドレスを間違えてしまったようです。`
CC BY-SA 4.0
2018-10-03T15:25:37.363
48939
2018-10-03T21:19:19.430
2018-10-03T21:19:19.430
30353
30353
48934
answer