Perché non è prassi comune per le lingue avere gli argomenti del metodo passati all'interno dei nomi dei metodi?

5

Perché non è una pratica comune per le lingue avere argomenti di metodo passati all'interno dei nomi dei metodi ?

Ad esempio, non sarebbe qualcosa di simile: shop.Sell(15)Notebooks (anche se sembra piuttosto insolito) essere più leggibile di shop.SellNotebooks(15) ?

Inoltre, questo potrebbe semplificare le API fluenti: invece di implementare interfacce aggiuntive per cose come money.Add(20).Dollars() potremmo semplicemente usare i metodi: money.Add(20)Dollars e così via.

    
posta bashis 30.11.2016 - 16:57
fonte

2 risposte

5

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?

Esecuzione nel regno dei nomi

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.

    
risposta data 30.11.2016 - 17:09
fonte
3

Ci sono un certo numero di lingue che hanno "selettori di parole chiave". In quelle lingue, gli argomenti vengono passati dopo i due punti all'interno del selettore di messaggi. Ad esempio, la seguente sintassi è valida in (almeno) Smalltalk, Self, Us, Korz, Fancy, Slate, Newspeak, Objective-C, Objective-C ++, Objective-Modula-2 ed eventualmente altri:

anArray at: 3 put: "Hello".

Questo pone la stringa "Hello" all'indice 3 di anArray .

Non è abbastanza quello che vuoi, però, dal momento che consente solo argomenti dopo le parti del selettore, non prima.

I conosci ho visto un linguaggio che permette ciò che vuoi da qualche parte, ma non posso per la vita di me ricordare il nome.

Le risposte alla domanda correlata menzionata nei commenti sopra elencano un paio di linguaggi che supportano la tua sintassi esatta: Agda, Inform7, TeX, Gherkin, linguaggio di scripting di robot.

    
risposta data 30.11.2016 - 21:35
fonte

Leggi altre domande sui tag