È meglio accettare un dizionario / tabella o argomenti in una funzione?

3

In Lua, posso creare un oggetto in questo modo:

local foo = Foo.new({10, 10}, 3, right)

o così:

local foo = Foo.new({
    pos = {10, 10},
    len = 3,
    direction = "right"
})

Il primo è più compatto, mentre il secondo è più comprensibile e flessibile.

Quale è generalmente considerata la forma migliore di accettare argomenti?

    
posta Lawful Lazy 09.12.2016 - 20:18
fonte

1 risposta

3

Lua usa il passaggio di parametri posizionali. Quindi non esiste un modo "naturale" per passare argomenti con nome . Puoi simularli girando questo:

--invalid code
rename(old="temp.lua", new="temp1.lua") 

in questo:

rename{old="temp.lua", new="temp1.lua"}

utilizzando questo:

function rename (arg)
  return os.rename(arg.old, arg.new)
end

Più in generale questo è noto come introduce il refactoring di parametri . Stai facendo la stessa cosa nella tua domanda, ma sei semplicemente più formale insistendo sulla parentesi.

In base a arity (il numero di argomenti) e leggibilità questi argomenti con nome simulato possono diventare davvero molto utili. Se l'arity è piccolo e il significato dei valori è ovvio senza guardare la definizione della funzione, allora la forma compatta va bene. Personalmente non avevo idea di cosa sarebbe stato {10, 10}, 3, right fino a quando non ho guardato il tavolo. Anche se devo dire, un nome come Foo non aiuta. La leggibilità è molto più importante del salvataggio di righe di codice.

@whatsisname è corretto su alcuni argomenti obbligatori e facoltativi di separazione, ma questo non è richiesto né universale. Ad esempio:

function Window (options)
  -- check mandatory options
  if type(options.title) ~= "string" then
    error("no title")
  elseif type(options.width) ~= "number" then
    error("no width")
  elseif type(options.height) ~= "number" then
    error("no height")
  end

  -- everything else is optional
  _Window(options.title,
          options.x or 0,    -- default value
          options.y or 0,    -- default value
          options.width, options.height,
          options.background or "white",   -- default
          options.border      -- default is false (nil)
         )
end

Vedi lua.org

Una cosa da fare attenzione: rendere ogni membro del tavolo utilizzato qualcosa di facile da individuare. Non seppellirne uno da qualche parte dove è facile non vederlo. Un'altra ragione per le funzioni brevi è buona.

    
risposta data 09.12.2016 - 21:47
fonte

Leggi altre domande sui tag