¿Cuánto depende la arquitectura del software del idioma?

14

Mientras me educaba sobre la arquitectura del software y los patrones de diseño, noté que en la mayoría de los casos algunas características del lenguaje y detalles del diseño están implícitos en la explicación.

Por ejemplo, prácticamente cualquier artículo o libro que ilustre las ideas usando clases e interfaces. Todo lo que uno puede encontrar fácilmente sobre este tema mencionaría objetos y conceptos de POO.

¿Qué pasa si el lenguaje en el que está escrito el sistema no tiene tales conceptos? Por ejemplo, ¿qué sucede si uso Python o Node, que se escriben dinámicamente y no tienen una noción de interfaz? ¿Qué sucede si uso TypeScript donde una interfaz es una construcción efímera, que no existe en tiempo de ejecución? ¿Qué pasa si estoy tratando de adoptar la programación funcional? ¿Debo ignorar, por ejemplo, SOLID y buscar otros conceptos, adecuados para mi idioma?

Si es así, ¿cuáles son esos? Desafortunadamente, todos los paradigmas bien adoptados (hasta donde yo sé) se refieren a conceptos y tipos de OOP de alguna manera. En caso negativo, ¿qué reglas debo seguir al adaptar la arquitectura general y los principios de diseño a mi lenguaje particular y caso de uso?

¿Cómo describirías en general la dependencia entre la arquitectura y el lenguaje?

Tristan Tzara
fuente
Escribí un artículo sobre arquitectura de software: Gestión de la complejidad del software linkedin.com/pulse/…
overexchange
En primer lugar, sí, la arquitectura de software se basa en la tecnología que tiene en mente. Por ejemplo: python no aprovecha el subprocesamiento múltiple hasta que esos subprocesos estén vinculados a IO. Esta es una limitación real en la utilización de operaciones vinculadas a CPU de múltiples núcleos. En segundo lugar, debe escuchar esto ... youtu.be/FF-tKLISfPE En tercer lugar, debe analizar / trabajar en productos empresariales distribuidos estables existentes de dominio específico que se implemente de manera escalable, durante al menos 5-6 años. Esta es una comprensión orgánica de cómo la tecnología influye en el diseño. Por cierto ... Tales productos fueron escritos en el mundo pre-java, desde cero.
intercambio excesivo
Tecnología Wrt ... En el mundo Java, hasta el diseño de lenguaje java 5/6/7 tenía el control de los fundadores reales. Desde java 8, consideraría a java como una máquina de propaganda pero no como un lenguaje de programación. En mi opinión, Java se ha convertido en la tecnología de un gerente de proyecto. Entonces, como principiante, analizaría / trabajaría en un producto escrito usando C / C ++ / Python
sobreexchange
No utilice la palabra arquitectura en su pregunta, es confusa. Tu pregunta es sobre diseño. La elección del lenguaje generalmente calificaría como arquitectura, su pregunta no tiene sentido en la forma en que está redactada ..
Martin Maat
También Python y JavaScript no tener interfaces, simplemente no usar una palabra clave separada demarcarlas
Caleth

Respuestas:

11

Una arquitectura de software es muy parecida a la arquitectura de una casa o un puente. Un puente debe soportar el peso de sí mismo y de los vehículos que lo atraviesan o de las personas que lo cruzan. Debe soportar el clima. Los materiales que usa para construirlo deben ser fuertes y relativamente livianos.

Hay muchos materiales que puede usar para construir una casa. Puedes usar ladrillo o estuco. Puedes usar vigas de madera o de metal. Cada material tiene sus propias características, en términos de peso, resistencia, etc. Todas estas características afectan la arquitectura.

De la misma manera, el lenguaje de programación que usa afecta la forma en que construye su arquitectura. Su arquitectura se verá diferente en un lenguaje de programación que tenga clases como C ++ que en un lenguaje de programación que no lo tenga, como C.

Los principios SOLID se refieren principalmente a lenguajes orientados a objetos (es decir, lenguajes que tienen clases).

Robert Harvey
fuente
4

La arquitectura depende de las capacidades para cumplir sus objetivos. Las opciones de idioma pueden limitar las capacidades. Cualquier lenguaje completo de Turing tiene la capacidad de completar cualquier tarea de programación. Después de ese punto, se trata de cuán legible para el ser humano el lenguaje permite que la solución sea.

Muchos esquemas de arquitectura de software le piden que elimine todo el conocimiento de las opciones tecnológicas de las reglas comerciales del dominio central. La única opción técnica de la que nunca puede eliminar el conocimiento del núcleo es el idioma en el que elige expresarlo.

