2010-11-29 7 views
7

Comencé a aprender un lenguaje de programación funcional (SML) y programé un poco en este lenguaje. Y luego comencé a verificar Java y tuve la sensación de que los campos de clase parecen variables globales y complican la programación. Por ejemplo, debo leer métodos para ver cuál de lectura/escritura de ellos, etc.¿No hay campos en las clases similares a las variables globales?

Por lo que he escuchado el uso de variables globales en lenguajes de programación como C es una mala idea. Pero, ¿qué pasa con los campos de clase Java, no son algo así como las variables globales para todos los métodos de clase? ¿Es una mala idea usar campos? (O tal vez he entendido algo mal o programo en el "camino equivocado" Java)

Respuesta

0

Pero en Java todo el programa no está escrito con el uso de una sola clase. Y son constantes (campos finales públicos estáticos) que son como variables globales. Y mi consejo es que no te concentres en cada una de esta parte del java, ¿de qué sirve java es lo que ofrece como un todo? Porque es entonces cuando ves la impartición de cada una de estas características de Java.

1

No, campos de clase no son variables globales, aunque podrían ser mal utilizados para el mismo propósito.

Las variables globales son accesibles desde todos los ámbitos. Tienden a ser escribibles desde todos los ámbitos. Esto hace que las grandes bases de código sean difíciles de comprender y depurar. Las variables globales también invitan a nameclash.

Los campos de clase están en el alcance de la clase. Tienden a estar encapsulados en una clase, con acceso privado, lo que impide el acceso desde fuera de la clase. Esto limita el acceso directo y la modificación a un pequeño subconjunto de código.

2

diría que no entiendo muy bien la manera de Java (o cualquier otro lenguaje orientado a objetos) funciona.

En lenguajes orientados a objetos, clases representan diferentes tipos de cosas que pueda necesitar en todo su programa. Es mejor ilustarte esto con un ejemplo. Digamos que en tu programa vas a modelar autos.

usted tendría una clase de coches, y crearía un nuevo objeto (una nueva instancia) de la clase de coches para representar cada coche nuevo que usted necesita. El automóvil está constituido por diferentes componentes, usted tiene ruedas, un motor, ventanas, etc. Por lo tanto, tendría clases para cada uno de estos componentes, y cada objeto del automóvil contendría su propio conjunto de objetos de todas las diferentes clases, es decir:

Car1 { 
     motor1 
     window1.1, window1.2 
     wheel1.1,wheel1.2 
} 

Car2 { 
     motor2 
     window2.1, window2.2 
     wheel2.1,wheel2.2 
} 

En este caso, debe definir cada uno de los componentes de los automóviles como campos de clase. Estos campos son para todos los efectos 'globales' ya que se puede acceder desde cualquiera de los métodos de esa clase. El detalle que parece faltar es que cada nuevo objeto de esta clase tiene su propio conjunto de campos y métodos. No los comparten, por lo que cada motor, conjunto de ruedas, etc., pertenece a una instancia de la clase Car. Entonces, si en la clase de automóvil tiene un método llamado, digamos, deleteWindows(), que eliminaría todas las ventanas, y llamó a ese método en car2, esto no eliminaría las ventanas de car1.

Otro detalle importante es que se puede definir estas variables con varios prefijos '' (métodos también). Primero tiene público y privado (protegido, pero no entraré en eso). Al declarar una variable como privada, usted dice que el único objeto que puede acceder y cambiar esa variable es el propietario. Por otro lado, se puede acceder y cambiar una variable pública por cualquier otro objeto. Son accesibles, pero tiene que decir explícitamente que desea cambiar la variable de ese objeto (escribiendo objectsName.variable, en nuestro caso car1.motor).

También puede tener variables/métodos que son compartidos por todas las instancias de una clase. Para hacer esto, los declaras como estáticos (estos pertenecen efectivamente a la clase y no a ningún objeto de esa clase en particular). Privado/público todavía se aplica, una variable estática privada solo es accesible por instancias de esa clase (y métodos estáticos de la misma clase), mientras que las públicas son accesibles por cualquier otra clase/objeto. Para acceder a ellos desde fuera de la clase a la que pertenecen, use ClassName.variable/method (así Car.variable en el ejemplo anterior).

A veces es posible que desee tener una clase que no tendría sentido crear una instancia de. Encuentro que a menudo necesito crear una clase de Matemáticas que contenga varios operadores matemáticos que quiero usar a lo largo de todo el programa. No tiene sentido crear un objeto Maths, por lo que simplemente definiría todos sus métodos como "públicos estáticos" y accederá a ellos siempre que lo necesite en sus otras clases.

