同じ定数をコードのあちこちで使うことに問題はあるだろうか?
ファイルを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ヶ所から参照されている。
- UsbHdd#mounted?
- UsbHdd#mount
- Main#show_status
スクリプトの先頭で定義された定数はスクリプト全体が有効範囲になるため、スクリプトのどこからでも参照することができる。このことに何か問題はあるだろうか?
- UsbHddクラスに、DEST_MOUNT_POINTの値を返すdest_mount_pointメソッドを作成する
- Main#show_statusではDEST_MOUNT_POINTを参照せず、UsbHdd#dest_mount_pointを使う
このようにすれば、DEST_MOUNT_POINTを使うのはUsbHddクラスだけになる。変数が使われている場所が集中するため、ソースコードが理解しやすくなると思うが、どうだろう?