¿Por qué se adhieren a get-set y no el coche.de velocidad (a) y el coche.velocidad(55) respectivamente?

StackOverflow https://stackoverflow.com/questions/2051713

Pregunta

Aparte de inequívoca claridad, ¿por qué nos atenemos a:
car.getSpeed() y car.setSpeed(55)
cuando esto podría ser utilizado así :car.speed() y car.speed(55)

Sé que get() y set() son útiles para conservar los cambios en el miembro de datos manejable por mantener todo en un solo lugar.

También, obviamente, entiendo que car.speed() y car.speed(55) son los mismo la función, lo que hace esta mal, pero luego en PHP y también en Zend Framework, la misma acción se utiliza GET, POST, las devoluciones de datos.
En VB y C# hay "propiedades", y son utilizados por muchos, mucho a la repugnancia de los puristas que he escuchado, y hay cosas en Ruby como 5.times y .each, .to_i etc.
Y usted tiene sobrecarga de operadores, la herencia múltiple, las funciones virtuales en C++, ciertas combinaciones de lo que podría conducir a nadie frutos secos.

Quiero decir que hay muchos paradigmas y las formas en que se hacen las cosas que parece extraño que nadie ha probado la combinación particular que he mencionado.

En cuanto a mí, mi razón es que es corto y limpio para leer el código.
Estoy muy mal, un poco mal, es sólo impar y no se utiliza, o qué otra cosa?

Si todavía decide quedarse en lo correcto, yo podría utilizar car.speed() y car.setSpeed(55).
Es que mal de alguna manera (sólo omitiendo el "get" )?

Gracias por las explicaciones.

¿Fue útil?

Solución

Si llamara car.speed (), yo podría pensar que estoy diciendo el coche a la velocidad, en otras palabras, para aumentar la velocidad y romper el límite de velocidad. No es claramente una getter.

Algunos idiomas le permiten declarar objetos const, y luego se restringe sólo a llamar a las funciones que no modifican los datos del objeto. Por lo tanto, es necesario contar con funciones separadas para la modificación y las operaciones de lectura. Mientras que usted podría utilizar sobrecargas en Paramaters tener dos funciones, creo que sería confuso.

Además, cuando usted dice que es más claro para leer, puedo afirmar que tengo que hacer una mirada hacia el futuro para entender cómo leerlo:

car.speed()

leí "la velocidad del coche ..." y luego veo no hay un número así que revisar y que "obtener la velocidad del coche".

car.getSpeed()

leí "para este coche, conseguir una velocidad de"

car.setSpeed(55)

leí "para este coche, ajustar la velocidad a 55"

Parece que básicamente han citado otras características del lenguaje como siendo confuso, y luego se usa eso como una defensa para la fabricación de captadores / setters más confuso? Casi suena como están admitiendo que lo que se ha propuesto es más confuso. Estas características son a veces confusas debido a la forma de uso general son. A veces abstracciones pueden ser más confuso, pero al final que a menudo sirven al propósito de ser más reutilizable. Creo que si se quería argumentar a favor de la velocidad () y la velocidad (55), que querría mostrar cómo puede permitir nuevas posibilidades para el programador.

Por otra parte, C # tiene algo así como lo que describes, ya que las propiedades se comportan de manera diferente como captador o colocador en función del contexto en lo que se utilizan:

Console.WriteLine(car.Speed); //getter

car.Speed = 55 //setter

Sin embargo, aunque se trata de una sola propiedad, hay dos secciones separadas de código para implementar la configuración de obtener y, y es evidente que este es un captador / definidor y no una velocidad de funcionamiento, porque omiten el () para las propiedades . Así car.speed () es claramente una función, y car.speed es claramente una propiedad de captador.

Otros consejos

En mi humilde opinión el C # de estilo de tener propiedades como el azúcar sintáctica para los métodos GET y SET es el más expresivo.

Yo prefiero los objetos activos que encapsulan las operaciones en lugar de captadores y definidores, para que pueda obtener un objetos semánticamente ricos.

Por ejemplo, aunque un ADT en lugar de un objeto de negocio, incluso el vector en C ++ ha emparejado funciones:

