Visual Studio, Git y código común

7

Estoy buscando algunos consejos sobre cómo debo organizar un gran proyecto nuevo en el que estoy trabajando para permitir que se administre más fácilmente en Git (utilizando GitLab) y se desarrolle en Visual Studio.

Para dar una idea de la escala, este es un backend de servidor completo que constará de algunos servicios de red (sockets), servicios de procesamiento de datos y servicios web. Cada uno de estos servicios será un proyecto individual, pero habrá una gran cantidad de código común involucrado que querré separar y entre ellos (es decir, conjuntos compartidos).

Entonces, digamos que tengo los siguientes proyectos de Visual Studio, con las dependencias que se muestran:

Utility
SharedSocketCode - [ Utility ]
SocketServiceA - [ SharedSocketCode ]
SocketServiceA.WindowsServiceHost - [ SocketServiceA ]
SocketServiceA.ConsoleHost - [ SocketServiceA ]
SocketServiceB - [ SharedSocketCode ]
SocketServiceB.WindowsServiceHost - [ SocketServiceB ]
SocketServiceB.ConsoleHost - [ SocketServiceB ]
DbEntityModel
DataLogServiceA - [ DbEntityModel, Utility ]
DataLogServiceB - [ DbEntityModel ]
SharedWebServiceCode
WebServiceA - [ SharedWebServiceCode, DbEntityModel ]
WebServiceB - [ SharedWebServiceCode, DbEntityModel ]

Como puede ver, habrá una gran cantidad de código compartido, ¡y esto es solo la punta del iceberg! Estoy dividido entre almacenar todo esto en el mismo repositorio o tratar de dividirlos en otros individuales.

El primero suena como el más fácil de mantener, ya que no tendré que luchar con Visual Studio en busca de un código compartido en lo que podrían ser diferentes ubicaciones en la versión local de cada usuario; todos los proyectos se podrán almacenar a nivel de solución.

Parece que lo último me dará más control sobre la versión de cada componente y separará lógicamente lo que de otro modo sería una única base de código gigantesca.

Soy bastante nuevo en Git y GitLab, así que no estoy seguro si hay algo que pueda ayudar con este tipo de escenario. Cualquier consejo sería bienvenido.

(FYI, agregué la etiqueta de GitHub, ya que creo que es bastante similar a GitLab, por lo que también podría haber alguna ayuda que pueda obtener de sus usuarios)

    
pregunta Barguast 20.02.2015 - 12:34

1 respuesta

1

Creo que lo estás haciendo muy bien al dividir Visual Studio Solution en varios Projects que están creando bibliotecas, como usted y @antlersoft dijeron en el comentario.

De esta manera, puede tener varios otros Solutions o incluso proyectos que crean un binario independiente (como la línea de comando exe) que hace referencia a esta biblioteca (Explorador de soluciones: agregar referencia).

Lo único que git o Visual Studio no está haciendo por usted (como arquitecto de software de una o varias soluciones) es desenredar las referencias entre su modules (yo también uso esta biblioteca en esta página).

Es una buena idea tener una arquitectura en capas en cada sistema de software más grande. Cuando vaya y reconfigure todo su sistema, puede seguir estas mejores prácticas:

  • cree un espacio de nombres para cada biblioteca que se propague a través de todos los archivos de origen en esta biblioteca
  • verifique el uso: qué archivo .cs (y, por lo tanto, su espacio de nombres y la biblioteca que se compila como un proyecto separado) usa las clases en esta biblioteca
  • asigne cada espacio de nombres / biblioteca a una capa (no tiene que dar nombres a las capas); puede hacer esto en papel o utilizar cualquier herramienta UML que admita diagramas de componentes (incluido el de las versiones de Visual Studio de mayor valor; algunas herramientas UML lo llaman explícitamente diagrama de capas)

Al final del día, se logra una buena arquitectura si ninguna biblioteca de una capa determinada está utilizando una biblioteca en una capa superior (sin flechas apuntando hacia arriba) o la misma capa (flechas apuntando hacia los lados). Si no puede hacer esto fácilmente, puede optar por la forma más débil de permitir el acceso a la misma capa.

{Si descarga la versión preliminar de Visual Studio "15" (que es un VS máximo; siempre que esté disponible) puede abrir su proyecto y seleccionar New Diagram en el menú Architecture (justo al lado a Herramientas), eligió Layer Diagram y juega un poco, ya que hay un video instructivo vinculado después de que creaste tu primer diagrama. La siguiente captura de pantalla muestra el diagrama generado que obtiene cuando arrastra algunas de sus bibliotecas desde el Explorador de soluciones, haga clic derecho en él y seleccione generar dependencias. }

LayerDiagramparamostrarcomoimplementadoenVisualStudio"15"

Las siguientes refactorizaciones te ayudan a llegar allí:

  • Mover una clase entera a un espacio de nombres / biblioteca diferente
  • mover una propiedad / campo hacia arriba o hacia abajo en la jerarquía de herencia para mover la dependencia que se origina al acceder a esta propiedad / campo a un espacio de nombres diferente
  • mover un método hacia arriba o hacia abajo en la jerarquía de herencia por el mismo motivo
  • haga alguna clasificación adicional al a) agregar una superclase más general que contenga solo un subconjunto de las propiedades / campos y / o métodos o por b) crear subclases más específicas

El proceso de re-arquitectura o refactorización de su sistema para resolver las dependencias entre bibliotecas (paquete / espacio de nombres / módulo) que le impiden reutilizar su software existente de manera adicional Proyectos ha producido una cantidad muy significativa de publicaciones. Lo llamé untangling por encima del cual no es realmente el término científico. Una referencia destacada del libro que cubre esto (y fue escrita mucho antes de git times pero aún es una muy buena fuente) es la Gang-of -Cuatro libros que utiliza el término diseño de software (como en el análisis y diseño orientado a objetos). También puede encontrar algunos libros o artículos muy buenos usando re-arquitectura o simplemente arquitectura o refactorización en su librería favorita o motor de búsqueda.

Solo para reconfirmar nuevamente: una vez que haya reajustado las líneas del proyecto de esta manera, cada proyecto es un buen candidato para ser utilizado también como repositorio de git y puede consultar cualquier cantidad de soluciones adicionales que desee reutilizar. biblioteca en.

    
respondido por el dr. rai 12.05.2016 - 19:24

Lea otras preguntas en las etiquetas