eag*_*tom 6 conventions multiple-dispatch julia
我有一个需要 DateTime 参数的函数。一种可能性是用户可能提供 ZonedDateTime 参数。据我所知,有三种可能的方法可以在不破坏的情况下捕获此问题:
function ofdatetime(dt::AbstractDateTime)
if dt::ZonedDateTime
dt = DateTime(dt, UTC)
end
...
end
Run Code Online (Sandbox Code Playgroud)
function ofdatetime(dt::DateTime)
...
end
function ofdatetime(dt::ZonedDateTime)
dt = DateTime(dt, UTC)
return ofdatetime(dt)
end
Run Code Online (Sandbox Code Playgroud)
function ofdatetime(dt::DateTime)
...
end
function ofdatetime(dt::ZonedDateTime)
dt = DateTime(dt, UTC)
...
end
Run Code Online (Sandbox Code Playgroud)
当然,当不同的参数类型意味着该函数实际上执行不同的操作(多重分派的全部意义)时,这并不适用,但这只是一个玩具示例。我想知道这些情况下的最佳做法是什么?它不必专门与时区有关,这只是我正在使用的示例。也许一个相关的问题是“Julia 如何在幕后进行多次调度?” if... else即参数是通过/块之类的东西分派给相关方法的switch... case,还是比这更聪明?
注释中的答案是正确的,理想情况下,您编写的ofdatetime函数应使dt函数体内的所有操作都通用于任何AbstractDateTime;DateTime在任何情况下,和之间的差异ZonedDateTime很重要,您可以在函数中的该点使用调度来处理细节。
如果做不到这一点,在您的问题中,通常2更3可取,因为对于其中任何一个,如果在编译时已知1类型,则可以省略分支。df在后两者中,就一般代码风格(“DRY”)而言,2可能比3您的示例中编写的更可取,但是如果您能够通过编写完全不同的函数体来避免类型转换,那么实际上3可能比您的示例具有更好的性能如果类型转换非常昂贵。
但总的来说,最好的方法是让大多数代码对任一类型保持通用,并且仅在最后可能的时刻分派。