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

วิธีปรับปรุงการออกแบบซอฟต์แวร์ของคุณด้วยโค้ดที่รู้สึกผิด

คุณรู้ว่าสิ่งที่คุณต้องการ ที่ต้องทำ แต่รหัสของคุณไม่ได้ให้ความร่วมมือ อาจมีระดับการเยื้องมากเกินไปหรือเชื่อมโยงวิธีการครึ่งโหลหรือดูไม่สมมาตร ไม่ว่ามันจะเป็นอะไรก็ตาม คุณสามารถเพิกเฉยได้ – ฉันหมายความว่าคุณมีงานในมือที่เต็มไปด้วยคุณสมบัติที่คุณยังต้องการเขียน และนั่นไม่ใช่นั่นจริงๆ แย่. แต่นั่นอาจเป็นความผิดพลาด:รหัสของคุณพยายามบอกบางสิ่งกับคุณ และคุณไม่ต้องการที่จะพลาดมัน

หากคุณสามารถเรียนรู้ที่จะรู้ว่าโค้ดของคุณรู้สึกแปลกๆ เมื่อไหร่ คุณก็จะพัฒนาทักษะการออกแบบซอฟต์แวร์ของคุณได้อย่างรวดเร็วและอย่างมาก . สัญชาตญาณนี้สร้างได้ยาก เนื่องจากมาจากประสบการณ์ การให้คำปรึกษา และการตรวจสอบโค้ด แต่คุณสามารถขอความช่วยเหลือจากห้องสมุดที่ใช้น้ำส้มสายชูแบบวากยสัมพันธ์เพื่อทำให้โค้ดแย่ๆ รู้สึกแย่ได้

น้ำส้มสายชูวากยสัมพันธ์มีหน้าตาเป็นอย่างไร

ต่อไปนี้คือตัวอย่างการใช้น้ำส้มสายชูแบบวากยสัมพันธ์โดยใช้ minitest/mock ซึ่งเป็นไลบรารีการเยาะเย้ยและการขัดถูขนาดเล็กที่มาพร้อมกับ 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! วิธีการใน Cart ถูก stubbed ดังนั้นการทดสอบจะไม่กระทบกับตัวประมวลผลการชำระเงิน ไวยากรณ์ของบล็อกนั้นดีสำหรับทำให้แน่ใจว่าคุณ stub เฉพาะเมื่อคุณต้องการเท่านั้น แต่จะเกิดอะไรขึ้นเมื่อคุณต้องการนำวิธีการต่างๆ มาใช้

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

เอ่อ. นั่นเป็นการเยื้องมากมาย และนั่นเป็นเพียงการทดสอบครั้งเดียว – คุณสามารถจินตนาการว่าโค้ดนี้ถูกทำซ้ำในการทดสอบอื่นๆ มากมาย

คุณทำได้ ห่อการซ้อนทั้งหมดนี้เป็นวิธีตัวช่วยทดสอบ แต่ถ้าคุณจริงๆ ฟังโค้ดของคุณ มันกำลังบอกคุณว่าคุณควรหาวิธีที่ดีกว่านี้ อาจถึงเวลาลองใช้ 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 ที่สามารถนำไปใช้ในที่อื่นๆ ได้มากมาย คุณสามารถใช้มันในโหมดการพัฒนาได้ หากคุณไม่ต้องการชนกับเซิร์ฟเวอร์จริง!

โค้ดที่แย่น่าจะทำให้รู้สึกแย่

ด้วยการใช้ไลบรารีที่มีความคิดเห็นซึ่งทำให้โค้ดไม่ถูกต้องชัดเจน คุณจะเริ่มสังเกตเห็นโค้ดที่ไม่ดีได้เร็วและน่าเชื่อถือมากขึ้น และนั่นจะทำให้โค้ดในอนาคตของคุณสะอาดขึ้น อ่านง่ายขึ้น และทำงานด้วยความเจ็บปวดน้อยลง

ห้องสมุดความคิดเห็นที่คุณชื่นชอบคืออะไร และห้องสมุดเหล่านี้จะช่วยคุณค้นหาและแก้ไขโค้ดที่ไม่ถูกต้องได้อย่างไร แจ้งให้เราทราบในความคิดเห็นด้านล่าง!