Digamos que tengo una clase de la Event
siguiente manera:
class Event {
private var attendees: [Person] = []
// Case 1
//*******
// Should I use a func…
func countOfAttendees() -> Int {
return attendees.count
}
// …or a var
var countOfAttendees: Int {
return attendees.count
}
// Case 2
//*******
// Should I use a func…
func countOfPaidAttendees() -> Int {
return attendees.filter({$0.hasPaid}).count
}
// …or a var
var countOfPaidAttendees: Int {
return attendees.filter({$0.hasPaid}).count
}
}
¿Es una buena práctica usar funciones o propiedades calculadas en los 2 casos indicados anteriormente?
functions
swift-language
Ashley Mills
fuente
fuente
Respuestas:
Siga el principio de acceso uniforme ,
Para mí, esto significa que no escribo funcs que no toman argumentos y devuelven un valor. Siempre uso propiedades calculadas. De esa manera, si más tarde decido cambiar la propiedad calculada en una propiedad almacenada, puedo hacerlo sin tener la necesidad de eliminar los parentes en todas partes de mi aplicación y sin tener un método "getter" separado que solo devuelva el valor de un propiedad, que parece un desperdicio bastante en mi humilde opinión.
Y si cambio una propiedad almacenada en una calculada, no tengo que agregar parens al final, y en todos los lugares donde se usa en la aplicación.
fuente
Diría que depende de la complejidad del cálculo frente a la frecuencia de uso.
O(1)
/*
, entonces use la propiedad calculada.O(N)+
/rare-use
, entonces use la función.O(N)+
/frequent-use
, piense si en el futuro podría decidir usar el almacenamiento en caché u otras técnicas "inteligentes" para compensar la complejidad, si es "sí", use la propiedad, si "no-no-no, es pesado", use la función .fuente
Recientemente comencé a aprender Kotlin y tienen una gran heurística sobre cuándo usar propiedades calculadas:
- https://kotlinlang.org/docs/reference/coding-conventions.html
fuente
En Swift, las funciones sin parámetros y propiedades calculadas tienen casi las mismas capacidades (puede haber una diferencia de que una función sin parámetro también es un cierre, mientras que una propiedad calculada no lo es).
La diferencia es semánticamente. Si su código realiza una acción y devuelve, por ejemplo, una descripción del resultado de esa acción, entonces usaría una función. Si su código calcula una propiedad pero desde el punto de vista del usuario, esta podría haber sido una propiedad almacenada, o tal vez una propiedad almacenada que requiere actualizar primero un valor almacenado en caché, entonces usaría una propiedad calculada.
Una gran diferencia: ¿qué sucede si llama a la función o la propiedad calculada dos veces? Para una propiedad calculada, espero que x = propiedad; y = propiedad tiene exactamente el mismo comportamiento que x = propiedad; y = x, excepto que podría funcionar un poco más lento. Para las funciones, no me sorprendería si el comportamiento fuera diferente.
fuente
Uso
countOfAttendees
ycountOfPaidAttendees()
.Una variable calculada es aquella que devuelve un valor calculado cada vez que se accede a ella. Es decir, no almacena un valor. Internamente se implementa como una función.
¿Cuál es la diferencia con una función?
Deberías usar una variable cuando
Razones irrelevantes para preferir una variable sobre una función
Recursos
De WWDC 2014 - 204 Novedades en Cocoa > 24:40 Cuándo usar una propiedad @
From Swift Style de Erica Sadun > Propiedades computadas versus métodos
Desde Kotlin convenciones de codificación> funciones vs propiedades . Ver la respuesta de Daniel arriba .
Otros recursos sin información relevante:
fuente
Yo usaría a
func
. La programación orientada a objetos funciona bien sin propiedades calculadas. Debido a que está recuperando un valor calculado / filtrado, algunos pueden argumentar que una propiedad calculada se siente bien. Pero aquí está mi queja, si haces eso, la legibilidad se ve afectada, porque se siente como un valor.En este contexto, no tendría sentido intentar asignar el valor calculado (y afortunadamente, el IDE nos ayuda a evitarlo), pero ¿qué sucede si intento asignar algo que se calcula pero que parece un valor?
Al usar func, la persona que llama sabe que no está tratando con un valor directamente:
Creo que si se trata de un objeto de comportamiento, debería verse como si se comportara en lugar de verse como una estructura de datos. Si su objeto es tonto y no tiene ningún comportamiento, ¿por qué intentar encapsularlo? En ese caso, también podría hacer que los asistentes sean públicos.
fuente