QA@IT

ソースコードは横80カラム以内で折り返すべき?

7939 PV

最近はターミナル(もしくはエディタやIDE)の横幅も割と自由が利きますし、画面も大きいので、ソースコードに横80カラム以内で折り返すべく適宜改行を入れるようなコーディングスタイルは古いという意見を耳にします。そんな人とは仕事がしたくない、という風にまで言う若者もいてビビっています。

例えば、こういうコードです。

  def set_encoding(html)
    enc =
      if html =~ /meta.+charset[ =]+[\"\']?([^>[\"\']]+)/i ||
        html =~ /xml.+encoding[ =]+[\"\']?([^>[\"\']]+)/i
        $1
      else
        Kconv.guess(html).to_s
      end
    # to handle the obsolete charset name, which should've been extinct...
    enc = "Shift_JIS" if enc.downcase == "x-sjis"
    enc = "UTF-8" if !Encoding.name_list.map(&:upcase).include?(enc.upcase)

    html.force_encoding(enc)
    html.encode("UTF-16BE",
                :invalid => :replace,
                :undef => :replace,
                :replace => '.').encode("UTF-8")
    end

条件式のところを論理演算子で改行しています。横幅に収まるかどうかというだけでなく、上下で比較して意味的に把握しやすいし、私はこのほうが良いと思うのですが、そうでもないのでしょうか? String#encodeのオプション指定も改行していますが、見やすくて良いと思っています。

横80カラムで改行すべき理由、すべきでない理由がありましたら、教えてください。個人的な意見や、チーム内でのコーディングスタイルの話でも、参考にさせていただきます。

回答

主観によるものが多いと思うのでQA向きではないかもしれませんが、一意見として。

横スクロールが必要になるのは論外だと思っていますが、ワイドディスプレイ全盛の現状を鑑みると80文字もまた少なすぎると思っています。
普段開発に使用しているのはVisual Studio, eclipse, viですが、Visual Studio, eclipseでは180前後、viの場合は1920x1080の画面を横に2分割した場合を考えて130前後を上限としていることが多いように思います。

サンプルコードにもありますが、改行した場合の気持ち悪さの一つはインデントです。

    enc =
      if html =~ /meta.+charset[ =]+[\"\']?([^>[\"\']]+)/i ||
        html =~ /xml.+encoding[ =]+[\"\']?([^>[\"\']]+)/i
        $1

if条件の「html~」と、ifの中身である「$1」が同じカラムから始まっているのがどうも気に入りません。
htmlをもう一文字下げる、if文の直後に空行を入れるなども試してみましたが、どちらもしっくり来ませんでした。

また、補完機能の恩恵もあって、80文字は容易に超えてしまうと感じています。
例えばサンプルコードで省略されている変数名「enc」を「encoding」にしただけでも以下の行が80文字を超えており、また改行も入れづらい所かと思います。

    encoding = "Shift_JIS" if encoding.downcase == "x-sjis"
    encoding = "UTF-8" if !Encoding.name_list.map(&:upcase).include?(encoding.upcase)
編集 履歴 (1)
  • なるほど、130~180なのですね。扱う言語によっても標準的な幅は随分変わってきそうです。あ、条件式の2つがズレてるのは私の環境のせいで、私自身は気持ち悪いと思っていましたが、手で直すほうが更に気持ち悪いというので、まあいっか、という感じです。ご意見ありがとうございます。 -

確かに昨今80桁である必然性はないので適当に決めればいいと思いますが、横が長すぎると読みにくいものですよね。紙の雑誌等に段組がある理由もそうですし、そもそもこのサイトでのQA本文の横幅が長くない理由を考えてもそういうものかと。ので、適宜改行は入れて欲しいです。

というか、

enc =
  if html =~ /meta.+charset[ =]+[\"\']?([^>[\"\']]+)/i ||
    html =~ /xml.+encoding[ =]+[\"\']?([^>[\"\']]+)/i
    $1

の部分は、あるいは

  XML_ENC_PATTERN = /xml.+encoding[ =]+[\"\']?([^>[\"\']]+)/i
  HTML_ENC_PATTERN = /meta.+charset[ =]+[\"\']?([^>[\"\']]+)/i

  if html =~ XML_ENC_PATTERN || html =~ HTML_ENC_PATTERN
    $1

みたいにするべきかもしれません。

また、

  # to handle the obsolete charset name, which should've been extinct...
  enc = "Shift_JIS" if enc.downcase == "x-sjis"
  enc = "UTF-8" if !Encoding.name_list.map(&:upcase).include?(enc.upcase)

は、

  # to handle the obsolete charset name, which should've been extinct...
  def handle_legacy_charset(enc)
    if enc.downcase == "x-sjis"
      "Shift_JIS"
    elsif !Encoding.name_list.map(&:upcase).include?(enc.upcase)
      "UTF-8"
    else
      enc
    end
  end

  def set_encoding(html)
    # 略
    enc = handle_legacy_charset(enc)

みたいに抽出するべきかも。

というわけで、そもそも横に長すぎる行というのは「いやな臭い」の一種であって、別に横80桁は目的ではなく結果とも言えるんじゃないか、と若くない私は思いました。

編集 履歴 (1)
  • なるほど、リファクタリングしたほうがいいということですね。ありがとうございます! -

個人的な好みの範疇ではあると思いますが、私は"折り返さないでほしい"派です。

特にRubyの場合は行末にセミコロンが無いので、私の場合は、ある程度、改行でプログラムの区切りを認識してコードを読むという感じになっています。
プログラムの途中で任意の改行が入っていると、プログラムの意味の固まりが少し分かりづらくなるような気がします。

例で示されているコードだと、3行目の「if html =~ /meta.+charset[ =]+[\"\']?([^>[\"\']]+)/i ||」という部分と、4行目の「html =~ /xml.+encoding[ =]+[\"\']?([^>[\"\']]+)/i」という部分がパッと見、別々のコードのように認識してしまう、誤認してしまうという感じです。
もちろん、ちゃんと読めば「||」の演算子があるので、一つの条件式なのだと理解は出来るのですが、コードの俯瞰性が少し落ちるかな、と思います。

あくまで自分の場合は、ですが、自分が例のコードを書くとしたらこのような感じでしょうか。

def set_encoding(html)
  if html =~ /meta.+charset[ =]+[\"\']?([^>[\"\']]+)/i || html =~ /xml.+encoding[ =]+[\"\']?([^>[\"\']]+)/i
    enc = $1
  else
    enc = Kconv.guess(html).to_s
  end

  # to handle the obsolete charset name, which should've been extinct...
  enc = "Shift_JIS" if enc.downcase == "x-sjis"
  enc = "UTF-8" if !Encoding.name_list.map(&:upcase).include?(enc.upcase)

  html.force_encoding(enc)
  html.encode(
    "UTF-16BE",
    :invalid => :replace,
    :undef => :replace,
    :replace => '.'
  ).encode("UTF-8")
end
編集 履歴 (0)
  • なるほど、セミコロンが必須でない場合は行が認識しづらい、ということですね。確かにそれはあるかもしれません。ご意見ありがとうございます! -

完全に個人的な好みですが、たとえ「最近のターミナルは横幅が変えられる」としても、
変えるのがめんどくさいので80桁くらいに納めて欲しいです。

ついでにオフトピですが、メールやgithubのコメントとかも > で引用しづらいので
適当なところで折り返して欲しいですね。

編集 履歴 (0)
  • なるほど、メールやコメント欄での流通まで考えると、改行コードを入れておくのも一理あるということですね。ご意見、ありがとうございます。 -

自分はjavaがメインですが、120前後ですね。
解像度が普通にあればワイドディスプレイでなくても
コードツリーを出したままで見えるサイズがコレくらいだと思います。

あとはjavaは、わりとクラス名やメソッド名、変数名は
略さずに書くので80だとすぐ改行してしまうので
逆に読みにくくなってしまうと思います。

あとはjavaの処理が一行一行完結というか区切りになるスタイルとかが
処理コードを改行させるのを嫌ってる感じがします。
if判定も複数のものや長くなる場合、全ての判定を書くのではなくて
いくつかに分けて変数に代入してから比較するような感じ。デバッグで変数の値も見やすいし。

関数型やjavascriptのようなコールバック系の場合
メソッド呼び出しに対して処理コールバックをその場で書くのが当たり前なので
行分けするのがわりと普通で、改行が一杯されていても気にならないかもしれません。

javaもクライアントサイドプログラムやってる人はまた別の意見かも。

編集 履歴 (0)
  • なるほど、言語によっても特性が違うちうことですね。ご意見ありがとうございます。 -

基本的には折り返しますが、80カラムで絶対ということもないですね。
たとえば、83カラムで終わるときはそのまま続けて、エディタの折り返しに任せます。
理由は「その程度だと見にくくならないから」です。
あと、折り返し方ですが、演算子は行頭に書きますね。

    enc =
      if html =~ /meta.+charset[ =]+[\"\']?([^>[\"\']]+)/i \
      || html =~ /xml.+encoding[ =]+[\"\']?([^>[\"\']]+)/i
        $1
      else
        Kconv.guess(html).to_s
      end

か、

    enc =
      if html =~ /meta.+charset[ =]+[\"\']?([^>[\"\']]+)/i \
      or html =~ /xml.+encoding[ =]+[\"\']?([^>[\"\']]+)/i
        $1
      else
        Kconv.guess(html).to_s
      end

if や while の直下(括弧内でないという意味)では、and や or を使うことが多いです。

編集 履歴 (0)

プロジェクトで標準的に使うエディタの環境によるけど、
昨年新規開発した時は横80桁くらい、なるべく100桁以内にしました。
(今のプロジェクトは全く縛りが無いです)
ただし、無理におさめる必要は無いので、ソースを修正する際に可読性を損ねるような改行挿入は厳禁。

横1920なデスクトップでも、デフォルト設定のTortoisSVN使って差分確認すると、115桁までしか入らないんですよね。
ソース修正して、インデント追加したりすると、溢れるかもしれないんで、80桁なら余裕だろっと。
Eclipseの時はもっと表示できてた気がする。

ちなみに、継続行の場合は、インデント2つで、演算子の手前で改行が望ましいってルールにしてます。
演算子から始まる文は、すぐ継続行だって気づくのと、
インデント2つ分にしておくと、

if (式1
    && 式2)
  文;

と、頭が揃わないので気づきやすいから。

しかしこれも、エディタにフォーマット機能がある場合はその影響を受けますので、
カスタマイズできて、設定ファイルをチーム内に展開できれば良いけど、
カスタマイズできなかったり、共有が面倒な時は、
フォーマットされた物は無理に直さないってルールにしてます。

編集 履歴 (0)
  • ありがとうございます、参考になります。なるほど演算子の手間で改行というのは確かに良いですね。 -

私は、スクリーンに収まりきらず横スクロールさせなければならないようなコードは見にくいと思います。
だから、横スクロールしないようにどこかで折り返さなければなりません。
それで、特別な基準があるわけではありませんが、私は80桁で折り返すようにしています。
別に200桁なら全てのコードが収まるという保証もありませんし、結局のところどこかに基準を置いて折り返すしかないので、適当に80桁にしています。

編集 履歴 (0)
  • ご意見ありがとうございます。確かに論理改行を自動でやってくれる表示環境ばかりじゃないですもんね。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。