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

長い関数名、変数名、どこまで許せる? 226

ストーリー by headless
動詞は1つだけにしてください 部門より
insiderman 曰く、

最近久しぶりにWindows関連の案件に関わったのだが、ここ数年UNIX/Linuxばかりを触っていたので結構な違和感があった。特に気になったのが、関数名や変数名などの識別子が長くなる傾向がある点だ。たとえば「GetApplicationConfigurationString」とか、「SaveAllChangeSetToDatabase」とか、確かに分かりやすいのだがタイピングするのに指が絡まるわ!と思う識別子名が多々あった。

そもそもWindows APIには長い関数名、変数名が多く、IDEの補完機能によって長い識別子も入力しやすくなっている、という背景もあるのだろう。しかし、長い識別子名が多いと1行は78文字以内というポリシーを守るのがかなりきつい。長い識別子を許した方が分かりやすいかもしれないが、それでコードが見づらくなるのは個人的にはちょっと避けたいところである。

/.J読者でプログラミングに関わっている人は多いかと思うが、実際設計段階で識別子の長さについて意識している人はどのくらいいるのだろうか。そして、どのくらいの長さまでは許せるだろうか。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by tagosaku0726 (35119) on 2012年04月07日 18時34分 (#2131157)

    30文字ぐらいは全然きになりませんな
    変に省略されて意味わからないよりは全然マシ

    1行78文字ポリシーを辞めたほうがいいんじゃないですかね
    今時固定幅画面でもないでしょうし

    • by Yoh2 (6924) <yoh2@d2.dion.ne.jp> on 2012年04月07日 19時29分 (#2131210) 日記

      名前を省略させないことを優先させて1行78文字ポリシーを捨てたクチです。

      しばらくは両立させようとしていましたが、「変数名1->メンバ名 = 変数名2->メソッド(引数1, 引数2);」としただけで78文字を超えたのを見て、78文字ルールは守り切れないと悟りました。
      同一関数内でstという省略がstaticとstatisticとstatusの3種類を表している(*)のを見て頭を抱えた経験もあり、ローカル変数なども極力省略は控えるようにしたり、それを布教したりしています。
      (*)それぞれ別人が異なる時期にメンテした結果そうなったらしい。

      ただ、際限なく長くしても見辛いので、78文字に代わる新たな目安をどうするかに悩んでいます。
      今は気分次第で適当に。

      --
      巧妙に潜伏したバグは心霊現象と区別が付かない。
      親コメント
      • by yug (32253) on 2012年04月07日 21時30分 (#2131260)

        自分は最近は 120文字の118文字折り返し(縦は45行)でやっています。
        1024x768 なモニタで Teraterm 利用時に 11pt 表示でも 1画面内に収まるというのが理由です。

        ノートでのソースの編集は最小限しかしないけど、俯瞰時に折り返しが発生して欲しくないので、
        デスクトップよりはノートの現状の制限に合わせています。

        親コメント
      • 同一関数内でstという省略がstaticとstatisticとstatusの3種類を表している(*)のを見て頭を抱えた経験もあり、ローカル変数なども極力省略は控えるようにしたり、それを布教したりしています。
        (*)それぞれ別人が異なる時期にメンテした結果そうなったらしい。

        それって、後から変更した人が、 st がコード内で既に別の意味で使われていることに気付いていなかったってことだよね。

        その状況を改善するのに、略語を避けるのは多少有効かもしれないけれど、本質的な解決方法は「保守するコードは書き換える前にちゃんと読む」って以外ないんじゃなかろうか。略語を避けても「こっちの行で status と呼んでいるものとこっちの行で status と呼んでいるものは全然意味が違う」というような同種の現象は起こりうるわけで。

        べつに static 等の英単語を st と略すのが良いとは思わないけど、なんか略語が悪の根源みたいに言われると、それは違うんじゃね、と思った。

        親コメント
    • by Anonymous Coward on 2012年04月07日 20時44分 (#2131244)

      EclipseやVisual Studioなんかだと、キャメルケースで補完できますからね。
      GetApplicationConfigurationString→SACS
      SaveAllChangeSetToDatabase→SACSTD
      見たいな感じで。
      意外と知らない人もいるみたいですが、タイピングのリズムもいいし、好きな機能です。

      親コメント
    • by Anonymous Coward on 2012年04月07日 19時12分 (#2131191)
      一行が長くても平気で、その代わり行数が増えるのを極端に嫌うのって、ウェブだと横スクロールが嫌悪されることを考えると不思議ですね。
      親コメント
    • by Anonymous Coward on 2012年04月07日 18時57分 (#2131174)

      きわめて同感。
      APIが出てくるところはそもそも多いとは言えないし、関数名短くするためにどのように省略するかとか規則を決めたりとかのほうがイライラするんじゃないかと思う。
      いまどき80カラムである必然性は少ない様に思う。C++とかだとAPI関係なく80なんてきつすぎだと思う。

      結局のところ自分が慣れたやり方が一番で、違うものと接すると自己防衛が働いて排斥したくなるってことじゃないのかな。

      親コメント
  • 無理せず日本語使えよ (スコア:2, すばらしい洞察)

    by Anonymous Coward on 2012年04月07日 19時08分 (#2131183)

    VisualStudioなら、関数名なんてIntelliSenseで選択するだけなんだから素直に日本語で書いたらいいんじゃないの。
    ローカル変数まで日本語使われるとウザいけど、大半は[.]押してから選択するだけだし。
    特にテストコードやENUMなんて遠慮せず日本語で書いていけば良いと思う。

    > しかし、長い識別子名が多いと1行は78文字以内というポリシーを守るのがかなりきつい。
    だいたいこれもおかしいだろ。昨今フルHDの液晶が手頃かつ入手性も最強な上、
    VisualStudioもマルチモニタ最適化が進んでいるというのに、ゴミPC制約に合わせる必要なんぞどこにあるんだ。

    • 日本語を使うと、FEPとエディタのショートカットが微妙に絡まって、困るんですよね。

      親コメント
  • by Anonymous Coward on 2012年04月07日 19時08分 (#2131186)

     リスト3-7では、サンプルとして取り上げた関数の名前をtestableHtmlからSetupTeardownIncluder.renderに変更しています。この名前は、関数が何を行うかをよく表現しており、ずっとよい名前です。privateメソッドに対しても、isTestable、includeSetupAndTeardownPagesといった、同じくらい内容をよく表す名前を与えています。適切な名前付けの価値はいくら評価したとしても、過大評価となることはありません。ワードの原則を思い起こしてください「そこに書かれているルーチンを読んだとき、それがあなたの予想を上回るものであったとしたら、あなたはクリーンコードの中で作業をしていることに気づくのです」。この原則の半分は、1つのことを行う小さな関数に適切な名前を付けることで達成できます。関数を小さくし、そこに注目するようになるに従い、内容をよくあらわす名前をつけることは簡単になっていきます。
     長い名前を付けるのを怖がらないでください。内容をよく表す長い名前は、不可解な短い名前よりも優れているのです。内容をよく表す長い名前のほうが、内容を説明した長いコメントよりも優れているのです。複数の単語で構成された関数名を簡単に読めるような命名規約を用い、これらの複数の単語を関数の名前に使用して、その関数が何を行うのかを明確にしてください。

    Clean Code アジャイルソフトウェア達人の技 [amazon.co.jp]』 P70「内容をよく表す名前を使う」より。

    英語圏の話なので、日本語だと必ずしもメソッド名だけで意味が通じるかと言うと微妙な部分はありますが、基本的にIDEが主流になった昨今、下手に短い意味の判らないメソッド名にするよりはっきり意味の判る長いメソッド名の方がよいでしょう。モニターも横長のものが増えていますし、数十文字程度なら全然OKです。

    # 1行80文字とかコーディング規約が厳しい場合は・・・ご愁傷様で、、、

  • by ma_kon2 (9679) on 2012年04月07日 20時59分 (#2131250) 日記
    昔はAPIも少なかったけど、いまじゃAPIを触らないとお話にならず。
    APIは長いのばっかなので、次第になれるものね。
    特にオブジェクト指向だと、関数や変数が「掴めないと」致命的にやばいことも多いよね。
    昔はそこらは考えなくてもよくって、フローがつかみやすいことが第一と。
    まあ、
  • 補完機能が普及して、長い関数名でスペルミスを含んだものが広まったりしがち。

    んで、あとからスペルあってりゃ同名になるはずの似た名の関数追加されて、無事にビルド通っちゃって、関数呼ぶほうのコード書いたとき補完機能で意図せぬほう選んではまる。Un-とか使って反対の機能の関数名を付けるときにUnPackみたいに単語の頭じゃなくなったとこを大文字にしたりしなかったり人によって違うとかも困る(このあたりは英語力に依存するか・・・)。

    表意文字が母語のものとしては、長くてもいいけどぱっと見で差異わかる程度にしてほしいかな。
    新しい関数名を決めるときにありものの関数に安易になんかつけ足して済ませるのはキライ。

  • by Anonymous Coward on 2012年04月07日 19時08分 (#2131185)

    言語の文化みたいなのは当然あるとは思いますが、
    JavaなのにgetAplCfgStrとかなってるほうがよっぽどイヤです。許せない。

    • by Anonymous Coward on 2012年04月07日 23時24分 (#2131304)

      といいますか、あんな原型不明まで切り詰めた略記に違和感を感じないのは、UNIXとCの呪いです。
      UNIXとC界隈のほうがイレギュラーなんですよ。

      他でもLisp系の言語を書いているはずなのに、何故か途中からC関数のmanを引いている…って事態ありますし。
      Cを知らないなら、strftimeとかsscanfとかあんな命名しませんよ。

      学校の一年生でいきなりC言語を教えるから、切り詰めすぎた命名法が身についてしまうのかなぁ。
      最初はJavaかLispを教えた方がいいと思う。

      Unix and C are the ultimate computer viruses.(CとUNIXは最悪のコンピュータウイルス)
      http://www.jwz.org/doc/worse-is-better.html [jwz.org]

      親コメント
      • by saitoh (10803) on 2012年04月08日 22時28分 (#2131689)
        (当時の)UNIXのAPIなんてシステムコールで数10個、Cライブラリで100~200個あたりだったわけで、全部暗記出来る量。 だったら、短く書けた方が、タイピングも読むのも楽、ってことじゃないかなぁ。

        ただし、名前を短くするのが古い言語は多くがそう。1行が80文字以上にのばせない(パンチカード)とか、リンカの外部シンボル識別文字数に6文字とか8文字とかの制限があったりした。Cはイレギュラーじゃない。長生きして世の中の体勢が変わってしまってイレギュラーにおもえるようになっちゃっただけ。

        親コメント
      • ぶっちゃけ、UnixやC標準ライブラリなんて、内輪向けの機能で、素人に使わせることなんて想定してない。

        本気で教育用に使うなら、まともなコマンドとライブラリを用意して、生のコマンドやライブラリを使わずに済ませるべきなんだよね。

        ま、当然、そのままじゃ学外じゃ即戦力にはならないけど、実習で使ったライブラリしか知らないような人間は、そもそも即戦力足り得ないから問題無い。

        その辺を理解せずに、即戦力風味な新人出荷したんじゃ、教育の意味が無い。
        これは、教える側の手抜きが酷すぎると考えるべきかと。

        それに、「プログラミング教育」で要求されるのは、中途半端な小技じゃなく、きちんと物を組み上げる能力の筈。
        ローカルなライブラリしか使えなくても、それが只の便利ツールじゃなく、自力での「組み立て」を要求するプリミティブな物なら、その技術はすぐに別環境でも応用出来るし、そう云う人材の方が使える場合が多いと思う。

        「半端に知ってる奴」が一番手に負えないのは、皆分かってると思うから、「生のUnixコマンドやC標準ライブラリは、初心者には教えない」って云う気風が望ましいかと。

        --
        -- Buy It When You Found It --
        親コメント
  • by Anonymous Coward on 2012年04月07日 19時15分 (#2131198)

    mvとかcpとかで通じる世界に慣れているから
    ついついhoge.Mvみたいなメソッド名にしがち。
    で、叱られると。

    つーかStringはStr、IntegerはIntで十分じゃね?さすがに。
    Z80ですらcdで通じるのに(意味ちゃうがな…)、ChangeDirectoryとかもどうなのよと。
    最初大文字にするのしないのの兼ね合いで
    無理矢理長くしてるように思えなくもない。

    • 私もそう思っていたのですが、若者のプログラムを見て考えを改めました。
      たとえば、Strは、String, Structure, Startの略語で見たことがあります。
      Intは、Integer, Interruput, Interpretの略語で見たことがあります。
      こういう紛らわしいのを見てしまうと、省略しない方がマシだと思うようになりました。

      親コメント
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...