คุณรู้ว่าอยากทำอะไร แตโค้ดไม่ร่วมมือ อาจ 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!