Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

ロバストネス原則でRubyコードを簡素化する

私はもともと、私のお気に入りのRuby本の1つであるConfidentRubyからこれらのアイデアの多くを学びました。この投稿が気に入ったら、それを購入してすべてを読む必要があります。 そうがあります そこにはたくさんの良いものがあります。

current_user メソッドはUserを返します 、ユーザーがなく、nilを返す場合を除きます。 検索 メソッドはArrayを返します 結果が1つしかない場合を除き、代わりにその結果だけを返します。合理的なようですよね?たぶん便利です!

しかしすぐに、これらの決定により、コードが山のようなifステートメントの下に埋もれてしまいます。 多分それはifkind_of?の束です いたるところに振りかけた。または、どこでもゼロをチェックする必要があると感じるかもしれません。 さらに悪いことに、 NoMethodError ■新機能を出荷するたびに表示され始めます。別の修正プログラムの時間だと思います!

ただし、これを防ぐ方法はありますが、必要なのは少し思慮深いことだけです。

ロバストネス原則

コンピューティングには、次のような原則があります。

自分の行動を保守的にし、他人から受け入れることを寛大にします。

この原則をRubyメソッドに適用できます。作成するメソッドは、妥当な入力を受け入れ、一貫した出力を返す必要があります。

最後の部分に焦点を当てる:誰かがあなたが書いたメソッドを呼び出すとき、彼らはそのメソッドが何を返すかを正確に知っている必要があります。

出力についてよく考えてください

Rails2.1のActiveRecord::Errors#onの実装を見てください :

# File activerecord/lib/active_record/validations.rb, line 212
def on(attribute)
  attribute = attribute.to_s
  return nil unless @errors.has_key?(attribute)
  errors = @errors[attribute].map(&:to_s)
  errors.size == 1 ? errors.first : errors
end

呼び出されると、これは Arrayのいずれかを返す可能性があります Stringの s、 String 、または nil 。処理しているオブジェクトのタイプを把握するのは、呼び出し元の責任です。 これは悪い考えです:

  • 呼び出し元は、目障りな型チェックを使用して独自のコードを混乱させる必要があります。

  • 発信者は多くのを知っている必要があります 呼び出しているメソッドについて。少なくとも、メソッドが返す可能性のあるすべてのタイプのオブジェクトと、各タイプがいつ返される可能性があるかを知る必要があります。

  • テストするエッジケースがさらにあります。コードが想定どおりに機能していることを確信したい場合は、3つのシナリオすべてを試してみる必要があります。

メソッドは、返されるものについて一貫している必要があります。 通常、 Arrayを返す場合 、常にするために必要なことを行います Arrayを返します 。通常、 Userを返す場合 、ただしnilを返す場合もありますが、Null Userオブジェクトを作成して、それを返すことができます。 nilの代わりに。

厳しくない場合もあります。「Taggableを含むものを返します。 モジュール」。より一般的にすることができます:「 idで何かを返すつもりです およびname 属性。」重要なのは一貫性と、発信者が何を期待できるかを確実に理解することです。

jQueryは興味深い例です。ほとんどのjQueryメソッドは、同じ種類の Arrayを返します -オブジェクトのように。このため、jQueryのメソッドは非常に構成可能であり、1行のコードで膨大な量の作業を行うことができます。

ご参考までに、Railsはそれ以降のバージョンでそのメソッドを修正しました:

# File activemodel/lib/active_model/errors.rb, line 133
def [](attribute)
  get(attribute.to_sym) || set(attribute.to_sym, [])
end

これで、常に Arrayが返されます 。彼らにとってはよりシンプルで、私たちにとってはよりシンプルです。

不整合を解消する

次回、「 Array」を返すことに気付いたとき またはnil 」、 Arrayを返すだけです 。コードベースを調べて、 kind_of?を使用している場所を確認してください およびrespond_to? 。そのコードによって呼び出されたメソッドをリファクタリングして、単一の型を返すことができるかどうかを確認してください。

そして、戻り値についてあなたが作ることができる仮定があなたのプロジェクト全体に波及し、あなたの近くのすべてのコードを単純化するのを見てください。


  1. RubyでN-Queensの問題を解決する

    N-Queensは、 N*NボードにN個のクイーンを配置する必要がある興味深いコーディングチャレンジです。 。 次のようになります: 女王はすべての方向に移動できます: 垂直 水平 対角線 解決策(多くの場合があります)は、すべてのクイーンをボードに配置する必要があります。 &すべての女王は他のすべての女王の手の届かないところにいる必要があります。 この記事では、私がどのようにして解決策を思いついたのかを学びます。 計画 この種の課題を解決するときは、まず、計画を平易な英語で書き留めることから始めるのがよいでしょう。 これは、問題が何であるか、およびそれを解決するための手

  2. 基本的なOOP原則を使用してRubyコードを劇的に改善する方法

    最も重要なオブジェクト指向の原則の2つは、凝集度と結合度です。 結束 クラス内のすべてのメソッド間の関係についてです。それらは同じインスタンス変数とパラメータのセットを使用しており、すべてが同じ目標に向かって協力しています ?それとも、すべての方法が互いに分離していると感じますか? カップリング クラスが他のクラスにどの程度依存しているか、システムの他の部分にどの程度「結びついている」か、そしてこのクラスを単独で使用できるかどうかです。 これらの概念は両方とも、特定のレンズのセットを通してコードベースのすべてのクラスを確認するのに役立ちます。これらのレンズは、クラスのデザインがどれ