同じ定数をコードのあちこちで使うことに問題はあるだろうか?

ファイルをUSB HDDにバックアップするスクリプトを作成しているとしよう。このスクリプトには次の作業を含む。

  • USB HDDがマウントされているか確認する
  • USB HDDをマウントする

凝集度の観点から、USB HDDに関する知識は集めた方がよいと考えられる。そこで次のようなクラスを作成する。

# settings for USB HDD
DEST_DEVICE_NAME = '/dev/sdc1'
DEST_MOUNT_POINT = '/mnt/usbhdd'

class UsbHdd
  def mounted?
    system("mount | grep #{DEST_MOUNT_POINT} >/dev/null")
  end

  def mount
    cmd = "mount #{DEST_DEVICE_NAME} #{DEST_MOUNT_POINT}"
    flag_success = system(cmd)
    abort('usbhdd mount error.') unless flag_success
  end
end

このバックアップスクリプトでは、現在のマウント状態を表示するようにしよう。メインクラスに次のようなメソッドを作成する。

class Main
  # (中略)
  def show_status
    usbhdd = UsbHdd.new
    print "backup destination (#{DEST_MOUNT_POINT}) " +
      is_or_is_not(usbhdd.mounted?) + " mounted.\n"
  end

  def is_or_is_not(condition)
    condition ? 'is' : 'is not'
  end
end

定数DEST_MOUNT_POINTは次の3ヶ所から参照されている。

  1. UsbHdd#mounted?
  2. UsbHdd#mount
  3. Main#show_status

スクリプトの先頭で定義された定数はスクリプト全体が有効範囲になるため、スクリプトのどこからでも参照することができる。このことに何か問題はあるだろうか?

  1. UsbHddクラスに、DEST_MOUNT_POINTの値を返すdest_mount_pointメソッドを作成する
  2. Main#show_statusではDEST_MOUNT_POINTを参照せず、UsbHdd#dest_mount_pointを使う

このようにすれば、DEST_MOUNT_POINTを使うのはUsbHddクラスだけになる。変数が使われている場所が集中するため、ソースコードが理解しやすくなると思うが、どうだろう?