気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

書籍「Railsによるアジャイル Webアプリケーション開発」4章

3章はRailsの概念的なアーキテクチャだったので省略
4章を通じてRubyの不明確だった部分のイデオムを復習してみます。

1.配列とハッシュ

配列とハッシュはインデックス付きのコレクション


■配列の書き方

a = [1, 'cat', 3.14]
a[0] 
a[2] = nil               # 設定後の配列 [1, 'cat', nil]

複数の型を混在させて格納できる。
nilはnullオブジェクト。オブジェクトなのでnull pointer exceptionを発生させない。

a = ['cat', 'dog', 'duck']
# 次のようにも指定可能
a = %w[cat dog duck]

a = [1, 'cat', 3.14] #初期化後の配列 ["1", "cat", "3.14"]

ただし、挿入は文字列に限られる。すべて文字列として認識される。


■ハッシュの書き方

inst_section = {
	#左側がkey、右側がvalue
	:cello => '弦楽器'
	:clarinet => '木管楽器'
	:drum => '打楽器'
}


■指と目に優しい異なるハッシュの書き方

inst_section = {
	#左がハッシュの場合のみ使用可能な記法
	cello:  '弦楽器'
	clarinet:  '木管楽器'
	drum:  '打楽器'
}


■ハッシュへのアクセス方法

inst_section[:clarinet] #=> '木管楽器'
inst_section[:bassoon] #=> nil


メソッドの最後のパラメータにハッシュを使用した場合のカッコの省略記法

	#redirect_to()へハッシュパラメータを代入
	redirect_to action: 'show', id: product.id

java屋さんとしては、しっかり抑えておきたい記法。
カッコがないと途端に理解できなくなるのでw


4.3 ロジック


■ブロック

処理をひとまとまりにした記述

#中括弧を使った書き方
{ puts "Hello" }

# do endを使った書き方
do
	club.enroll(person)
	person.socialize
end


■ブロックをパラメータとして受け取る方法

def wrap &b
	3.times(&b)
	print "\n"
end
wrap { print ”ほー”} # 結果:ほーほーほー


4.4 組織構造

■クラスメソッドインスタンスメソッド

class
	#クラスメソッド
	def self.find
		selef.where('paid = 0' )
	end

	#インスタンスメソッド
	def plus( num )
		sum += num
		sum
	end
	
end


■アクセッサメソッド自動作成メソッド

class Greeter
	attr_accessor :name      #読み書き用メソッド作成
	attr_reader    :greeting  #読み込み用メソッド作成
	attr_writer     :age         #書き込み用メソッド作成

rubyが得意なメタプログラミングメソッドを生成しているのかな。。気になる。

インスタンスメソッドはデフォルトはpublicとなる。
protected,privateにしたいときはメソッド定義の直前に明示する。


モジュール

■概要
メソッド、定数、クラスなどをまとめたクラスのようなもの
・オブジェクト生成はできない
・他のクラスへ機能の委譲を行うのに使う

■使い方
モジュールを他のクラスへ「mix int」としてクラスへインクルード。
モジュール内のインスタンスメソッドがクラス内に定義されているがごとく使用可能となる。

module StoreHelper
	def capitalize_words(String)
		string.split(' ').map {|word| word.capitalize}.join('')
	end
end

中括弧に対してドット「.」でつなげるとか、慣れないっす。
ブロックもオブジェクトを返却するためか。
この場合は先頭大文字のstringを区切り文字なしでつなげていると思われる。


4.5 オブジェクトのマーシャリング

マーシャリングって聞き慣れない。。

■概要
・オブジェクトをバイトストリームへ変換し、アプリ外部へ保存すること
・保存オブジェクトはアプリ内のインスタンスに読み込みが可能
・注意点が二つ。一部のオブジェクトは保存できない。オブジェクトロード時に
そのオブジェクトのクラス定義をRubyが知っていないといけない。

あまり良くわからないが、ヘーなるほどレベルに止める


4.6 総仕上げ

Rubyのらしい書き方でRubyに慣れる

class CreateProducts < ActiveRecord::Migration
	def change
		create_table :products do |t|
			t.string :title
			t.text :description
			t.string :image_url
			t.decimal :price, precision: 8, scale: 2
			
			t.timestamps
		end
	end
end

■全体概要
ActiveRecordモジュールのMigrationクラスを継承
chageというメソッドを作成
・内部でMigrationクラスのcreate_tableというクラスメソッドを呼び出す。

■create_tableメソッド
・create_tableの引数に:productsというハッシュのテーブル名を渡す。
ハッシュのため、引数の括弧が省略されている
・内部にtというテーブルのフィールド定義用オブジェクトが内部に渡される。
・tオブジェクト内の各メソッドでフィールド定義(string,text,decimalはメソッド)
・各メソッドには例によってハッシュパラメータが渡されているため、括弧が省略されている。

パラメータにハッシュ渡すの書き方が括弧なしなので
好まれる書き方なのかな。Javaやっている人間がぱっと読むとわからなくなりそう。

長くなりましたが、4章完了。
次回から本格的にアプリケーションの構築を開始します。