2022年5月2日 Rails開発者が採用面接で聞かれる想定Q&A 53問(翻訳)を深ぼる(Q1〜Q10)
基本的な用語
コレクション
コレクションとは,いくつかのオブジェクトをまとめて取り扱うための「容器」として振る舞うオブジェクトです。Rubyの標準ライブラリはいくつかのコレクション・クラスを提供しています。代表的なものはArray(配列)とHash(ハッシュまたは連想配列)です。 引用
Rubyにおけるオブジェクト
オブジェクト指向言語におけるオブジェクトとは、クラスのインスタンスのことです。 全てのインスタンス(オブジェクト)を作るクラスはclassクラスを継承しています。 class自体がclassクラスのインスタンスです。
irb(main):002:0> Class.class => Class
オブジェクト指向言語
オブジェクトを基本的な単位としてプログラムをつくることが出来る言語です。 オブジェクト指向とはそのプログラミングの性質のことをいいます。
オブジェクト指向言語ではオブジェクトの雛形であるクラス(class)やプロトタイプ(prototype)、および内部のメソッド(method)やプロパティ(property)を定義する構文や、オブジェクトのインスタンス化、メソッド呼び出しなどの機能が提供されています。
インスタンス変数
- インスタンス変数とは、同じインスタンス(同じオブジェクト)の内部で共有される変数です。
- インスタンス変数は、クラスの内部で使えます。
- インスタンス変数の変数名は必ず@で始めます。
- インスタンス変数はクラスの外部から参照できません。参照したい場合は、参照用のメソッドを作る必要があります。
class User def initialize(name) @name = name end # クラス内で定義したインスタンス変数は、 # クラス内で自由に使うことができます。 def hello puts "Hello, I am #{@name}" end end user = User.new('Alice') user.hello # => Hello, I am Alice
class User # インスタンス変数を参照するためには、ゲッターを定義する attr_reader :name def initialize(name) @name = name end def hello puts "Hello, I am #{@name}" end end user = User.new('Alice') user.hello # => Hello, I am Alice puts user.name # => Alice
ローカル変数
- ローカル変数とは、メソッドやブロックの内部で作成される変数です。
- @がついていない変数です。
- ブロックの外では使用出来ません。
sendメソッド
sendとは、レシーバの持っているメソッドを引数に渡すことで呼び出してくれるメソッドです。
obj.hello #=> 'hello' obj.send(:hello) #=> 'hello'
- objは何かのクラスのインスタンスで、そのクラス内でhelloメソッドが定義されているという前提です。
- objはhelloメソッドを持つため、sendを経由して実行することが出来ます。
デザインパターン
デザインパターンとは、「よく出会う問題とそれにうまく対処するための設計」をまとめたものです。
セッター・ゲッター
Rubyではゲッター(getter)を用いてインスタンス変数にアクセスでき、セッター(setter)を用いてインスタンス変数に値を設定できます。
セッター(クラス内)
def name_change=(name) @name = name end
クラス内で上記のようにセッターを定義することで値の変更を出来るようになります。 attr_writerやアクセサーを定義することで、上記の定義をせずにセッターが使用できます。
class User attr_reader :name attr_writer :name def initialize(name) @name = name end def hello puts "Hello, I am #{@name}" end end user = User.new('Alice') # インスタンスは、所属しているクラスに定義してあるメソッドを呼び出すことができる user.hello # => Hello, I am Alice puts user.name # => Alice user.name ="YUKI"; user.hello
ActiveRecordを継承したモデルのインスタンスの場合は、生成した段階でアクセサーが自動的に定義されるため、セッターやゲッターを自分で定義しなくても使用することが出来ます。
irb(main):001:0> @user = User.new() => #<User id: nil, email: nil, crypted_password: nil, salt: nil, created_at: nil, updated_at: nil, first_name: nil, last_name: nil, avatar: nil, reset_password_token: nil, reset_password_token_expires_at: nil, reset_password_email_sent_at: nil, access_count_to_reset_password_page: 0, role: "general"> # respond_to?を使うことで、オブジェクトがメソッドを持つかを判定できます。 irb(main):002:0> @user.respond_to?(:email) => true irb(main):003:0> @user.respond_to?(:email=) => true
参考
デザインパターンの基本 Rails開発者が採用面接で聞かれる想定Q&A 53問(翻訳) 7 Design Patterns to Refactor MVC Components in Rails