espero haber clreaded su duda. De cualquier manera, le sugiero que lea un poco sobre programación orientada a objetos, tal vez obtenga un libro que enseñe Java con un enfoque inicial fuerte en orientación a objetos (OO), ya que aunque no es un concepto difícil de entender, podría ser difícil acostumbrarse y programar correctamente en un idioma OO si proviene de un fondo no OO.

Es posible que desee examinar BlueJ. Es un IDE de Java que básicamente te obliga a entender y utilizar la programación OO. No es algo que sugiera usar durante demasiado tiempo, pero podría ser un buen lugar para comenzar hasta que obtenga una buena comprensión de los principios básicos de OO.

Zepee

+0

Conozco las diferencias entre campos estáticos y no estáticos y que cada objeto tiene su propio estado. Déjame decir lo contrario. Digamos que tienes 2000 líneas de código C en un archivo que son básicamente muchas funciones, ¿es bueno tener en este archivo las variables globales que usarán estas funciones? Por lo que sé, la respuesta es no (ya que no sabes qué funciones escribe/lee cada variable global). Lo mismo sucede con las clases, una clase puede tener 2000 líneas de código, en este ámbito de clase los campos son como variables globales. ¿Correcto?¿No es algo malo como el ejemplo del código C? –

+0

No tengo mucha experiencia fuera de los lenguajes de OO, pero parece que el problema al que apunta es el hecho de no saber qué cambia lo que se aplica a las variables públicas. Debería preocuparse por qué objetos pueden acceder directamente y cambiar sus variables. Este es uno de los principios básicos de OOP, encapsulación, que establece que los objetos/clases solo deben saber lo que hace todo el resto, pero no cómo lo hacen. Por lo tanto, la práctica común de hacer que los campos sean privados y proporcionar getters/setters solo donde cada objeto puede controlar cuán transparente es para el mundo exterior. – Zepee

+0

Sin embargo, dentro de cada clase, necesita transparencia total. ¿Qué tan bueno es que exista si ni siquiera usted sabe cómo es? En otras palabras, sin variables de clase, ¿cómo distinguirías el objeto A del objeto B? No debe preocuparse por tener varios métodos en su objeto para acceder a sus campos, solo tiene otros objetos que acceden a sus campos. Las variables de clase no solo no son malas, ya que son necesarias, son lo que define un objeto, y poder tener varias instancias de una clase, cada una con su propio conjunto de atributos es exactamente el motivo por el que se crearon los lenguajes OO. – Zepee

3

Class variables de nivel son variables globales en el contexto de la clase. Eso se hace para mantener un estado, necesitas tenerlos en alguna parte. En algunos casos, las variables de nivel Class se consideran malas prácticas, especialmente cuando no son inmutables.

+3

Este es uno de los principales factores que veo que hace que el código sea difícil de mantener. Ojalá pudiera encontrar más publicaciones/ensayos de blogs que se opusieran a esto, porque podría usar algo de ayuda para explicar qué tan grande es este problema. Las firmas de métodos como void TakeCareOfStuff() {} son un gran olor a código. –

3

Supongo que por "variables de clase" quiere decir "variables estáticas".

Usted pregunta "¿No son algo así como las variables globales para todos los métodos de su clase?".

Sí, tienes razón. Dentro de la clase se comportan como globales con todos sus problemas.

La diferencia es que sus clases no deben ser tan complejos como programas enteros y por lo tanto sería más fácil de entender y solucionar los problemas causados ​​por ellos.
Cuanto menos código pueda modificar una variable, menos casos tendrá que considerar. Globals puede ser modificado por código arbitrario desconocido.

También tiene sentido absoluto en algunas situaciones tener todas las instancias de una clase comparten una variable (por ejemplo, un Singleton). Solo tienes que usarlo de manera responsable.

¿No debería usarlas?
No, puede usarlos. Pero limite su visibilidad al mínimo necesario para que no se conviertan en globales "de facto".
También hacerlos finales si es posible.

+0

Me refiero a variables no estáticas. Con las variables estáticas es aún peor porque no se puede decir qué objeto lee/escribe qué variable. Pensé que las variables globales son malas en general, no solo en los programas completos, sino en 2000 líneas de archivos de códigos. ¿No es tan malo? ¿No estás al tanto de los archivos de clase con más de 2000 líneas de código? (Supongo que los sistemas reales definitivamente tendrán clases "grandes") –

Cuestiones relacionadas