今更ながらRubyで簡単なクラスを作って動かしてみた

# 動機
仕事を辞めてから一年、久しぶりにRubyを書いてみようと思いました。
ですが、いつもRailsばかりやっていたので、クラスも新規に書けない体たらく・・・。
ここは基本に戻って簡単なクラスから作ってみよう！！と思い立ちました。
（リハビリですね :sweat_smile: )
Rubyを始めた方の参考になれば

# 要件
簡単なクラスと言っても、役に立つプログラムを作りたい。
そこで、今の仕事（農業）に役に立つ、「[飽差](http://lib.ruralnet.or.jp/genno/yougo/gy087.html)」を気温、湿度（相対湿度）から算出するクラスを作成してみます。
飽差は気温、湿度を使って以下の計算式から算出されます。
1. [飽差]=(100－相対湿度)＊[飽和水蒸気量]/100
2. [飽和水蒸気量]=217＊[水蒸気圧]/(気温＋273.15)
3. [水蒸気圧]=6.1078＊10＾((7.5＊気温/(気温＋237.3)))

# 方式設計
今回は凝らずにコマンドプロンプトからirbで実行するプログラムとします。
気温、湿度をそれぞれオブジェクトとして作成することとします。
戻り値で飽差を戻すので、irbであればそのまま表示されます。

# クラス設計
気温と湿度が分かれば飽差が算出できるので、気温クラス、湿度クラスを作成することとします。
気温から算出できるのは、水蒸気圧、飽和水蒸気量なのでこの計算は気温クラスで実装します。
飽差は気温、湿度が必要なのですが湿度クラスで実装し、気温オブジェクトを引数として渡すことで、飽差を算出します。

# 実装
それでは実際にクラスを作成してみます。
気温、湿度はクラス生成時に数値として渡し、クラス変数として格納しています。

```ruby:Temperatura.rb
# 気温クラス
class Temperatura

	# 気温クラスの生成
	# @param	[Float] temperatura 気温
	def initialize(temperatura)
		@temperatura = temperatura
	end

	# 飽和水蒸気量
	# @return	[Float] 飽和水蒸気量
	# @example	飽和水蒸気量の算出式
	# 	217＊①水蒸気圧/(気温＋273.15)
	def amount_of_saturated_water_vapor
		217*water_vapour_pressure.fdiv(@temperatura+273.15)
	end

	# 水蒸気圧
	# @return	[Float] 水蒸気圧
	# @example 水蒸気圧の算出式
	# 	6.1078＊10＾((7.5＊気温/(気温＋237.3)))
	def water_vapour_pressure
		6.1078*10^((7.5*@temperatura.fdiv(@temperatura+237.3)))
	end
end
```

```ruby:Humidity.rb
# 湿度クラス
# @see Temperatura
class Humidity

	# 湿度クラスの生成
	# @param	[Float] humidity 気温
	def initialize(humidity)
		@humidity = humidity
	end

	# 飽差
	# @return	[Float] 飽差
	# @example 飽差の算出式
	# 	(100－相対湿度)＊②飽和水蒸気量/100
	def saturation_deficit(temperatura)
		(100-@humidity)*temperatura.amount_of_saturated_water_vapor.fdiv(100)
	end

end
```

すでに算出式があるのでコーディングは楽勝です。 :kissing_closed_eyes: 
なお、除算についてはscivolaさんからコメントで指摘いただいたので、`fdiv()`を使うようにしています。（感謝！！）

# 実行
では、irbで実行してみます。
今、気温、湿度を見てみると`25.8℃` `72%`だったのでその時の飽差を出してみます。

```shell-session
$ cd ~/プロジェクト/環境制御
$ irb
irb> load "./Temperatura.rb"
=> true
irb> load "./Humidity.rb"
=> true
irb> Humidity.new(72).saturation_deficit(Temperatura.new(25.8))
NoMethodError: undefined method `^' for 61.078:Float
	from ~/プロジェクト/環境制御/Temperatura.rb:23:in `water_vapour_pressure'
	from ~/プロジェクト/環境制御/Temperatura.rb:15:in `amount_of_saturated_water_vapor'
	from ~/プロジェクト/環境制御/Humidity.rb:16:in `saturation_deficit'
	from (irb):7
	from /usr/bin/irb:12:in `<main>'
```

あれ :question: エラーとなりました。
``undefined method `^' for 61.078:Float``なので、Floatに累乗のメソッドが無いと言っています。
あまり事務処理系のシステム開発では累乗を使うことは少ないですし、プログラムを学び始めた頃のBasicでは`^`が累乗だったので気にしていなかったのですが、正しい数式としてはおかしいのですよね。

```math
x^2
```

と書くのが正しいので、便宜上`^`が使われているだけのようです。
では、Rubyでの累乗はどうなのかというと、`**`を使います。

ソースを修正します。

```ruby:Temperatura.rb
# 気温クラス
class Temperatura

~~ 中略 ~~

	# 水蒸気圧
	# @return	[Float] 水蒸気圧
	# @example 水蒸気圧の算出式
	# 	6.1078＊10＾((7.5＊気温/(気温＋237.3)))
	def water_vapour_pressure
		return 6.1078*10**((7.5*@temperatura.fdiv(@temperatura+237.3)))
	end
end
```

それでは、再度実行してみます。

```shell-session
irb> load "./Temperatura.rb"
=> true
irb> Humidity.new(72).saturation_deficit(Temperatura.new(25.8))
=> 6.750964382095755
```

それらしい値が出ました。
世の中には`飽差表`というものが出回っているので、それと比べてみると、だいたい値が正しいことが分かります。
今回、やりたいことはとりあえずできました :laughing: 

# 補足
irbでファイルを読み込むのに、`require`ではなく`load`を使いました。
これには理由があります。
`require`で読み込むと、同じファイルであれば二度目以降は読み込まないようになっています。
これはファイルを読み込む処理を省略できるので良いのですが、動作テストの時などは修正して読み込みし直したい時が多々あります。
そんな時は`load`を使うと良いです。
ただ、本番環境などでは使わないようにしてください。
気がつかないうちにどんどん重たくなって、実用に耐えれなくなるかもしれません。