วิธีการแบบไม่มีพารามิเตอร์และว่างเปล่าใน Scala


10

ตอนนี้ฉันกำลังเรียน Scala ผ่าน Programming Scala (ที่ 2) ของ Odersky ฉันเกินบทที่ 10 ที่เขาเริ่มแนะนำวิธีการแบบไม่มีพารามิเตอร์และแบบไม่มีพารามิเตอร์ ฉันไม่สามารถเอาหัวไปรอบ ๆ มันได้

จนถึงตอนนี้สิ่งที่ฉันเข้าใจคือฉันควรใช้ parens ว่างถ้าวิธีการมีผลข้างเคียงและวิธีการแบบไม่มีพารามิเตอร์

ฉันไม่สามารถเข้าใจได้ว่าข้อได้เปรียบของอนุสัญญานี้คืออะไร ฉันอ่านโพสต์ใน Exchange Exchange แต่ตามจริงแล้วเมื่อโพสต์เริ่มพูดถึงหัวข้อนี้ในระดับลึกฉันก็หายไป

ฉันกำลังมองหาคำอธิบายง่ายๆเกี่ยวกับกรณีการใช้งานทั่วไปสำหรับคุณสมบัติภาษานี้และข้อดีที่จะช่วยให้ฉันเข้าใจดีขึ้นคืออะไร

scala 

คำตอบ:


14

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

คำตอบที่พบในความโปร่งใสอ้างอิง โดยพื้นฐานแล้วหากฟังก์ชั่นไม่มีผลข้างเคียงการเรียกใช้ฟังก์ชันสามารถถูกแทนที่ด้วยผลลัพธ์ได้โดยไม่ต้องเปลี่ยนลักษณะการทำงานของโปรแกรม

นั่นหมายถึงฟังก์ชั่นที่ไม่มีพารามิเตอร์หรือผลข้างเคียงเทียบเท่ากับการvalถือครองคืนค่าของฟังก์ชันนั้น เนื่องจากคุณสมบัตินี้เมื่อคลาสวิวัฒนาการขึ้นโปรแกรมเมอร์อาจสลับไปมาระหว่างการใช้valหรือการใช้ฟังก์ชั่นตามความสะดวกหรือประสิทธิภาพกำหนด

เนื่องจากคุณสามารถละเว้นวงเล็บว่าบางสิ่งบางอย่างรหัสหมายถึงการเรียกเช่นqueue.sizeไม่จำเป็นต้องรู้ว่ามิได้ดูแลถ้าเป็นฟังก์ชั่นหรือsize valผู้ดำเนินการของQueueชั้นเรียนจึงมีอิสระที่จะเปลี่ยนระหว่างสองโดยไม่ต้องเปลี่ยนรหัสการโทรใด ๆ (แม้ว่าฉันเชื่อว่ามันจะต้องคอมไพล์ใหม่) มันรักษาเสถียรภาพส่วนต่อประสานสาธารณะของชั้นเรียน ตัวอย่างเช่นคุณอาจเริ่มต้นqueue.sizeด้วยการโทรหาsizeผู้ที่มีพื้นฐานListซึ่งเป็นไปO(n)ได้แล้วเปลี่ยนsizeเป็นvalเหตุผลที่มีประสิทธิภาพ

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


6

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

จากGuide Style ของ Scala เกี่ยวกับวิธีการอุทธรณ์:

Scala อนุญาตให้ละเว้นวงเล็บในเมธอด arity-0 (ไม่มีอาร์กิวเมนต์):

reply() 

// is the same as 

reply

อย่างไรก็ตามควรใช้ไวยากรณ์นี้เฉพาะเมื่อวิธีการดังกล่าวไม่มีผลข้างเคียง (ใช้งานได้จริง) ในคำอื่น ๆ ก็จะเป็นที่ยอมรับของวงเล็บงดเมื่อโทรแต่ไม่ได้เมื่อโทรqueue.sizeprintln()

การปฏิบัติตามอนุสัญญานี้อย่างเคร่งศาสนาจะช่วยปรับปรุงความสามารถในการอ่านรหัสได้อย่างมากและจะทำให้ง่ายต่อการเข้าใจได้อย่างรวดเร็วยิ่งขึ้นเกี่ยวกับการดำเนินการขั้นพื้นฐานที่สุดของวิธีการใดก็ตาม ต้านทานการกระตุ้นให้ละเว้นการใส่เครื่องหมายวงเล็บเพียงเพื่อบันทึกตัวละครสองตัว!

ใน. NET การประชุมคือการใช้วิธีการเมื่อโค้ดสามารถใช้เวลาชั่วขณะในการรัน (พูดนานกว่า 50ms) และคุณสมบัติ (เมธอด paren เปล่า ๆ ) เมื่อมันไม่ทำงาน (เช่นเป็นการค้นหาแบบง่าย)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.