-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

03 / 09
Sun

IDE を NetBeans に変えてみた Ziphil です。

こんな風に定数を定義して。

BORDER = 1
ROOM = 2
PATH = 3
VERTICAL = 10
HORIZONTAL = 11

で、 こんな風に書けば、 定数を定義せずに数値を書くより、 何をしてるか分かりやすいじゃないですか。

if area.width >= minimum * 2 + 1
  bx = rand(area.width - minimum * 2) + minimum
  area.height.times do |j|
    @tiles[area.y + j][area.x + bx] = BORDER
  end 
  @areas[i..i] = area.devide(bx, VERTICAL)
end

正直、 定数の実際の値なんてどうでも良いじゃないですか。 ここでは、 VERTICAL の値を 10 にしてますが、 別に 100 でも 1000 でも良いんです。

数値である必要もなく、 VERTICAL = :vertical としても良いわけです。 しかし、 :vertical で具体的な意味が分かるので、 もはや定数を定義する意味がなくなります。 では、 定数の定義をやめてシンボルを使ってみると、 こうなります。

if area.width >= minimum * 2 + 1
  bx = rand(area.width - minimum * 2) + minimum
  area.height.times do |j|
    @tiles[area.y + j][area.x + bx] = :border
  end 
  @areas[i..i] = area.devide(bx, :vertical)
end

こうすれば、 定数の定義も必要なく、 かつ何をしているのか分かりやすい。 これでも・・・、良いんですよね?


03/09 リファレンスマニュアルを見てみると、 シンボルの用途に 「C の enum 的な使用」 というのがありました。 そもそも、 列挙型と定数って何が違うんでしょう。

例えば、 静的型付けの Java を例にとってみましょう。 定数を定義してみます。

public static final int VERTICAL = 10;
public static final int HORIZONTAL = 11;

このとき、 VERTICAL, HORIZONTAL はともにただの int 型の数値ですから、 VERTICAL もしくは HORIZONTAL を要求するメソッド引数に、 5 や 100 などの他の int 型数値を指定することができてしまいます。 型の保証が崩れます。 これを解消するものが列挙型だと思います。

public enum Direction {
  VERTICAL, HORIZONTAL
}

こうしておけば、 VERTICAL, HORIZONTAL は Direction 型ですから、 これらを要求するメソッドも Direction 型を要求するようにしておけば、 5 や 100 などの関係ない数値を指定するとエラーになってくれます。

と、 Java ではこのような恩恵が得られますが、 Ruby は動的型付けですから、 列挙型も定数も同じようなものになってしまう気がします。 ということで、 シンボルを列挙型の代用としても、 定数を使っても、 特に違いはないわけですから、 ここは好みの問題になるんでしょうか。

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。