Ebook Studio

Topic 1

Topic 1

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

ภาพรวม

ผมเริ่มคอร์สด้วยการขยับเล็ก ๆ อย่างหนึ่ง ซึ่งดูเล็กในรูป แต่ส่งผลไกลมากในทางปฏิบัติ: โค้ด Ruby มักสร้างจาก expressions มากกว่าพิธีรีตองรอบนอก และ method หนึ่งก็มักพูด สิ่งที่มันต้องการทำได้ตรงขึ้น ขณะเดียวกัน test ก็สามารถบอกพฤติกรรมของโค้ดได้ก่อนที่ ตัวโค้ดจริงจะมีอยู่เสียอีก

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

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

เมื่อจบหัวข้อนี้ ผมอยากให้คุณ:

สิ่งที่คุณควรมีก่อนเริ่ม

คุณต้องมีพื้นฐานแค่ไม่กี่อย่าง:

ถ้าคุณไม่ได้มาจาก Java ก็ไม่เป็นไร การเทียบกับ Java ยังช่วยได้อยู่ และแบบฝึกหัดก็เล็ก พอที่จะเรียนรู้จากตัวมันเองได้

สิ่งที่ผมอยากให้คุณสังเกต

คณิตศาสตร์ในหัวข้อนี้ไม่ใช่ประเด็นหลัก ผมใช้โจทย์เลขคณิตง่าย ๆ ก็เพราะไม่อยากให้ domain มาบดบังเรื่องการออกแบบ

สิ่งที่ผมอยากให้คุณเห็นจริง ๆ คือ:

ถ้าเวอร์ชันของ Ruby สั้นกว่าเวอร์ชันของ Java นั่นก็ดี แต่ถ้ามันทั้งสั้นและชัดขึ้นพร้อมกัน นั่นแหละคือสิ่งที่ผมอยากได้จริง

โน้ตสั้น

สิ่งแรกที่ผมอยากให้คุณจับความรู้สึกของ Ruby ให้ได้ คือ method มัก return ค่าของ expression สุดท้าย[^return] ฟังดูเหมือนกฎเล็ก ๆ แต่จริง ๆ แล้วมันเปลี่ยนบุคลิกของ โค้ดไปมาก

ใน Java แม้ method เล็ก ๆ ก็มักมีพิธีรีตองล้อมอยู่: การประกาศชนิดข้อมูล, การเขียน return แบบตรง ๆ และโครงประกอบอีกเล็กน้อยรอบไอเดียหลัก แต่ Ruby เปิด ทางให้ method เล็ก ๆ พูดไอเดียนั้นออกมาได้ตรงกว่าเดิม

def double ( n ) n * 2 end shortnote.md ruby ผมไม่ได้ยก method นี้มาเพราะมันฉลาดแพรวพราว ผมยกมันมาเพราะมันตรงดี Ruby มักอ่าน ดีที่สุดตอนที่พิธีรีตองค่อย ๆ หลุดออกไป แล้วส่วนที่แบกความหมายยังมองเห็นอยู่ชัด ๆ

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

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

ระหว่างที่คุณทำแบบฝึกหัด ผมอยากให้คุณพกคำถามนี้ไว้ตลอด: อะไรในเวอร์ชันของ Ruby ทำให้ความหมายชัดขึ้นจริง และอะไรแค่ทำให้โค้ดสั้นลง

[^return]: เวลาผมพูดคำว่า return ในที่นี้ ผมไม่ได้หมายถึงแปลตรงตัวว่า "คืน" อย่าง เดียว แต่หมายถึงการส่งค่ากลับไปให้ส่วนที่เรียก method นั้น เพราะฉะนั้นคำถามสำคัญไม่ใช่ แค่ "มัน return ไหม" แต่คือ "return ค่าอะไร", "return กลับไปให้ใคร" และ "เราจำเป็นต้องเขียน return ทุกครั้งหรือไม่" ใน Ruby คำตอบข้อสุดท้ายมักเป็น "ไม่" เพราะโดยปกติ method จะ return ค่า expression สุดท้ายให้อัตโนมัติ

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