size_type capacity() const // how many elements space is reserved for in the vector  
void reserve(size_type n)  // ensure space is reserved for at least n elements 

y

void push_back ( const T& ) // inserts an element at the end
size_type size () const     // the number of elements in the vector

Si usted conduce un coche, se puede establecer el acelerador, embrague, frenos y la selección de marchas, pero no establece la velocidad. Usted puede leer la velocidad de la corredera. Es relativamente raro querer tanto un regulador y un captador en un objeto con comportamiento.

FYI, Objective-C utiliza car.speed() y car.setSpeed(55) (excepto en una sintaxis diferente, [car speed] y [car setSpeed:55].

Se trata de convención.

No hay una respuesta correcta, es una cuestión de estilo, y en última instancia no importa. Pasar sus ciclos cerebrales en otro lugar.

Fwiw prefiero la class.noun () para el comprador, y class.verb () Para el organismo. A veces, el verbo se acaba setNoun (), pero otras veces no. Depende del sustantivo. Por ejemplo:

my_vector.size() 

devuelve el tamaño, y

my_vector.resize(some_size) 

cambia el tamaño.

El enfoque maravilloso a las propiedades es bastante excelente mi humilde opinión, http://groovy.codehaus.org/Groovy + Beans

Los puntos de referencia final de su código debe ser la siguiente:

  1. ¿Funciona correctamente?
  2. ¿Es fácil de solucionar si se rompe?
  3. ¿Es fácil añadir nuevas características en el futuro?
  4. ¿Es fácil para alguien más para entrar y fijar / mejorarlo?

Si se cubren esos 4 puntos, no puedo imaginar por qué alguien tendría un problema con él. La mayor parte de las "mejores prácticas" están generalmente orientados hacia el logro de esos 4 puntos.

Utilice el que el estilo que funciona para usted, acaba de ser coherente al respecto, y que debe estar bien.

Esto es sólo una cuestión de convención. En Smalltalk, se hace de la manera que usted sugiere y no recuerdo haber oído a nadie quejarse. Recibiendo la velocidad del coche es car speed, y el establecimiento de la velocidad del coche a 55 es car speed:55.

Si tuviera que aventurar una conjetura, diría que la razón de este estilo no cogió encendido se debe a que una de las dos líneas más abajo, que la programación orientada a objetos han llegado hasta nosotros: C ++ y Objective-C. En C ++ (incluso más temprano en su historia), los métodos están muy estrechamente relacionados con las funciones de C, y funciones de C se nombran convencionalmente en la línea de setWhatever() y no tienen la sobrecarga de un número diferente de argumentos, por lo que el estilo general de nombrar era mantenido. Objective-C se ha conservado en gran medida por NeXT (que más tarde se convirtió en Apple), y la próxima tendió a favorecer la verbosidad en sus APIs y sobre todo para distinguir entre diferentes tipos de métodos - si está haciendo nada, pero sólo acceso a una propiedad, al lado quería un verbo Para hacerlo claro. Por lo que se convirtió en la convención de cacao, que es la biblioteca estándar de facto para Objective-C en estos días.

Es la convención de Java tiene una convención de captadores y definidores C # ha propiedades, Python tiene campos públicas y marcos de JavaScript tienden a utilizar el campo () para obtener y de campo (valor) para establecer

Aparte de inequívoca claridad, ¿por qué nos atenemos a:coche.getSpeed() y el coche.setSpeed(55) cuando esto podría ser utilizado así :coche.de velocidad (a) y el coche.velocidad(55)

Porque en todos los idiomas que he encontrado, car.speed() y car.speed(55) son los mismos en términos de sintaxis.Sólo mirando a ellos, como que, tanto podría devolver un valor, que no es cierto para el último si que estaba destinado a ser un setter.

¿Qué pasa si usted tiene la intención de llamar la incubadora, pero se olvide de poner en el argumento? El código es válido, por lo que el compilador no se queja, y no emite un error de ejecución inmediata; que es un error en silencio.

. () Significa que es un verbo. No () significa que es un sustantivo.

   car.Speed = 50;
   x = car.Speed
   car.Speed.set(30)
   car.setProperty("Speed",30)

y

   car.Speed()

implica comando para superar el límite de velocidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top