Cuando los libros de Arquitectura se limitan a contarte sobre sus objetivos, el idioma no importa siempre que sea capaz de lograrlo. Cuando los libros le dicen cómo lograr estos objetivos, el lenguaje comienza a ser importante.

naranja confitada
fuente
Buenos puntos en su respuesta, pero estoy seguro, históricamente, la arquitectura de software se implementó con las TECNOLOGÍAS en tendencia.
intercambio excesivo
@overexchange el punto de una buena arquitectura es producir software que pueda sobrevivir a la tendencia actual al estar listo para la próxima.
candied_orange
Al menos en el mundo del middleware, las arquitecturas de producto no pudieron pensar más allá de RPC / RMI / CORBA hasta la década de 1990. Vi diseños clásicos basados ​​en procedimientos para eliminar llamadas. Entonces ServiceOArch cambió la tendencia del middleware, en términos de arquitectura.
intercambio excesivo
2
@CandiedOrange esa es la teoría. En la práctica, he visto a mucha gente hacer lo que a veces se llama "desarrollo impulsado por el bombo", solo hacer de lo que su círculo actual de colegas habla más en el momento del diseño para que pueda participar en esa charla.
marzo
@marstato De acuerdo. El mejor ejemplo es, usar Spring / Springboot en la tendencia actual, para cualquier proyecto nuevo, sin saber, ¿por qué?
intercambio excesivo
1

La arquitectura como término tiene un significado realmente específico que está muy relacionado con la arquitectura en el mundo físico y, en esencia, se trata del arte y la práctica de construir cosas, de cómo se hacen y unen las cosas. Tomado de esa manera, cuando la arquitectura se hace bien, creo que el lenguaje está muy relacionado con la arquitectura, así como un edificio bien diseñado debe estar íntimamente informado por el material con el que está construido.

En software, las elecciones arquitectónicas deben hacerse de una manera que sea congruente con las propiedades del lenguaje. Si está creando un sistema con un lenguaje orientado a objetos, entonces esperaría que la arquitectura del sistema también esté orientada a objetos. Si está construyendo un sistema con un lenguaje funcional, entonces esperaría que la arquitectura de ese sistema también sea funcional.

¿Tener sentido?

RibaldEddie
fuente
¡Gracias por su respuesta! por casualidad, ¿conoce algún recurso que explique la arquitectura del software con respecto a lenguajes dinámicamente tipados o funcionales? tbh todo lo que he visto funciona para, por ejemplo, Java directamente, pero requeriría alguna adaptación para, por ejemplo, js. ¿Cuáles son las posibles pautas para adaptar patrones de arquitectura comunes a un lenguaje débilmente tipado? ¿Debería uno intentarlo o debería ser algo completamente diferente?
Tristan Tzara
Mi preocupación era que si uno usa, por ejemplo, Java, entonces hay muchas mejores prácticas y patrones para la arquitectura, pero no he visto ninguno para lenguajes de diferente tipo. así que me preguntaba cómo tratarlos
Tristan Tzara
Básicamente, por ejemplo, ¿SÓLIDO se mantiene en ese caso? ¿Cómo se adapta si es así? ¿Qué se supone que debe hacer si no?
Tristan Tzara
Los principios SÓLIDOS tienen un origen muy orientado a objetos. Sin embargo, creo que codifican principios de orden superior que podrían ser aplicables a cualquier sistema de software independientemente del idioma. Pero los principios rudimentarios son exactamente eso: debe conocerlos y comprenderlos antes de construir mucho más allá de un comedero para pájaros.
RibaldEddie
@TristanTzara La programación orientada a objetos se inventó antes y sin ningún lenguaje orientado a objetos. Puedes hacerlo en cualquier lenguaje de propósito general. Incluso aquellos que no tienen clases.
candied_orange
1

Para empezar, diría que incluso el lenguaje en el que piensas tiene una profunda influencia en lo que puedes concebir. Hay una razón por la cual PASCAL fue creado por Niklaus Wirth y C por Brian Kernighan y Dennis Ritchie.

En un nivel superior, la capacidad de expresar ciertos conceptos (y la falta de otros) dirigirá su pensamiento y lo hará llegar a ciertas soluciones que no necesariamente serían la misma persona, con un fondo diferente.

Finalmente, los conceptos que menciona pueden implementarse en cualquier lenguaje de propósito general. Es solo que pueden no tener soporte sintáctico y la implementación puede ser engorrosa. Puede escribir código de ensamblaje x86 orientado a objetos si está lo suficientemente comprometido (o lo suficientemente loco) como podría hacerlo con C. De hecho, las primeras implementaciones de C ++ fueron preprocesadores que compilaron su código de C ++ en C (y los nombres de símbolos mutilados hechos depuración mucho más divertido).

rbanffy
fuente