2010-04-26 4 views
24

Parecía que esta pregunta debería haberse formulado antes, pero al buscar no encontró nada.¿Por qué C# y Java requieren que todo esté en una clase?

Siempre me he preguntado cuál es el punto de hacer que pongamos todo el código dentro de una clase o interfaz. Me parece recordar que hubo algunas ventajas al requerir una función main() como C, pero nada para las clases. Los lenguajes como Python son, en cierto modo, incluso más orientados a objetos que Java, ya que no tienen primitivos, pero puedes poner el código donde quieras.

¿Es esto una especie de "mala interpretación" de OOP? Después de todo, puede escribir código de procedimiento como lo haría en C y colocarlo dentro de una clase, pero no estará orientado a objetos.

+0

Python no tiene primitivos? Eh? –

+2

Buena pregunta. Prefiero no ser forzado a escribir clases cuando estoy escribiendo algo que simplemente no se ajusta al paradigma de OOP. (Esta es la razón por la cual cada proyecto de C# en el mundo tiene una clase de "utilidad" estática llena de métodos impares) –

+0

@San: AFAIK, todo en Python está representado por un 'PyObject *' en C. – Javier

Respuesta

14

Creo que el objetivo de exigir que todo esté incluido en las clases es minimizar el número de conceptos que debe tratar en el idioma. En C# o Java, solo necesita comprender el modelo de objeto (que es bastante complejo, sin embargo). Sin embargo, solo tiene clases con miembros e instancias de clases (objetos).

Creo que este es un objetivo muy importante que la mayoría de los idiomas intenta seguir de una forma u otra. Si C# tuviera algún código global (por ejemplo, para permitir la evaluación interactiva y la especificación del código de inicio sin el método Main), tendría que aprender un concepto adicional (código de nivel superior). La elección hecha por C#/Java es, por supuesto, solo una forma de obtener la simplicidad.

Por supuesto, es una pregunta si esta es la opción correcta. Por ejemplo:

  • En los lenguajes funcionales, los programas están estructurados usando tipos (tipo de declaraciones) y expresiones. El cuerpo del programa es simplemente una expresión que se evalúa, que es mucho más simple que una clase con el método Main y también permite scripting interactivo (como en Python).

  • En Erlang (y otros idiomas similares), el programa se estructura como procesos que se ejecutan simultáneamente con un proceso principal que inicia otros procesos. Este es un enfoque dramáticamente diferente, pero tiene sentido para algunos tipos de aplicaciones.

En general, cada lengua tiene alguna manera de mirar el mundo y modelarla y utiliza este punto de vista cuando se mira en todo .Esto funciona bien en algunos escenarios, pero creo que ninguno de los modelos es completamente universal. Esa puede ser una razón por la cual los lenguajes que mezclan múltiples paradigmas son bastante populares hoy en día.

Como nota al margen, creo que el uso del método Main es una opción algo discutible (probablemente heredando de los lenguajes C/C++). Supongo que una solución más clara orientada a objetos sería iniciar el programa creando una instancia de alguna clase Main.

+0

Buen punto sobre la convención principal. Aunque recuerdo haber pensado que en el código de prueba desechable parecía lindo tener una clase "bootstrap" una instancia de sí misma usando un método principal estático :) – xyz

+0

Buena respuesta, gracias. Supongo que veo el punto, pero no estoy seguro de que sea una buena idea hacer las cosas como lo hacen C#/Java. Sin embargo, gracias. – Javier

+0

Steve Yeggie tuvo una excelente publicación sobre los peligros de esta forma de pensar http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html. – Jasmeet

5

Creo que la idea de Java era que una clase de nivel superior representara una sola unidad de código que se compilaría en un archivo separado .class. La idea era que estas unidades discretas e independientes de código pudieran compartirse fácilmente y combinarse en muchos proyectos (al igual que un carpintero puede combinar piezas básicas como tuercas, pernos, pedazos de madera, etc., para hacer una variedad de artículos).) La clase fue vista como la unidad atómica más básica y más pequeña, y por lo tanto, todo debería ser parte de una clase para facilitar el ensamblaje de programas más grandes a partir de estas partes.

Se puede argumentar que la programación orientada a objetos de código fácilmente composable no funcionó muy bien, pero cuando se diseñó Java, el objetivo de OOP era crear pequeñas unidades (clases) que pudieran combinarse fácilmente para hacer programas únicos

Imagino que C# tenía algunos de los mismos objetivos en mente.

10

C# no fue diseñado para "programar en el pequeño". Más bien, fue diseñado para programación orientada a componentes. Es decir, para escenarios de programación donde los equipos de personas están desarrollando componentes de software interdependientes que se lanzarán en múltiples versiones a lo largo del tiempo.

El énfasis en la programación en general y lejos de la programación en pequeña significa que a veces hay una gran cantidad de "ceremonias" en torno a los programas pequeños. Usando esto, clasifica eso, bla, bla, bla, todo para escribir 'hola mundo'.

La propiedad "un programa de una línea tiene una línea de longitud" sería bueno tenerla en C#. Estamos considerando permitir código fuera de clases en programas pequeños como una característica posible en una versión hipotética futura de C#; si tiene opiniones constructivas a favor o en contra de tal característica, siéntase libre de enviármelas a través del enlace de contacto en mi blog.

+1

¿Pero por qué debería haber más ceremonia para proyectos grandes? Pensarías que eso haría las cosas aún más complicadas. – Javier

+2

@Javier: desea esa ceremonia para proyectos grandes porque (1) impone la disciplina y (2) fomenta el código de auto-documentación, y (3) elimina las ambigüedades. El costo de la ceremonia se paga en la reducción de errores. –

+1

No estoy tratando de ser argumentativo, pero tengo una curiosidad legítima: ¿qué evidencia hay de que "el costo de la ceremonia se paga en la reducción de errores"? ¿Conoce algún estudio de usabilidad en esta línea, por ejemplo? – kvb

Cuestiones relacionadas