Ebook Studio

Topic 10

Topic 10

โค้ด Ruby ใช้ร่วมจากโฟลเดอร์ en/ ของต้นฉบับ เพื่อให้สองภาษาผูกกับชุดทดสอบเดียวกัน

ภาพรวม

ทำไมหัวข้อนี้จึงสำคัญ

หัวข้อนี้สอนการพัฒนาแบบแตกเป็นรอบสั้น ๆ ที่ทดสอบได้ แทนที่จะมองเป็นงานชิ้นเดียวว่า "สร้างทั้งเกมให้เสร็จ" Rock-paper-scissors ถูกเลือกมาเพราะ domain มันตั้งใจให้ง่าย พอที่จะเปิดพื้นที่ให้เราคุยเรื่องกติกา การตัดสินผลหนึ่งรอบ การเก็บคะแนน และ dependency injection ได้ชัด

สิ่งที่ผมอยากให้คุณทำได้เมื่อจบหัวข้อนี้

เมื่อจบหัวข้อนี้ คุณควรจะ:

จุดที่ผมใช้ดูความเข้าใจ

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

โน้ตสั้น

เกมเล็ก ๆ มีประโยชน์ตรงที่กติกาเข้าใจง่าย ผู้เรียนจึงเอาความสนใจไปไว้ที่การตัดสินใจด้าน การออกแบบได้เต็มที่:

หัวข้อนี้ไม่ได้ทำขึ้นเพื่อสร้างเกมที่หวือหวา แต่มันมีไว้เพื่อฝึกการพัฒนาแบบค่อยเป็นค่อยไป ผมอยากให้ผู้เรียนรู้สึกว่าการสร้างทีละชิ้นเล็ก ๆ ช่วยให้ปัญหาง่ายขึ้นจริง

จุดที่ Ruby ทำได้ดีในหัวข้อนี้:

จุดที่ต้องระวังในหัวข้อนี้:

คำถามชวนคิด:

ตัวอย่างแบบลงมือดู

Example 1: แยกกติกาออกมาก่อน flow ของเกม

มันล่อตาล่อใจมากที่จะเขียน logic แบบ if/else ของเกมทั้งหมดไว้ใน object หลักเลย แต่ในเชิงการสอน วิธีที่ดีกว่าคือแยกกติกาออกมาก่อน:

rules . winner ( "rock" , "scissors" ) # => :player_one worked_examples.md ruby เหตุผลที่ตัวอย่างนี้มีประโยชน์:

Example 2: ทดสอบ game loop แบบกำหนดผลได้

เกมมักมีความสุ่ม แต่ tests ไม่ควรสุ่มไปด้วย

ถ้าท่าของคอมพิวเตอร์มาจาก object ร่วมงานที่ส่งเข้ามาจากภายนอก ชุดทดสอบก็จะควบคุมลำดับได้:

source = instance_double ( "MoveSource" ) allow ( source ). to receive (: next_move ). and_return ( "scissors" , "rock" ) worked_examples.md ruby นี่คือบทเรียนด้านการออกแบบที่สำคัญที่สุดของหัวข้อนี้: แยกพฤติกรรมที่ไม่นิ่งออกไป