Belki de bu komut-sorgu ayırma ilkesinden kaynaklanmaktadır?
CQS, yan etkileri olan veya olmayan (yani nesneyi değiştiren) nesne yöntemleri arasında bariz bir ayrım yarattığı için OO ve fonksiyonel programlama stillerinin kesişme noktasında popüler olma eğilimindedir. CQS'yi değişken atamalara uygulamak, her zamankinden daha ileri götürür, ancak aynı fikir geçerlidir.
CQS yararlıdır neden kısa bir gösterimidir: bir hipotetik hibrid F / OO dili göz önünde List
yöntemleri vardır sınıfı Sort
, Append
, First
ve Length
. Zorunlu OO tarzında, şöyle bir işlev yazmak isteyebilir:
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()
Daha işlevsel bir tarzda ise, şunun gibi bir şey yazılması daha olasıdır:
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()
Bunlar aynı şeyi yapmaya çalışıyor gibi görünüyor , ancak ikisinden biri yanlış ve yöntemlerin davranışları hakkında daha fazla bilgi sahibi olmadan hangisi olduğunu bilemiyoruz.
Bununla birlikte, CQS'yi kullanarak , listeyi değiştirir Append
ve Sort
değiştirirlerse, birim türünü döndürmeleri gerektiği konusunda ısrarcı oluruz , böylece yapmamamız gerektiğinde ikinci formu kullanarak hatalar oluşturmamızı engelleriz. Yan etkilerin varlığı bu nedenle yöntem imzasında da örtük hale gelir.