

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

以下の記事から引用いたします。

[Railsモデルのメソッドの命名について](https://qiita.com/qpSHiNqp/items/7bcb0492c777a488ceba#%E4%BD%9C%E7%94%A8%E3%82%92%E4%BC%B4%E3%81%86%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)

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

いい例

[code]

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

悪い例

[code]

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

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

[code]

    # app/models/user.rb
    
      # ユーザーをフォローする
      def follow(other_user)
        active_relationships.create(followed_id: other_user.id)
      end
    
      # ユーザーをアンフォローする
      def unfollow(other_user)
        active_relationships.find_by(followed_id: other_user.id).destroy
      end
    
[/code]

[railsチュートリアル12章](https://railstutorial.jp/chapters/following_users?version=4.2#:%7E:text=%23%20%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E3%83%95%E3%82%A9%E3%83%AD%E3%83%BC,include%3F\(other_user\)%0A%20%20end)

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


CC BY-SA 4.0
2022-02-14T10:51:30.270
86336
2022-02-17T22:14:21.070
2022-02-17T22:14:21.070
40650
40650
question
ruby-on-rails ruby
オブジェクト指向的に書く場合、レシーバは主語ではなく目的語？ railsチュートリアルとどちらが正しい？？


命名規則は、言語毎にある程度の決まりはありますが、それ以上はプロジェクトチームごとに統一するとか、場合によってはプロジェクト毎に決めれば良いだけで、絶対的な物は無いと思います。

それはさておき、Smalltalkというオブジェクト指向言語を広めた言語では、  
・オブジェクトにはメッセージを送る。そのメッセージをどのように解釈するかは、受け取ったオブジェクト次第。  
という考え方があります。その考えを採用するなら、メソッドの「悪い例」のほうがオブジェクト指向的だと思います。  
「良い例」は、「私」が主語になっているので、オブジェクトの動作を決めるのは呼び出し側であり、オブジェクトはその結果を与えられるという思想になっています。一方、「悪い例」では、オブジェクトに動作を決める権限を与えています。

また、「良い例」は、主語を「I」、目的語をオブジェクトにしようとしてバランスが崩れている気もします。  
cow.grow は(結果的に)cowが主語になっていますし、  
file.deleteは主張どおり目的語・述語になっていますが、英語の語順としておかしくなっています。  
単純に、  
fileManager.delete(file)  
のように、オブジェクトを目的語らしく使った方が自然です。

とはいえ、最初に書いたとおり、命名規則はプロジェクトチームやプロジェクト毎に決めれば良い物なので、どちらにするかを「決めること」が大事です。


CC BY-SA 4.0
2022-02-15T00:03:53.270
86341
2022-02-15T00:03:53.270
8077
86336
answer


元のメソッドの命名についての記事はさすがに英語の文法（語順）に引っ張られすぎで、そのために何か変な話になってしまっているんではないでしょうか。

[code]

    cow.grow
    file.delete
    
[/code]

といった例自体は悪くないかと思います。が、これは英語の語順によるものというよりは、`cow`や`file`といったオブジェクトにロジックを寄せるべきで、なんとかmanagerみたいなものにロジックを寄せると`cow`や`file`が単なるデータ置き場になる、いわゆる[ドメインモデル貧血症](https://bliki-
ja.github.io/AnemicDomainModel/)になってしまいます。こういったことを避けるためではないでしょうか。

それでいくと、ユーザーをフォローする・アンフォローするといったロジックであれば、普通にuserのメソッドとして実装することは自然で特に問題なさそうです。

というわけで、コードの良し悪しについては元の記事もRailsチュートリアルのサンプルもどちらも正しそうです。ただし、その正しさの基準について、英語の語順を根拠として持ち出すことは正しくないのではないでしょうか。


CC BY-SA 4.0
2022-02-17T16:41:49.640
86422
2022-02-17T16:41:49.640
12678
86336
answer