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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

10回答

9306閲覧

メソッド名をどのように名付けていますか。

King_of_Flies

総合スコア382

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2017/04/12 00:51

編集2017/04/12 00:53

###質問
分かりやすい変数名をつけるにはどういうつけ方がベストか?

###現状
例えば下記HogeMethodがあるとして、命名はどうしますか。

---規約---
メソッド名はキャメル式(先頭大文字)

///(summary)
///引数 主キー
///hogeModelに利用者名、利用者情報を設定
///
public void HogeMethod (int hoge){
//hogeを検索条件にした検索処理
....
//上記検索処理で取得したレコードからhogeModelにセット
hogeModel.userName = レコード.userName
hogeModel.userInfo = レコード.userInfo
}

ちなみに私はHogeMethodをGetUserDataByKeyとしましたが、
少し長いような気もしますし、summaryコメントで書いているなら、
長くしなくてもいいんじゃないかとも思ったりします。

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

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

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

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

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

guest

回答10

0

こんにちは。

メソッドのシグネチャが固定されていないなら、自分だったら以下のように変更すると思います。参考までに。

  • メソッドを前半「hogeを検索条件にした検索処理」と後半「レコードからhogeModelにセット」の2つに分け、前者を「UserData GetUserByKey(int key)」、後者を「void UpdateHogeModel(UserData user)」のようにする

まず、戻り値がvoidのメソッドにGetから始まる名前をつけるのはありえないです。メソッドのユーザが何もGetできないわけですから。
基本的に、そのメソッドが何者であるかはそのメソッドのシグネチャから読み取れるようになっていなければなりません。コメントはあくまで補足であり、振る舞いや使い方の説明を含むドキュメントですが、その内「何をするのか」はメソッドシグネチャで表現できる範囲になるはずです。
メソッドの内容がうまくメソッド名に落とし込めない時は、メソッドの内容が分割可能な2つ以上の処理を含んでいる可能性が高いです。仮に、それらを合成して一つのタスクとしたものであると仮定して、良い名前が思いつかないのであれば、それは適切な合成単位ではないという事を示しているとも言えます。

(質問の内容でちょっと気になりましたが、先頭大文字の名前付け規約はパスカル形式ですよ)

投稿2017/04/12 01:21

tamoto

総合スコア4103

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

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

King_of_Flies

2017/04/12 08:58

パスカル式 初めて聞いた名前でした。ありがとうございます。 覚えておきます。
guest

0

利用者情報を戻り値として返しているのであれば skittle さんと同じく

GetUserInfo

にしますが、戻り値なしでメソッド内で設定しているだけなので

SetUserInfo

と私なら付けそうです。

投稿2017/04/12 01:09

workaholist

総合スコア559

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

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

0

少し回答とそれますが、製造系では、ほとんどがローマ字のメソッドになり

SetBuhinTranTableFromBOM()
GetGyomuMasterTableFindByPrimaryKey()
GetPikkinguListFromJittiTanaoroshiTranTableFindByGyomuDay()

とか普通です。
メソッド名の長さに関しては全然余裕かと。

投稿2017/04/12 05:08

編集2017/04/12 05:09
lazhuward

総合スコア1294

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

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

King_of_Flies

2017/04/12 09:10

あんまり長いメソッドって、 冗長的なコードを書いてる気分で引け目を持ってしまうんですが、私だけですかね?
King_of_Flies

2017/04/12 09:31

こちらも話はそれますが、たしか、Java(eclipse)はメソッド名に日本語を入力できた気がするんですが、気持ち悪くて使ったことないです。
lazhuward

2017/04/12 10:09

基本的にはどのプロジェクトにもコーディング規約があるのでそれに準拠で良いと思います。 変数は何文字でおさめるとか書かれていますし。 もしコーディング規約が無いなら自分用でもいいので作っておくほうが良いでしょうね。 コーディング規約で検索すれば出てくると思うので、適当なものに倣えば良いです。 知ってるか知ってないかで大分違うので、「コーディングに際して規約はありますか?」と聞けるだけで、一つ上の開発者になれますよ。 C#でもJavaでもマルチバイト使えるので、クラスやメソッド名、変数名に日本語も中国語もハングル文字もつかえますね。 かつて1回だけそういうプロジェクトに遭遇したことがあります。 その時は、それが障害の原因になってたので、全リファクタリングさせてもらいましたが。。。
King_of_Flies

