For instance, wouldn't something like: shop.Sell(15)Notebooks (although looking pretty unusual) be more readable than shop.SellNotebooks(15)?
No, non lo sarebbe.
I programmatori non leggono il codice come inglese; lo leggono come codice. Questo:
shop.SellNotebooks(15);
è molto semplice; significa "Chiama il metodo SellNotebooks
sull'oggetto shop
, passandolo a 15 come parametro". Questo:
shop.Sell(15)Notebooks
significa ... Beh, cosa significa esattamente? Sembra chiamare il metodo Sell
sull'oggetto shop
, ma cosa succede dopo?
Nella maggior parte dei linguaggi orientati agli oggetti single-dispatch in uso comune oggi (come Java e C ++), la solita notazione è noun-verb. Cioè, si prende un oggetto (un nome) e si applica un verbo ad esso (un metodo). Fare le cose in questo modo fornisce una notazione coerente e facilmente comprensibile.
Ci sono stati un certo numero di tentativi per rendere tali costrutti più simili all'inglese, il più notevole dei quali è l'interfaccia fluente. Quando funziona bene, è una gioia:
var query = translations
.Where (t => t.Key.Contains("a"))
.OrderBy (t => t.Value.Length)
.Select (t => t.Value.ToUpper());
o
var sizer = Sizer.FromImage(inputImage)
.ToLocation(outputImage)
.ReduceByPercent(50)
.OutputImageFormat(ImageFormat.Jpeg);
Quando non lo fa, beh, non così tanto:
money.Add(20).Dollars().And().TransferTo().MyCheckingAccount().In(3).Days();
In che modo funziona esattamente sotto il cofano? Le interfacce fluenti sono come molte altre grandi idee nell'informatica; puoi avere troppe cose buone.
Tuttavia, tutti lo capiscono:
object.Verb(data);
E non devi necessariamente strizzare gli occhi per capire cosa fa.