パスワードを忘れた? アカウント作成
15285583 story
プログラミング

MicrosoftのC#コーディング規約に「privateフィールドにはプレフィックス」と追記されて混乱を呼ぶ 129

ストーリー by headless
混乱 部門より
あるAnonymous Coward 曰く、

C#のコーディング規約として一番権威あるのは本家Microsoftのものだと思われるが、そのページに、いつの間にか「private/internalフィールドには _ プレフィックス」「private/internalなstaticフィールドには s_ プレフィックス」「ThreadStaticの場合は t_ プレフィックス」を付ける必要がある(should)という項目が追加され、C#er達が大混乱に陥っている(C#のコーディング規則発端となったツイート)。

C#においては、後発のUnityがプレフィックスを付ける文化を持っている一方、本家のC#においては、プレフィックスを付けずに this. で参照する文化があり、StyleCop.Analyzersなどのスタイルチェックもこれをデフォルトとしている。また、2010年頃のプログラミング書籍では「メンバー変数にプレフィックスを付けるのはIDEが未発達の頃の名残で、IDEが発達した現代では不要」としてプレフィックスを付けないことが推奨されていたと記憶している。

今回の記述はそうしたこれまでの流れと真っ向から対立するもので、Twitter上ではアンダースコア派が歓喜する一方、this派からは大ブーイングが起こっているようだ。ただし、この規約が書かれたのは6年前でそれが今になって反映されただけといったコメントもあるなど、なんでこうなったかはよく分からない。

元となったコーディング規約はオープンソースの.NETランタイム貢献者向けに書かれたものであり、C#開発者一般に向けたものではない。日本語版にはまだ反映されていないが、英語版には「.NET Runtime, C# Coding Style」から取り入れられたものであることが明記され、使いたければ使えばいいという感じになっている。「s_」「t_」の使用はハンガリアン記法を使用しないよう求める.NETの一般的な名前付け規則に反するが、この点は解決されていない。

