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

間違っていると感じるコードでソフトウェア設計を改善する方法

あなたはあなたが欲しいを知っています やるべきことですが、あなたのコードは単に協力していません。たぶん、インデントのレベルが多すぎるか、半ダースのメソッドをチェーンしているか、非対称に見えます。それが何であれ、何かが気分が悪くなります。あなたはそれを無視することができます-つまり、あなたはまだ書きたい機能でいっぱいのバックログを持っています、そしてそれは実際にはではありません 悪い。しかし、それは間違いです。あなたのコードはあなたに何かを伝えようとしているので、あなたはそれを見逃したくないのです。

コードが奇妙に感じられる時期を知ることができれば、ソフトウェア設計スキルを迅速かつ大幅に向上させることができます 。この直感は、経験、メンターシップ、およびコードレビューから得られるため、構築するのは困難です。しかし、構文ビネガーを使用して悪いコードを気分を悪くするライブラリからいくつかの助けを得ることができます。

構文酢はどのように見えますか?

これは、Rubyに同梱されている小さなモックおよびスタブライブラリであるminitest/mockを使用した構文酢の例です。

require 'minitest/mock'

class CartTest < MiniTest::Test
  def test_error_message_set_on_charge_failure
    cart = Cart.new(items)
    cart.stub(:charge!, false) do
      cart.checkout!
      assert_equal "The credit card could not be charged", cart.credit_card_error
    end
  end
end

テストを実行すると、charge! Cartのメソッド スタブされているため、テストは支払い処理業者にヒットしません。ブロック構文は、必要なときにだけスタブするようにするのに適しています。しかし、たくさんのメソッドをスタブしたい場合はどうなりますか?

require 'minitest/mock'

class CartTest < MiniTest::Test
  def test_error_message_set_on_charge_failure
    payment_processor = PaymentProcessor.new
    cart = Cart.new(items, processor: payment_processor)

    payment_processor.stub(:charge!, false) do
      payment_processor.stub(:login!, true) do
        payment_processor.stub(:logout!, true) do
          cart.checkout!
          assert_equal "The credit card could not be charged", cart.credit_card_error
        end
      end
    end
  end
end

ええ。それはたくさんのインデントです。そして、それは1つのテストだけです。このコードが、他の多くのテストで繰り返されていることを想像できます。

あなたはできた このすべてのネストをテストヘルパーメソッドにラップします。しかし、あなたが本当に コードを聞くと、より良い方法を見つける必要があることがわかります。代わりにテストダブルの使用を検討する時期かもしれません:

class TestPaymentProcessor < PaymentProcessor
  def login!(account_id, key)
    true
  end

  def charge!(amount, credit_card)
    credit_card.can_be_charged?
  end

  def logout!
    true
  end
end

class CartTest < MiniTest::Test
  def test_error_message_set_on_charge_failure
    test_payment_processor = TestPaymentProcessor.new
    cart = Cart.new(items, processor: test_payment_processor)
    
    cart.credit_card = failing_credit_card
    cart.checkout!
    assert_equal "The credit card could not be charged", cart.credit_card_error
  end
end

これで、テストが読みやすくなりました。さらに、TestPaymentProcessorがあります それは他の多くの場所で使用することができます。実サーバーにアクセスしたくない場合は、開発モードで使用することもできます。

悪いコードは気分が悪いはずです

不正なコードを明らかにする意見のあるライブラリを使用することで、不正なコードにはるかに速く、より確実に気付くようになります。これにより、将来のコードがよりクリーンになり、読みやすくなり、操作の手間が軽減されます。

あなたの好きな意見のあるライブラリは何ですか、そしてそれらはあなたが悪いコードを見つけて修正するのをどのように助けますか?以下のコメントで教えてください!


  1. 確認コードを使用して Gmail のパスワードをリセットする方法

    Gmail パスワードのリセットをお勧めするいくつかの理由 、セキュリティ攻撃の疑いから、新たに発見されたプライバシーへの欲求まで、さまざまです。特別な理由がなくても、アカウントを安全に保つために、通常は数か月ごとにパスワードを変更することをお勧めします。パスワードを忘れた場合は、Gmail のパスワードを変更する理由の 1 つとしてパスワードを取得する必要がある場合があります。パスワードを回復する手順は、パスワードを変更する手順とは多少異なります。 Gmail のパスワードをリセットする手順については、以下をご覧ください。調べてみましょう。 Gmail アカウントを安全に保つためのヒント

  2. ウェブ デザインを改善する - HTML と CSS コードを整理する

    Web 開発には、テキスト エディターによる方法と GUI エディターによる方法の 2 つの方法があります。最初の方法は、主に、コードを理解し、必要なものを知っており、Web ページを作成するために視覚補助を必要としない、より高度な開発者を対象としています。彼らは、vim、emacs、Notepad++、Kate、またはその他のテキスト エディターなどのプログラムで作業し、作業の最終結果を確認する必要があると感じたときに、単に Web ページをブラウザーにロードします。このアプローチは最小限で効率的ですが、難しいものです。 2 番目の方法は、ほとんどの人が行っている方法です。通常はコ