2010-09-15 7 views
5

Hay 2 razones para que pregunte:
1. Me gustaría una mejor fragmentación del código para facilitar el control de versiones en el nivel por función
2. Lucho por un trastorno de déficit de atención y es difícil para mí Trabajar con códigos largos como archivos de clase grande¿Hay algún medio en Scala para dividir un código de clase en muchos archivos?

Para resolver estos problemas solía usar directivas include en C++ y definiciones de clases parciales y regiones plegables definibles manualmente en C#. ¿Hay tales cosas disponibles en Scala 2.8?

he tratado de usar editor de etiquetas veces en NetBeans IDE, pero no funciona en el editor de Scala por desgracia :-(

ACTUALIZACIÓN: Por lo que yo entiendo, no existen tales instalaciones en Scala. Así que me gustaría preguntar: alguien que tenga alguna conexión con autores Scala, o una cuenta en su Bugzilla (o lo que sea que usen), por favor, sugiérales una idea - probablemente deberían pensar en introducir algo de tal (Me fascinaban las regiones C# y las clases parciales, por ejemplo, y las simples también incluyen una herramienta conveniente) para hacer Scala aún más hermoso a través de laconicidad, en mi humilde opinión.

+0

esto realmente no está respondiendo a su pregunta, pero tal vez le gustaría ver esto: http://jvi.sourceforge.net/ It's Vim Plugin for Netbeans. No sé si te gusta trabajar con Vim pero este complemento puede doblar código. Si tiene todo el conjunto de funciones Vim, también puede doblar por indentación. – Agl

+0

El plegado de código funciona bien para mí con NetBeans 6.9.1 y el complemento Scala. ¿Te refieres a las etiquetas especiales '// '? Esos no funcionan actualmente. –

+1

@ rex-kerr, sí, me refiero a etiquetas de pliegue de editor. Plegado no definido manualmente (por tema) pero el lenguaje natural (como funciones, bucles, etc.) me parece bastante inútil. Necesito doblar la agrupación por tema común, no por sintaxis. – Ivan

Respuesta

14

¿Qué tal si lo haces con rasgos? Se define así:

trait Similarity 
{ 
    def isSimilar(x: Any): Boolean 
    def isNotSimilar(x: Any): Boolean = !isSimilar(x) 
} 

... y luego lo usa de esta manera:

class Point(xc: Int, yc: Int) extends Similarity 
{ 
var x: Int = xc 
var y: Int = yc 
def isSimilar(obj: Any) = 
    obj.isInstanceOf[Point] && 
    obj.asInstanceOf[Point].x == x 
} 

Si la clase Point eran más grandes, se puede dividir aún más en los rasgos, lo que resulta en la división eso que quieres. Tenga en cuenta, sin embargo, que no creo que esto sea aconsejable, ya que será muy difícil obtener una buena visión general de su código, a menos que ya lo sepa de memoria. Sin embargo, si puedes romperlo de una manera agradable, es posible que puedas obtener algunos bloques agradables y reutilizables, así que al final puede que valga la pena hacerlo.

¡La mejor de las suertes para ti!

2

El plegado del código Scala funciona correctamente en IDEA.

+0

Me refiero no solo a bloques de idioma (como funciones) plegables, sino a regiones definidas manualmente para nombrarlas y plegarlas, como con #region en C#. ¿Esta función está disponible en Idea? – Ivan

+2

Sí, las regiones arbitrarias pueden plegarse (reemplazadas por puntos suspensivos). También puede definir qué partes de la estructura de un archivo se deben plegar previamente cuando se abre el archivo por primera vez. –

+0

@ randall-schulz, gracias. Lo intentaré. – Ivan

1

Las herramientas de control de versiones con las que trabajo (bzr o git, principalmente) no tienen problemas para aislar los cambios línea por línea. ¿Qué caso de uso tiene (es lo suficientemente común como para preocuparse), donde el aislamiento de nivel de línea (que permite que los cambios a métodos independientes se fusionen sin la intervención del usuario) no es suficiente?

Además, si no puede enfocarse en algo tan grande como una clase con muchos métodos, use más clases. Un método generalmente requiere que sepa cuáles son los otros métodos, cuáles son los campos, y así sucesivamente. Tener esa división en archivos separados es solo pedir problemas. En lugar de eso, encapsula tu problema de una manera diferente para que puedas trabajar con trozos pequeños y autónomos a la vez.

+0

Me refiero no a línea, sino a función (mientras las funciones crecen, cambiando el número de líneas donde terminan y empujando hacia abajo las líneas donde comienzan las funciones siguientes). – Ivan

+0

En cuanto a la orientación, me sentí muy cómodo con C++ que tiene un archivo para una declaración de clase (que enumera todos sus métodos) y un archivo separado para cada implementación de método. Esto también fue muy conveniente para la documentación de clases, ya que los comentarios descriptivos detallados podían colocarse en un archivo de declaración sin saturar los archivos de código. – Ivan

+1

@Ivan - No he tenido problemas con Git para confundirme cuando algunas líneas caen sobre donde solían estar otras líneas. Parece que el código es mejor que eso. Y con llaves plegables en NetBeans, parece que ha vuelto a tener un archivo que enumera todos los métodos, excepto que puede ampliarlos. Por lo tanto, debería estar en buena forma si lo hace funcionar, al menos, para doblar con las llaves. –

4

Sugiero leer el libro blanco de Martin en este link. En este documento técnico, el capítulo "Case Sudy: The Scala Compiler" le dará una idea sobre cómo puede lograr un diseño basado en componentes que tenga código en varios archivos separados.

+0

Gracias. Leeré esto. Siempre he supuesto que el código complejo y largo es el resultado de una mala arquitectura. Diseñar uno bueno con Scala es aún un campo para explorar y pensar mucho ... – Ivan

4
//file A.scala 
trait A { self: B => 
.... 
} 

//file B.scala 
trait B { self: A => 
.... 
} 

//file C.scala 
class C extends A with B 
Cuestiones relacionadas