อาจเป็นเพราะหลักการแยกคำสั่งคิวรี ?
CQS มีแนวโน้มที่จะได้รับความนิยมที่จุดตัดของ OO และรูปแบบการเขียนโปรแกรมเชิงฟังก์ชันเนื่องจากสร้างความแตกต่างที่ชัดเจนระหว่างวิธีการวัตถุที่ทำหรือไม่มีผลข้างเคียง (เช่นที่เปลี่ยนแปลงวัตถุ) การนำ CQS ไปใช้กับการกำหนดตัวแปรจะใช้เวลามากกว่าปกติ แต่ก็ใช้แนวคิดเดียวกัน
ภาพประกอบสั้น ๆ ว่าทำไม CQS เป็นประโยชน์: พิจารณาสมมุติไฮบริดภาษา F / OO กับList
ชั้นเรียนที่มีวิธีการSort
, Append
, และFirst
Length
ในรูปแบบ OO ที่จำเป็นเราอาจต้องการเขียนฟังก์ชันเช่นนี้:
func foo(x):
var list = new List(4, -2, 3, 1)
list.Append(x)
list.Sort()
# list now holds a sorted, five-element list
var smallest = list.First()
return smallest + list.Length()
ในขณะที่รูปแบบการใช้งานมีแนวโน้มที่จะเขียนสิ่งนี้มากกว่า:
func bar(x):
var list = new List(4, -2, 3, 1)
var smallest = list.Append(x).Sort().First()
# list still holds an unsorted, four-element list
return smallest + list.Length()
สิ่งเหล่านี้ดูเหมือนจะพยายามทำในสิ่งเดียวกัน แต่เห็นได้ชัดว่าหนึ่งในสองอย่างนั้นไม่ถูกต้องและโดยไม่ทราบข้อมูลเพิ่มเติมเกี่ยวกับพฤติกรรมของวิธีการเราไม่สามารถบอกได้ว่าวิธีใด
อย่างไรก็ตามการใช้ CQS เราจะยืนยันว่าหากAppend
และSort
เปลี่ยนแปลงรายการพวกเขาจะต้องส่งคืนประเภทหน่วยดังนั้นจึงป้องกันไม่ให้เราสร้างจุดบกพร่องโดยใช้รูปแบบที่สองเมื่อเราไม่ควร ดังนั้นการปรากฏตัวของผลข้างเคียงจึงกลายเป็นนัยในลายเซ็นของวิธีการด้วย