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

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

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

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

コーディング規約

コーディング規約とは、コードの書き方についての決め事のことです。 文法のことではなく、そのチームなどの中の約束事としてどのような書き方で行うかを定めるもの。 項目の例として、関数や変数の命名規則、コーディングのスタイル、括弧やインデントの書き方などが挙げられます。

Q&A

4回答

5465閲覧

thisのreturn禁止

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

コーディング規約

コーディング規約とは、コードの書き方についての決め事のことです。 文法のことではなく、そのチームなどの中の約束事としてどのような書き方で行うかを定めるもの。 項目の例として、関数や変数の命名規則、コーディングのスタイル、括弧やインデントの書き方などが挙げられます。

0グッド

2クリップ

投稿2015/12/23 07:12

使っているC#のコーディング規約を読んでいたところ以下の記述がありました。

thisのreturn
クライアントの便宜を考えたつもりでも、thisをreturnすることはなるべく避ける。
理由:A.Meth1().Meth2().Meth3()というような連鎖は、一般的にSynchronization上の問題の元になる。

こちらの記述の意味が理解できませんでした。
標準でもメソッドチェーンでthisを返すことはよくあるかと思っています。

どういう意味かを教えていただきたいのと、
合わせて利用する場合にはどういった危険性があり、何を考慮しなくてはいけないのかを教えていただきたいです。

※どうやら以下のコーディング規約をもとに作成されたもののようだったのです。(16ページ)
C#コーディング規約

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

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

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

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

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

guest

回答4

0

>初版2002年9月25日
というのと、
>このドキュメントはJava コーディング標準(オブジェクト倶楽部バージョン)、VB.NETコーディング標準をC#用に変更したもので、
この点でもはや使う価値が無いものかと思います
改定もされてないようだし、2002年9月って段階でC#1の世代の物だし

もちろんそれなりに使える部分はあると思いますが、C#の変化を考えるとそれなりに改編しないとダメかと思います

>(75) 100%正しいことはない
>ここに書かれていることに、100% 準拠する必要はない。迷ったら考えを整理し、相談すること。十分な理由があってルールから外れることはよくある。コミュニケーションができるチームの助けとなることが、このコーディング標準の目的である。
とあるので上司に確認したほうが良いかと思います

投稿2015/12/23 18:21

len_souko

総合スコア1337

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

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

len_souko

2015/12/23 19:10

http://bleis-tift.hatenablog.com/entry/20090804/1249389793 ここなんかで使いたくないってのとその理由が書いてありますね また、 >public クラスはそのクラス名の 1 ファイルにする。 とあるのでpartial禁止ですね、不便です 他にも色々とおかしい点があり改変とチェックの手間を考えるとこれを基にするのは結構無駄が多い気がします
guest

0

こんにちは。

一般的なSynchronization上の問題は、基本はデータ競合ですね。それを防ぐための仕組みがデッドロックを生むことが有ります。
メソッドチェーンを使わないことでデッドロックし難くなるとはとても思えないので、メソッドチェーンを使わないことでデータ競合し難くなるとこの規約の作者は考えているのだと思います。しかし、そのシナリオが見えません。

そもそもイミュータブルなクラスならthisを返却してメソッドチェーンしてもデータ競合しません。
インスタンス変数を変更しないメソッドの場合も同様です。
インスタンス変数を変更するメソッドはデータ競合が発生しえますが、thisを返却しなければ、A.Meth1().Meth2().Meth3();と呼びたい人がどうするかと言うと、

C#

1A.Meth1(); 2A.Meth2(); 3A.Meth3();

とするだけですね。これでデータ競合を多少なりとも回避できるとは思えません。

理由もきちんと説明されていないし、この作者さんの何か勘違いではないでしょうか?

投稿2015/12/23 15:14

Chironian

総合スコア23272

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

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

0

return this;と書くということは、
大抵の場合、そのクラスはミュータブルということで、
となるとマルチスレッド化する際に困ります。

C#

1num.Add(1).Add(2);//排他制御が必要

イミュータブルにして、return newにすればその心配がなくなります。

ということではないでしょうか。

ということで、「return thisするな」というよりも、
「イミュータブルに作れ」という話のような気がします。

投稿2015/12/23 13:56

編集2015/12/23 23:26
ozwk

総合スコア13512

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

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

0

こちらの記述の意味が理解できませんでした。

リンク先のPDFドキュメントも読んでみましたが、私も理解できませんでした
複数回のメソッド呼び出しは、スレッドチェーンであろうとなかろうと別スレッドから割り込まれる可能性はあるわけで、そういう場合はどちらにしても然るべき排他制御が必要なので、thisのreturnとは何の関係もないような気がします。

他にも理解できないことが(明らかにそれは違うだろうということも)書かれていたりするので、何かおかしいと思ってはいたのですが、len_soukoさんの貼ってくれたURLを見て納得しました。

※どうやら以下のコーディング規約をもとに作成されたもののようだったのです。

つまり、他の誰かに聞いたけど答えられる人がいなかったということですね。
コーディング規約を作る際にメジャーなところが作っているものを参考にすることはままありますが、そのまま鵜呑みにせずに、ちゃんと理解して納得した上で使いましょうと言いたくなります。というか、言ってあげてください。
コーディング規約にもメンテナンスは必要です。

投稿2015/12/23 23:14

catsforepaw

総合スコア5938

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問