2010-05-21 7 views
5

Ha sido un largo tiempo desde que he programado en C++, pero sé que en C++ las clases se organizan en archivos .h y archivos .cpp. Además, muchos otros idiomas se benefician al dividir el código en agrupaciones lógicas dentro de una estructura de directorio para mejorar la organización.La mejor manera de organizar una interfaz Go

Bueno, estoy tratando de aprender Ir ahora y estaba leyendo el artículo Go for C++ Programmers cuando encontré las interfaces. El artículo explica que las interfaces en Go esencialmente toman el lugar de las clases y muestra cómo configurarlas bastante bien.

Lo que estoy tratando de averiguar es cómo debería organizar una interfaz en los archivos? Por ejemplo, ¿debería la interfaz estar en un archivo mientras la implementación está en otro?

myInterface.go

type myInterface interface { 
    get() int 
    set(i int) 
} 


myImplementation.go

type myType struct { i int } 
func (p *myType) set(i int) { p.i = i } 
func (p *myType) get() int { return p.i } 

Mi código aquí puede estar equivocado, ya que no sé por completo lo que estoy haciendo todavía (y si estoy equivocado por favor corrígeme), pero ¿sería esta la mejor manera de configurar esto? Estoy teniendo un momento difícil tratando de entender cómo organizar el código en Go para que cualquier ayuda sea apreciada.

Metropolis

+0

Estoy muy tarde en el show. Pero normalmente sigo el estilo de código fuente de Go: https://golang.org/src –

Respuesta

5

No hay necesidad de poner tipos e interfaces en archivos separados. Las cosas exportadas de cada paquete son lo que importa y las denotará comenzando el nombre con una letra mayúscula. En C & co. lo que entra en un archivo de encabezado importa porque esa es la cosa "importada" (incluida). En Go, es el paquete que se importa y no importa cómo se organice su contenido en diferentes archivos fuente (de todos modos, no será visible para el importador).

Mi recomendación personal es evitar la creación de archivos innecesarios. Si el código es relativamente corto, guárdelo en un archivo. Si es largo, considere dividir las partes para las que parece natural hacerlo (por ejemplo, interfaz + funciones relacionadas que probablemente formarán una clase separada si lo hiciera en Java o C++). No separe nada solo por separar las definiciones del código; no tiene sentido en Go aunque lo haga en C.

+0

Muchas gracias por la información Arkku. La razón por la que hago esta pregunta es porque estoy muy preocupado de que Go se convierta en un festival de funciones. No quiero tener 20 funciones en una página porque creo que sería difícil lidiar con ellas. Pero, por otro lado, ¿quizás Go va a programarse más así? – Metropolis

+0

No creo que la longitud de un archivo fuente sea una gran preocupación siempre que sus contenidos estén juntos, p. en Java todo lo que está en una clase está en ese archivo. Si algo pertenece a esa clase, no es un problema y sería muy confuso dividirlo arbitrariamente en un archivo separado (si fuera posible en Java). – Arkku

+0

Supongo que realmente debería haber reformulado mi pregunta. ¿Podría darme algún tipo de estructura de archivo Go que esté organizada para que pueda ver cómo los archivos pueden interactuar entre ellos? Todo lo que he visto de ejemplos hasta ahora es un func principal, y un montón de otros funcs en el mismo archivo que se llaman entre sí. Lo cual es genial para ejemplos, pero en un entorno más organizado, creo que esto sería malo. – Metropolis

6

El lenguaje de programación Go no es C++, C ni es abordarlo como un nuevo lenguaje. Go no tiene equivalente a los archivos de encabezado. Solo tiene una asociación suelta con el concepto de clases de C++. Puesto que usted no es un experto programador de C++, ignorar el artículo Go For C++ Programmers.

Comience leyendo A Tutorial for the Go Programming Language. Luego lea Effective Go. Navegar a través de The Go Programming Language Specification, por lo que sabe dónde buscar las cosas.

Go es de código abierto, así que mira Go package documentation y source code reales.

Para empezar, un vistazo a la time paquete documentation y source code, que fue escrito por los autores de Ir. No usan archivos separados para las declaraciones de interfaz y las implementaciones, entonces ¿por qué quieres? Como dices tú mismo, aún no sabes lo que estás haciendo, así que ¿por qué no comienzas siguiendo el ejemplo establecido por los expertos?

Algunas de las motivaciones para el desarrollo del lenguaje de programación Go vinieron del deseo de crear un lenguaje que fuera mejor que C y mucho más simple que C++. Teniendo en cuenta las características de procedimiento (a menudo similares a C) de Go, los conceptos de diseño de procedimientos tales como el acoplamiento y la cohesión son útiles. Estos conceptos son evidentes en la partición del paquete Ir time en varios archivos fuente. Algunos conceptos de diseño de clase también serán útiles, pero recuerde, Go no es compatible con la herencia.

Como señaló Nicklaus Wirth en su trabajo clásico, Desarrollo de programas por perfeccionamiento paso a paso, los primeros borradores de un programa rara vez son ideales, quizás incluso descuidados a veces. Incluso la versión final rara vez es perfecta. Por ejemplo, los autores van, después de unos pocos meses, reescribieron recientemente la json paquete Go.

El diseño y la implementación del lenguaje de programación Go se presta para el uso de muchas funciones pequeñas. Favorece soluciones sucintas.Por supuesto, muchas de las funciones no están expuestas fuera del paquete. Los límites arbitrarios en el tamaño o número de la función rara vez funcionan en cualquier idioma.

Los programas de Go se construyen vinculando los paquetes juntos. Un paquete a su vez se construye a partir de una o más fuentes archivos que juntos declarar constantes, tipos, variables y funciones pertenecientes al paquete y que son accesible en todos los archivos del mismo paquete . Esos elementos pueden ser exportados y utilizados en otro paquete. Packages, The Go Programming Language Specification.

¿Qué quiere su primer paquete de Go para hacer? Haga preguntas específicas que puedan ser respondidas y proporcione detalles.

+0

No dije que era C++ o C ..... Sé que no tiene un equivalente a los archivos de encabezado, también sé que es una asociación suelta con los conceptos de C++ ... Mi pregunta fue: "¿Cuál es la mejor manera de organizar interfaces/código en Go?" – Metropolis

+0

Simplemente estaba usando archivos de encabezado C++ como algo para compararlo ya que el artículo trata sobre esa comparación. – Metropolis

+0

Gracias por la información adicional de Peter, eso ayudó. Creo que solo necesito encontrar una manera de pasar de mi mentalidad orientada a objetos (clases) a algo diferente, y estoy muy preocupado de que salga descuidado. ODIO escribir código descuidado ... como estoy seguro de que muchos de nosotros lo hacemos ... – Metropolis

Cuestiones relacionadas