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

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

ただいまの
回答率

87.95%

Rubyの破壊的メソッドの命名規則のような法則を他言語でも行いたい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 4
  • VIEW 3,757

score 258

Rubyだと実行したオブジェクト自身を変更するような破壊的メソッドは
大体メソッド名の末尾に!がついてますよね。

# 文字を正規表現で置換する
s.gsub(/(\r\n|\r|\n)/, "<br />")
s.gsub!(/(\r\n|\r|\n)/, "<br />")

これって直感的だし短く書けて非常にわかりやすいと思うんですが、
他の言語だと大抵仕様上メソッドに!という文字は使えません。

そこで皆様に質問なのですが、Ruby以外の言語で例えば処理内容は同じだけど
「引数として返す」、「オブジェクト自身を変更する」
という違いの2つのメソッドを実装したい場合、

何か良い感じの命名規則とか自分ルールとかあったら教えて下さい。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+4

C++ では、命名規則ではなくメソッドシグネチャでその区別を表現できるようになっています。
表現というよりは制約なのですが、const というシグネチャを付けたメソッドだと、その中の処理ではインスタンスのフィールド値を書き換えることができません(書き換える処理があるとコンパイルエラーです)。

ゆえに、constが付いていることで非破壊的なメソッドであると保証されます。付いていなくても自身を変更するタイプのメソッドとは限らないのがあれですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

その場その場で英単語をうまいこと使い分けてきた気がします…

【追加・結合】
concat/merge ↔ append/add

【削除・差分】
diff ↔ delete/subtract

【設定】
withXXX ↔ setXXX

欲しいですよね,もっと一般的なルール.
(他の回答に期待)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/14 12:07

    自分の周りからは「結局名前からの大雑把な推測と丸暗記なんだよなぁ」という声が聞こえてきました…

    Rubyも「!」による分類が完全なわけではないようです

    キャンセル

+1

破壊的代入に関しては、参照透過性を大事にする関数型言語でよく語られているのを目にします。逆にオブジェクト指向言語では、(もちろん減らしておいたほうがいいのですが、)オブジェクトは当たり前に状態を持ち、妥当な副作用を許しています。

RubyはLispの影響が強いという記述を見たことがあります。破壊的代入にわかりやすい命名をするあたり本当にそうだと感じます。

私は、主にオブジェクト指向言語でコーディングをします。メソッド名から予測できる範囲での副作用は気になりませんし、破壊的代入は`s = s + ".";のようにするし気にならないのですがどのような場合に便利だとおもいますか?

全然回答ではないですね。失礼。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/14 12:17 編集

    オブジェクトそのものの不変性と変数の破壊的代入を混同されているような。
    ```
    s = s + ".";
    ```
    これはJavaかC#のコード片として読みますが、これは変数のは破壊的代入であってもオブジェクトの状態変更ではありません。s+"."というのは不変オブジェクトであるStringから新しいStringを作り出す操作になります。

    質問で議論されているオブジェクト自身の変更は、Java/C#で言うならStringBuilderです。StringBuilder#append なんかがオブジェクト自身を状態変更するメソッドになります。

    キャンセル

  • 2016/06/14 13:23

    失礼、かなり厳密な話をされているようですね。(ついでに、Rubyの文字列オブジェクトが可変が文字列オブジェクトだということをすっかり忘れていました・・・)

    ただ、オブジェクト指向言語でオブジェクト指向で書くと自然にgetだのaddだの状態変更をメソッド名で分かりやすく書く習慣があるので、mutableなメソッドだと宣言する必要性を感じたことがないです。StringBuilderなんかの例は典型的にmutableなのが分かるとおもいます。

    破壊的代入の件は蛇足でした。

    キャンセル

+1

Haskellだとそういった破壊的な関数はunsafeをつけるようです。

え、純粋関数型言語であるHaskellに破壊的なものなんてないだろうって?

そ、そこは速度を無理矢理上げるための大人の事情って事で必要みたいなんです。遅延評価と最適化によっていつ評価されるのかわからないドキドキもんらしいですけどね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る