Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ปรับปรุง Software Design โดยตรวจจับและแก้ไขโค้ดที่รู้สึกแปลก

คุณรู้ว่าอยากทำอะไร แตโค้ดไม่ร่วมมือ อาจ indentation เยอะเกิน หรือ chain methods ครึ่งโหล หรือดู asymmetrical 无论是什么 感觉不对勁 คุณอาจ ignore - มี backlog features เยอะ และมันไม่ แย่ มาก แตนั่นคือความผิด: โค้ดพยายามบอกอะไรสักอย่าง อย่าพลาดมัน

ถ้าเรียนรู้รู้สึกตอนโค้ดแปลก คุณจะปรับปรุง software design skills เร็วและชัด intuition นี้ยากสร้าง มาจาก experience, mentorship, code reviews แตช่วยจาก libraries ที่ใช้ syntactic vinegar ทำให้ bad code รู้สึกแย่

Syntactic vinegar 長什麼樣?

ตัวอย่าง syntactic vinegar 用 minitest/mock mocking/stubbing library เล็กมากับ Ruby:

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! method บน Cart ถูก stub ทดสอบไม่ hit payment processor Block syntax สวยสำหรับ stub แค่ตอนที่อยาก แต่ถ้าอยาก stub methods เยอะ?

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

อืม indentation เยอะ แค่ทดสอบเดียว ตัวเองในหลายทดสอบ

อาจ wrap nesting ทั้งหมดใน test helper method แตถ้า ฟังโค้ดจริง มันบอกว่าควรหาวิธีดีกว่า เวลาดู Test Double:

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 ใช้ที่อื่นได้ เหมือน development mode ถ้าไม่อยาก hit real server!

Bad code ควรรู้สึกแย่

用 opinionated libraries ที่ทำให้ bad code ชัดเจน คุณจะสังเกต bad code เร็วและน่าเชื่อถือมากขึ้น โค้ดอนาคตจะสะอาด อ่านง่าย และเจ็บน้อยลง

Opinionated libraries โปรดของคุณคืออะไร และช่วยหาและแก้ bad code ยังไง? บอกใน comments!