2017/04/12 10:33

どの段階でバグの温床と気づいたのかはわかりかねますが、相当数のメソッドが有ったとすると、リファクタリング地獄ですね笑 お疲れ様です
guest

0

GetUserDataByKeyでも問題ない気はします。
全然長いとは思わないレベルです。
無理に短くしようとしたり、略語を使ったりするよりは、
ある程度長くてもそのメソッドが何をするのかが分かる命名になっているべきです。

ByXXXというネーミングにすることによって
GetUserDataByCode(string code) や
GetUserDataByName(string name) などのメソッドの用意もしやすくなりますし。

GetUserDataのオーバーロードだけではこと足りなくなってから、あとでリファクタリングするよりは
最初からByKeyとつけておくのも有りだと思いますよ。

ただ、workaholistさんも言ってますが、戻り値がvoidのメソッドにGetとつけるべきではないでしょうね。

あとこれは別件ですが、hogeModel.userName や レコード.userName はプロパティではないですか?
C#のプロパティはパスカルケースで書くので、hogeModel.UserName にした方がいいでしょうね。

投稿2017/04/12 01:25

root_jp

総合スコア4666

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

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

King_of_Flies

2017/04/12 08:58

確かにこのメソッドでは返り値がないメソッドなのでGetよりSetのほうがいいですね。 参考になります。
guest

0

ベストアンサー

僕のルールは単純にGet/GetAsyncですね。

C#

1public interface IRepository<T> 2{ 3 Task<IEnumerable<T>> FindAsync(IFilter<T> filter); 4 5 Task<T> GetAsync(int id); 6 Task AddAsync(T hoge); 7 Task RemoveAsync(T hoge); 8}

※上記リポジトリインターフェースそのものは適当です
データベースのCRUD処理はIDを元に行われるということをルール化して「ById」は省略しています。
それ以外はByを付けます。

  • 必ず取得できなければならないものについてはGetを使います。
  • 見つからない場合にnullのモデルを返すルールであれば最大1レコードの取得にもGetを使います。

例)GetByUserNameAsync(string username);

  • 条件に合わせて複数の結果を返すものについてはFindを使います。
  • 見つからない場合Exceptionを返すルールで、見つからないことが想定される場合はFindを使います。

例) FindByUserNameAsync(string username);
※Asyncメソッドでoutパラメータが使えないのでTryGetとせず、Find側に寄せてます

リポジトリクラス側の特定方法からモデルは類推できるようにします。
このため、メソッド名にモデル名が付くことはほとんどありません。


今個人的に作ってるものは他のフレームワークに則って最終的に以下みたいな見た目にできたらカッコいいな…と思って色々見ながらやってます。うまく行ってるわけじゃないんですけどね。。。
※これよりちょっと回りくどいコードを仕事では書いてます、命名規則は似たようなものです

