2010-05-07 21 views
22

¿El siguiente método es puro? Yo diría que sí, ya que de todos modos no cambia la clase actual, por lo tanto, todo lo que ahora podemos "ver" en la clase, antes de ejecutar este método, seguirá siendo exactamente el mismo después. ¿Estoy en lo correcto?Pregunta sobre los métodos [Puros]

class Set { 
    ... 
    public ISet<T> UnionWith(ISet<T> set) { 
     ISet<T> unionSet = ... 

     foreach (Element element in this) { 
      unionSet.Add(element); 
     } 

     foreach (Element element in set) { 
      unionSet.Add(element); 
     } 

     return unionSet; 
    } 
} 
+0

Quizás esté buscando el término * idempotent *? –

+0

Hmmm ... en realidad no. –

+0

Tenga en cuenta que (conceptualmente) es importante tener en cuenta su nivel de abstracción al pensar si una función es pura. De hecho, es puramente objetiva, ya que no cambia el estado de ningún objeto presente (excepto el nuevo), pero no es puramente del sistema: asigna memoria, por lo que cambia el estado del sistema. – Kos

Respuesta

31

Si por [Pure] que la media rotuladas con el atributo de PureSystem.Diagnostics.Contracts, la documentación dice:

métodos puros no hacen ningún cambios de estado visibles.

Como su método parece no hacer ningún cambio de estado visible (es decir, no tiene efectos secundarios), calificaría para el atributo [Pure].

+1

¿Hay alguna definición de "puro" a la que su método no se ajuste, de todos modos? Hasta donde puedo ver, también es matemáticamente puro: siempre producirá el mismo resultado con la misma entrada ('esto 'contando como entrada), y no cambiará el estado del sistema en general de ninguna manera. –

+1

Pavel: algunas definiciones de "puro" requieren que las entradas sean inmutables. Considere una función de envoltura que memoriza una función de entrada si es pura. Si el Conjunto puede cambiar sin que el envoltorio lo sepa, podría decirse que UnionWith no es "lo suficientemente puro" para memorizar con un contenedor. – Gabe

+0

Hubo justo en el momento en que formulé la pregunta alguna respuesta diciendo que no era así, usando una definición pura diferente a la de C# 's Contracts Code. Pero su autor más tarde lo eliminó. La idea era que si en diferentes momentos pasas el mismo ISet a mi clase, como los elementos de mi clase pueden ser diferentes en diferentes momentos, obtienes diferentes salidas, por lo que tu función no es pura. http://en.wikipedia.org/wiki/Pure_function –