質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

988閲覧

【ruby】オブジェクト指向的に書く場合、レシーバは主語ではなく目的語? railsチュートリアルとどちらが正しい??

thesnowman

総合スコア154

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2022/02/14 10:46

編集2022/02/14 10:51

オブジェクト指向について質問です。

こちらの記事から引用いたします。
いい例として、レシーバとインスタンスメソッドは、他動詞と目的語の関係であるとあります。
そして、悪い例として、レシーバとインスタンスメソッドは、主語と他動詞の関係とあります。

いい例

cow.grow # <= I grow up the cow. その結果 cow.age はインクリメントされる、などの作用が起こる。 file.delete # <= I delete the file. その結果、(プログラムにとっては)外部のファイルシステム上でファイルが消える作用を起こす。 job.perform # <= I perform the job.

悪い例

manager.evaluate(member) # <= 語順そのまま A manager evaluates his member.

しかし、railsチュートリアルだと以下のようなメソッドを実装しているんですよね。
これは、user follow other user、なので悪い例にあてはまるケースですよね。

app/models/user.rb

1 # ユーザーをフォローする 2 def follow(other_user) 3 active_relationships.create(followed_id: other_user.id) 4 end 5 6 # ユーザーをアンフォローする 7 def unfollow(other_user) 8 active_relationships.find_by(followed_id: other_user.id).destroy 9 end

https://railstutorial.jp/chapters/following_users?version=4.2

これはこの記事の主張が間違っているのか、チュートリアルがオブジェクト指向の原則から外れているのかでいうとどちらでしょう?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/14 11:09

「別にどっちでもいい」が正解。そんなこと考えながらコード書くことはない。
thesnowman

2022/02/14 11:27 編集

結構大事かなーと思いました!
Zuishin

2022/02/15 06:22

> manager.evaluate(member) # <= 語順そのまま A manager evaluates his member. 別に悪くないと思います。 主語と目的語など、文脈に依存して容易く変わります。 記事を書いた人の個人的なこだわりでしかないでしょう。 特に manager は他のオブジェクトを管理するのが仕事で、自分に対して何かするのが主な仕事ではないことが多いと思います。違うとすれば、それこそクラスの命名が良くありません。
guest

回答2

0

「こちらの記事」 が「オブジェクト指向の権威ある説明書」 というわけでもないですから、、、、
私には cow.grow は自動詞に見えますし。

user follow other user も let user follow other user の様にもみえますし

投稿2022/02/14 11:14

編集2022/02/14 11:16
winterboum

総合スコア23645

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

個人的見解で書きます。(間違っている可能性大)

私の解釈では、レシーバ(?) は関数(メソッド)の場合は動詞として認識しています。
ただし、英文法的には「命令形」。

OOP的な発想を持っていない言語、たとえばC言語、を例にとると、大きく分けると二種類あります。
strtokk関数( 恐らく string token だろう )は名詞が名前になっています。
もう一つは動詞タイプ。memset関数とか。( memory-setだろう )

プログラミング言語ではないですがWindowsのコマンドプロンプトでのコマンドも同様。CD ( Current-Directoryだと思われる ) のパターンや、MOVE ( 「移動せよ」的な ) パターンですね。

そこから考えて名詞で名づけられるか、「命令形」としての動詞で名づけられていますね。

で今回のようにOOPを取り入れているような言語。今回の例を取ると、
cow.grow は、「I grow up the cow.」みたいな文ではなく、「(Hey,) cow, Grow up, men!」みたいな解釈でしょうか。

オブジェクトは確かに主語ですが、オブジェクトに対しての「命令形」ですね。
OOP以前はプログラムに対して「ファイルにこれを書いておけ」と命令する状態でしたが、OOPでは
「ファイル君、これを書いておいてね」という感じでオブジェクトに命令する感じかと。

そもそものOOPの基本的な発想のメインは「メッセージパッシング」と言われています。
オブジェクトに命令する事です。

質問にある、「I grow up the cow.」とかだとOOP以前の言語と発想が変わりません。なので私の解釈では「命令形としての動詞」ですかね。

もちろん、他の言語でいうフィールドとかプロパティだと動詞ではなく状態なので形容詞か形容動詞か名詞ってところでしょうけど。

投稿2022/02/14 11:11

BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thesnowman

2022/02/14 11:30 編集

ありがとうございます! hey, cow, grow up (自動詞のgrowの命令形) hey, file, delete yourself (他動詞のdeleteの命令形) ※deleteは自動詞がなかった https://ejje.weblio.jp/content/delete hey, job, perform (自動詞のperformの命令形) hey, user, follow other user (他動詞のfollowの命令形) ということで全部おかしくないって解釈で正しいですかね?
BeatStar

2022/02/14 12:08

まあ、Hey は余計ですが、イメージ的に付けました。 普通の英文でも 「You, sit down!」(訳: おまえ、座れや!!)的に使う事はありますし。
maisumakun

2022/02/14 12:13 編集

> CD ( Current-Directoryだと思われる ) のパターンや change directory、です。Windowsでは「cd」とだけ打つとカレントディレクトリを表示しますが、Unix系では「ホームディレクトリに移動する」動作になります。
thesnowman

2022/02/15 04:34

> まあ、Hey は余計ですが、イメージ的に付けました。 承知しています! オブジェクトに命令しているイメージですよね。 全部特に違和感ない感じがしますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問