6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

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