なお、元のコーディング規約では「this.」について、「どうしても必要な場合を除いて避ける」と記載されている。

  • 言語としての規定じゃない以上、privateじゃないフィールドに「_」を付けても
    コンパイラ等でエラーになるわけじゃないんでしょ。
    そんな人間の努力目標でしかない仕様はヒューマンエラーの原因になりそうに思える。

    --
    --------------------
    /* SHADOWFIRE */
    ここに返信
  • IDEやコードエディタ、その他各種開発ツールで、単純なコーディング規約は実装して、
    強制適用すればいいのに

    なんで単純なコーディング規約を人が注意しないといけないんだ?

    ここに返信
    • 今のVisualStudioでは、たとえば「パブリックなプロパティやメソッドは大文字で始めろ」みたいにコーディングスタイルに関することまでメッセージを出すようになってるよ。
      初期設定ではWarningより控えめなMessage扱いで、エラー扱いにして強制する設定もできる。
      だからまあ、このプライベートフィールドのプリフィクスについても今後VisualStudioの標準アナライザでメッセージを出すようになるかどうかでMicrosoftのスタンスを判断することもできそう。

      --
      うじゃうじゃ
    • by Anonymous Coward

      戦争になるからだよ。
      言語として1通りの書き方した出来ないものもあるだろうけど、方言を認めないと普及しない。
      c#としてはcやjavaあがりも取り込む必要があったからなおさら。
      必要ならばIDEでコード規約の強制もできるわけだしな。

      しかしc#は当初からcaml/Pascal形式の命名規則があったし、実際警告対象(CA1707,CA1709)なのだが、それにも反してるよな。
      確かによくわからん

    • by Anonymous Coward

      うるせー。ハンガリアン記法復活させるぞ!

      • by Anonymous Coward

        うるせー。ハンガリアン記法復活させるぞ!

        Windows使ってる限りlpStringとか見かけるし……

        • by Anonymous Coward

          流石にもう無い。
          COBOLと同じ絶滅危惧種。

    • by Anonymous Coward

      過去資産読み込んだらいちいち言ってこられるのもちょっと

      • by Anonymous Coward

        なーに、警告を完璧にゼロにしてコンパイルするやつなんか初心者向け教科書以外で存在しない

        • by Anonymous Coward

          ログに埋もれたあげくに面倒なバグに遭遇して解決後にワーニング出てたじゃんってなるやつ

        • by Anonymous Coward

          なーに、警告を完璧にゼロにしてコンパイルするやつなんか初心者向け教科書以外で存在しない

          何が存在しないって?
          警告出力の設定も決められていて、警告を全て消すことを求める企業も存在しますよ

          • by Anonymous Coward on 2021年05月17日 1時19分 (#4032400)

            そこそこ名の通ったドイツのERPソフト会社に居たけど、コーディング規則に引っかかった(コードチェッカーから検出された)ソースコードをコミットする時は、Business Justificationを添えてQAに許可をもらう必要があったし、普通は警告なんか残さなかったね。

            全部消せと言われる企業、そんなにレアではないと思う。

  • 2005 年あたりから ReSharper という Visual Studio というアドインを利用しています。ReSharper のデフォルト設定は _ 付きだったので、それが普通なんだと思って、そのときから _ 付きに変えてます。

    > 本家のC#においては、プレフィックスを付けずに this. で参照する文化があり

    ASP.NET Core のフレームワークのソースコードも _ 付きなので、_ 付けないほうが少数派だと思っていました。

    個人的には統一されていて、コードチェッカーでちゃんと検査してくれるならどっちでもいいんじゃないかと思いますが。

    自分の観測範囲だと、Microsoft の名前付け規約無視している人たち (そもそも知らない) が多いので、混乱なんか起きないんじゃないかなあと思います。

    ここに返信
    • by Anonymous Coward on 2021年05月16日 19時50分 (#4032269)

      thisで参照する文化というよりもVisualStudioのエディタでthis.と入力するとインテリセンスでフィールド/プロパティ/メソッド/イベント各種が候補に出るので判り易いからだと思うけど。だからthis.と手癖で入力する。

      あと、変数とフィールドを同じ名前にしてしまってバグる可能性が減らせる。

      • by Anonymous Coward

        あった方が読みやすくて好きだったけどな
        VBのMeとどちらかに揃えてくれとは思ったけど

    • by Anonymous Coward

      Visual Studio標準設定でもthis付けると薄文字で表示されて「省略できるよ」って表示されるからthisは使わなくなった。

    • by Anonymous Coward

      https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/gen... [microsoft.com]

      このセクションでは、単語の選択に関連する一般的な名前付け規則、略語と頭字語の使用に関するガイドライン、言語固有の名前の使用を回避するための推奨事項について説明します。
      (略)
      アンダースコア、ハイフン、英数字でないその他の文字はいずれも使用しないでください。

      いや、Microsoft の名前付け規約無視している (そもそも知らない)のお前。

      • by Anonymous Coward on 2021年05月16日 19時48分 (#4032268)

        そもそも今までのMSのガイドラインはpublic/protectedなモジュールの外に公開するものに対してのみ規定されてたの
        private/internalなモジュール内で完結するものについては特に言及がなかったし実際.NET Frameworkの標準ライブラリ内でも単独の規約を守って作られていたわけではない
        .NET Coreでオープンソース化するにあたって.NET Coreの標準ライブラリにおいてモジュール外非公開のものについても規約を決める必要があって定義されたのがこれ
        それが今回.NETにおける開発全般の標準規約として示されたという状況

      • by Anonymous Coward

        外部に公開するプロパティとかはそうだね。

    • by Anonymous Coward

      _はプロパティのバッキングフィールド用として使われてた。

    • by Anonymous Coward

      個人的には統一されていて、コードチェッカーでちゃんと検査してくれるならどっちでもいいんじゃないかと思いますが。

      これが全てだよな。

    • by Anonymous Coward

      同じく、ReSharperが付けろっていうので _ 付ける派。最近はもっぱらRider使ってるけど。
      このあたりはMSとJetBraindで解釈違いがあるんだなぁとは思ってたけど、そもそもMSの中の人も好みがあるっぽいので、
      じゃあもうJetBrainsの人が考えたデフォでいいやって思ってそっちに寄せてる。

      凡人の好みなんぞよりJetBrainsの天才の方々たちが考えたデフォ設定の方が尊いに決まってるしネ。

  • なので、インテリセンスでわかるようなことをわざわざ名前に付けるってのはあまりに前時代的。
    ハンガリアン記法が時代を超越して最初から無意味であったとは思わないが、
    いくつかのメリットと言われるものも今や価値がない。

    ここに返信
  • by Anonymous Coward on 2021年05月17日 12時49分 (#4032591)

    個人的に privateについて言及する前に、C#の字下げスタイルを Java や JavaScript や Rust や Go のように
    開け括弧を同じ行に書いてから改行する形に変えて欲しい。
    elseの前の 閉じ括弧を同じ行か前の行かはどっちでもいい。

    オブジェクト初期化子とか ラムダ式だと横に書いてたりして破綻してるようにしか見えないんだよねぇ。

    コード書いてるときは見づらい程度で済むけれど、
    チャットで説明とかする場合に無駄に1行ずつ取られるのが結構しんどい。

    オールマンスタイルが好きな人もいるんだろうけど、内容が連続していないように見えるんだよなぁ。

    ここに返信
  • by Anonymous Coward on 2021年05月16日 18時31分 (#4032226)

    既にやってるので高みの見物

    ここに返信
    • by Anonymous Coward

      うるせーバカ、規約使って欲しかったら、
      勝手につくようにしろor warning 出せ
      って思う。

      • by Anonymous Coward

        ReSharper使ってればwarning出るが?

  • by Anonymous Coward on 2021年05月16日 19時58分 (#4032273)

    C#か

    ここに返信
  • by Anonymous Coward on 2021年05月16日 21時28分 (#4032312)

    プライベートフィールドは m、引数は a とか色々。
    でもこれってかなり昔の話かな。
    今のスタイルガイドどうなってたかな・・しばらく追ってないや。

    あとDelphiはフィールドに f をつけてたっけ。

    Symbianはこれまた面白くて、「2フェーズコンストラクタ」が必要なクラスは C、
    そうではないが後始末に CloseL() メソッドなどが必要なものは R、
    それ以外の単純なデータ型構造体は T をつけてたなあ。
    きちんと厳密にしとかないと、何しろ相手はリソースの限られた端末だったもんね。

    ここに返信
  • by Anonymous Coward on 2021年05月16日 23時20分 (#4032362)

    プレフィックスが好きなのか。

    ここに返信
    • by Anonymous Coward

      マイクロソフト社員によって提言された記法(アプリケーションハンガリアン記法と呼ばれる)を
      マイクロソフトが誤用(システム・ハンガリアン記法)で広め、各種APIで使用したから・・・

      • by Anonymous Coward

        やってみたら「悪くない」と思う人たちが続出したから残ったんですよね。
        こういう人がいなかったら残るはずがないわけで。

    • by Anonymous Coward

      Windows開発者ではないが、いかなるプリフィクスをも敵視する風潮は如何なものかと思う。
      コード規約に採用すべきかは慎重に取り扱うべき事案だが、現実にはそれを採用し成功しているシステムも多数存在している。

      # なお個人的にはまず採用しない模様

typodupeerror

にわかな奴ほど語りたがる -- あるハッカー

読み込み中...