public class UserDb: UnitOfWorkBase { IRepository<User> Users { get; } IRepository<Role> Roles { get; } // method from UnitOfWorkBase void Commit(); } public class UserService : IUserService { /* .... */ public Task async AddRoleAsync(int userId, int roleId) { using (var db = UoWFactory.Create<UserDb>()) { var user = await db.Users.GetAsync(userId).ConfigureAwait(false); var role = await db.Roles.GetAsync(roleId).ConfigureAwait(false); user.Roles.Add(role); db.Commit(); } } }

投稿2017/04/12 04:22

編集2017/04/12 04:24
haru666

総合スコア1591

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

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

0

こんにちは。

使う側から見ると、そのクラスへint型のhoge値を設定しているように見えます。
hogeModelを設定しているかどうかは内部的な実装とも捉えることができます。
この場合は、SetHogeですね。

しかし、そうではなくhogeModelへ値を設定していることを使う人も把握して使うようなメソッドでしたら、SetupHogeModelやPrepareHogeModelとするかも知れません。少し重い処理だよって表現したくなるので。

投稿2017/04/12 04:13

Chironian

総合スコア23272

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

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

King_of_Flies

2017/04/12 09:32

Setupだと処理が重くなりますよっていう暗黙の意味があるのですか?
ozwk

2017/04/12 09:40

どっちかというと、Get/Setのほうに軽い処理という認識があると思います。
King_of_Flies

2017/04/12 10:35

なるほど、 SetもSetupも意図して使い分けたことがありませんでした。参考になります
King_of_Flies

2017/04/12 10:36

Getで手間のかかる処理ならGetupになるんですかね???
Chironian

2017/04/12 11:20

get upはそもそも意味が違うと思います。http://ejje.weblio.jp/content/get+up getに対応するようなより重い作業の単語や熟語を知らないので、私なら、その「重い処理」を名前の中心に据えるだろうと思います。 変数名や関数名は、自然言語で名前を付けますから、自然言語的に意味が通るように付けるのが好ましいと思います。
guest

0

質問者さんが組織に属していて組織で開発を行っているなら、組織で命名規則を決めて、質問者さんは組織が決めた命名規則に従うというのが普通だと思います。

質問者さんが個人で開発していて、将来的に保守などにも他人が関わることがなければ、質問者さん個人の好みで命名すればよいという話になるかと思います。

なので、基本的には他人に聞く話ではないと思うのですが、迷っているので他人の意見を聞きたいということであれば、今回の質問の例に限って私の好みを言うと、設定目的がメインなら「Set 何とか」、初期化目的がメインなら「Initialize 何とか」にすると思います。

投稿2017/04/12 01:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

例えば int hoge 以外に、string name での検索をするなどのパターンが考えられる場合(hogeModel にセットするためのメソッドが複数存在しうる場合)は、GetUserInfoByHoge とか GetUserInfoByName とか分けますかね。
C# ではメソッドのシグネチャが異なれば大丈夫なので、GetUserInfo(int hoge) と GetUserInfo(string name) の二つを定義することもできますが。
※ただ、GetUserInfo(int id) と GetUserInfo(int age) とかはダメなので、結局名前を変えるかも知れません

投稿2017/04/12 01:19

tacsheaven

総合スコア13703

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

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

King_of_Flies

2017/04/12 09:22

C#だからと言って同じメソッド名を引数の型の違いで処理分けするのは非推奨なんですかね?一般的に。
tacsheaven

2017/04/12 09:32

いえ、非推奨ではありません。 ただ、パラメータ「名」では分けることができないので、同一型のパラメータで違う処理をさせる場合には名前を変えるしかなく、そうなったら全て名前を変えるという形にして統一を取る、という話です。
guest

0

プロジェクト内での背景や取り決めなどにもよりますが、私なら上記のメソッドにはFetchUserと書きます。
byIdとしてしまうと、下記の様な書き方(オーバーロード)が出来なくなってしまうので…(VB.NETで書いていますが、基本は同じはず。)

''' <summary> ''' ユーザー情報を使う何らかの処理 ''' </summary> Private Sub hoge() 'ユーザーテーブルをFetchする機能は一緒だから、同じメソッド名で統一 Dim name1 As String = FetchUser(1) 'IDからユーザー情報を取得(name1にはhogeが入る) Dim name2 As String = FetchUser("hoge", "manager") '名称と役職からユーザー情報を取得(name2にはfugaが入る) End Sub ''' <summary> ''' ユーザー情報をIDより取得する。 ''' </summary> ''' <param name="id">ユーザーID</param> Private Function FetchUser(id As Integer) As String 'IDからユーザーを取得する FetchUser = "hoge" End Function ''' <summary> ''' ユーザー名と役職からユーザー情報を取得する ''' </summary> ''' <param name="name">ユーザー名</param> ''' <param name="position">役職</param> Private Function FetchUser(name As String, position As String) As String 'ユーザー名と役職から情報を取得 FetchUser = "fuga" End Function

投稿2017/04/12 01:16

編集2017/04/12 01:17
motuo

総合スコア3027

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

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

0

長短のバランスを考えて私なら利用者情報ということで以下です。
GetUserInfo()

投稿2017/04/12 01:01

skittle

総合スコア21

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

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

King_of_Flies

2017/04/12 09:27

今の開発プロジェクトでそんな感じのメソッドが結構あるんですが、分かりにくいですよね。個人的には。 例えば今回の場合たまたまhogeModelにはUserInfoっていうプロパティがありますが、GetUseInfoにすると、その値だけ取ってくるように思えますよね?まぁsummaryでコメントしてるから分かれよって話になるのかも知れませんが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問