Skip to content

Commit 620131d

Browse files
committed
added smalltalk
1 parent 6c3d6c6 commit 620131d

File tree

6 files changed

+99
-39
lines changed

6 files changed

+99
-39
lines changed

docs/search-index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/sitemap.xml

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,146 +2,146 @@
22
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
33
<url>
44
<loc>https://elixircl.github.io/elixir-fullstack/abstract.html</loc>
5-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
5+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
66
</url>
77
<url>
88
<loc>https://elixircl.github.io/elixir-fullstack/afterword.html</loc>
9-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
9+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
1010
</url>
1111
<url>
1212
<loc>https://elixircl.github.io/elixir-fullstack/authors.html</loc>
13-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
13+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
1414
</url>
1515
<url>
1616
<loc>https://elixircl.github.io/elixir-fullstack/bibliography.html</loc>
17-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
17+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
1818
</url>
1919
<url>
2020
<loc>https://elixircl.github.io/elixir-fullstack/book.html</loc>
21-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
21+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
2222
</url>
2323
<url>
2424
<loc>https://elixircl.github.io/elixir-fullstack/colophon.html</loc>
25-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
25+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
2626
</url>
2727
<url>
2828
<loc>https://elixircl.github.io/elixir-fullstack/dedication.html</loc>
29-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
29+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
3030
</url>
3131
<url>
3232
<loc>https://elixircl.github.io/elixir-fullstack/devops/devenvs.html</loc>
33-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
33+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
3434
</url>
3535
<url>
3636
<loc>https://elixircl.github.io/elixir-fullstack/devops/dora.html</loc>
37-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
37+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
3838
</url>
3939
<url>
4040
<loc>https://elixircl.github.io/elixir-fullstack/devops/golden.html</loc>
41-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
41+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
4242
</url>
4343
<url>
4444
<loc>https://elixircl.github.io/elixir-fullstack/devops/observability.html</loc>
45-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
45+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
4646
</url>
4747
<url>
4848
<loc>https://elixircl.github.io/elixir-fullstack/ecosystem/ecosystem.html</loc>
49-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
49+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
5050
</url>
5151
<url>
5252
<loc>https://elixircl.github.io/elixir-fullstack/elixir/chapter.html</loc>
53-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
53+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
5454
</url>
5555
<url>
5656
<loc>https://elixircl.github.io/elixir-fullstack/foreword.html</loc>
57-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
57+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
5858
</url>
5959
<url>
6060
<loc>https://elixircl.github.io/elixir-fullstack/github/chapter.html</loc>
61-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
61+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
6262
</url>
6363
<url>
6464
<loc>https://elixircl.github.io/elixir-fullstack/glossary.html</loc>
65-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
65+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
6666
</url>
6767
<url>
6868
<loc>https://elixircl.github.io/elixir-fullstack/history/chapter.html</loc>
69-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
69+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
7070
</url>
7171
<url>
7272
<loc>https://elixircl.github.io/elixir-fullstack/hosting/chapter.html</loc>
73-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
73+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
7474
</url>
7575
<url>
7676
<loc>https://elixircl.github.io/elixir-fullstack/html/chapter.html</loc>
77-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
77+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
7878
</url>
7979
<url>
8080
<loc>https://elixircl.github.io/elixir-fullstack/http/chapter.html</loc>
81-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
81+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
8282
</url>
8383
<url>
8484
<loc>https://elixircl.github.io/elixir-fullstack/index.html</loc>
85-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
85+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
8686
</url>
8787
<url>
8888
<loc>https://elixircl.github.io/elixir-fullstack/javascript/chapter.html</loc>
89-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
89+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
9090
</url>
9191
<url>
9292
<loc>https://elixircl.github.io/elixir-fullstack/jobs/chapter.html</loc>
93-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
93+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
9494
</url>
9595
<url>
9696
<loc>https://elixircl.github.io/elixir-fullstack/mobile/chapter.html</loc>
97-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
97+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
9898
</url>
9999
<url>
100100
<loc>https://elixircl.github.io/elixir-fullstack/mobile/punteo.html</loc>
101-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
101+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
102102
</url>
103103
<url>
104104
<loc>https://elixircl.github.io/elixir-fullstack/networking/chapter.html</loc>
105-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
105+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
106106
</url>
107107
<url>
108108
<loc>https://elixircl.github.io/elixir-fullstack/security/chapter.html</loc>
109-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
109+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
110110
</url>
111111
<url>
112112
<loc>https://elixircl.github.io/elixir-fullstack/swe/adr.html</loc>
113-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
113+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
114114
</url>
115115
<url>
116116
<loc>https://elixircl.github.io/elixir-fullstack/swe/deprecation.html</loc>
117-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
117+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
118118
</url>
119119
<url>
120120
<loc>https://elixircl.github.io/elixir-fullstack/swe/patterns.html</loc>
121-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
121+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
122122
</url>
123123
<url>
124124
<loc>https://elixircl.github.io/elixir-fullstack/swe/prd.html</loc>
125-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
125+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
126126
</url>
127127
<url>
128128
<loc>https://elixircl.github.io/elixir-fullstack/swe/roles.html</loc>
129-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
129+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
130130
</url>
131131
<url>
132132
<loc>https://elixircl.github.io/elixir-fullstack/swe/stages.html</loc>
133-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
133+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
134134
</url>
135135
<url>
136136
<loc>https://elixircl.github.io/elixir-fullstack/swe/uat.html</loc>
137-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
137+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
138138
</url>
139139
<url>
140140
<loc>https://elixircl.github.io/elixir-fullstack/swe/wow.html</loc>
141-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
141+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
142142
</url>
143143
<url>
144144
<loc>https://elixircl.github.io/elixir-fullstack/systemd/chapter.html</loc>
145-
<lastmod>2025-09-05T14:34:20.106Z</lastmod>
145+
<lastmod>2025-09-07T19:24:01.895Z</lastmod>
146146
</url>
147147
</urlset>
10.4 KB
Loading

docs/swe/patterns.html

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,45 @@ <h2 id="patrón-modelo-vista-controlador"><a class="anchor" href="#patrón-model
401401
</ul>
402402
</div>
403403
<div class="paragraph">
404-
<p>El principal problema de MVC y por qué razón nacieron otros patrones derivados es debido a la tendencia de que los controladores crecían de forma exponencial. Incluso llegando a ser llamado Massive View Controllers, por la cantidad de responsabilidades que tenían que cumplir.</p>
404+
<p>El principal problema de MVC y por qué razón nacieron otros patrones derivados es debido a la tendencia de que los controladores crecían de forma exponencial. Incluso llegando a ser llamado <em>"Massive View Controllers"</em>, por la cantidad de responsabilidades que tenían que cumplir.</p>
405+
</div>
406+
<div class="paragraph">
407+
<p>En su origen en <a href="https://stlab.cc/tips/about-mvc.html">SmallTalk</a> el patrón representaba tres conceptos fundamentales. El <em>Modelo</em> (Datos y sus validaciones), la <em>Vista</em> (Presentación) y el <em>Controlador</em> (Lógica de Negocios) que tenían una relación como se muestra en la siguiente figura.</p>
408+
</div>
409+
<div class="paragraph">
410+
<div class="title">MVC en SmallTalk</div>
411+
<p><span class="image"><img src="_images/mvc-structure-smalltalk.png" alt="mvc structure smalltalk"></span></p>
412+
</div>
413+
<div class="paragraph">
414+
<p>En la figura las líneas continuas implican una asociación directa. Las líneas discontinuas, una asociación indirecta por parte de un observador. Por lo tanto, se puede notar que el modelo desconoce la vista y el controlador, excepto indirectamente mediante notificaciones, y por lo tanto, el código del modelo es reutilizable. El controlador y la vista se vinculan al modelo, no al revés.</p>
415+
</div>
416+
<div class="paragraph">
417+
<p>La función de la vista y el controlador está fuertemente acoplada, pero no significa que el controlador tenga la responsabilidad sobre múltiples vistas. Apple se desvió de la versión de <em>SmallTalk</em> original al promover un controlador masivo para múltiples vistas y modelos, por lo que se entiende una diferencia entre <em>SmallTalk MVC</em> y <em>Cocoa MVC</em> (Apple). Esto pudo ser consecuencia de las limitaciones en lenguajes como <em>C</em> y <em>Pascal</em> que no contaban con las características de <em>SmallTalk</em> que facilitaban la observabilidad de propiedades.</p>
418+
</div>
419+
<div class="paragraph">
420+
<p>Para entender bien este patrón se debe mencionar que el <em>Modelo</em> es un objeto que puede ser observado y que encapsula la lógica compleja de las relaciones entre sus propiedades. Es decir, si ocurre un cambio de estado debe lanzar un evento que notifique a la vista y esta a su vez al controlador para que estos puedan actualizar sus estados internos. El modelo es independiente y no interactúa directamente con la vista o el controlador. El estado de la vista siempre debe ser el último estado del modelo. Como mínimo una vista debe ser notificada de las siguientes cosas:</p>
421+
</div>
422+
<div class="olist arabic">
423+
<ol class="arabic">
424+
<li>
425+
<p>¿Qué cambió?. Puede ser una notificación tan simple como "El modelo asociado a la vista".</p>
426+
</li>
427+
<li>
428+
<p>El nuevo valor a mostrar.</p>
429+
</li>
430+
</ol>
431+
</div>
432+
<div class="paragraph">
433+
<p>Para una implementación robusta el <em>Modelo</em> debe ser capaz de notificar exactamente las partes que han cambiado y cómo han cambiado. De esta forma logrando ser compatible con cualquier tipo de vista presente o futura. Como este patrón es compuesto, puede llegar a ocurrir que se necesite un modelo exclusivo para la vista y su estado actual (tamaño de ventana, entre otros), el cual también debe ser observable. Es decir, una vista puede estar escuchando notificaciones de múltiples modelos, incluso uno exclusivo para su estado interno.</p>
434+
</div>
435+
<div class="paragraph">
436+
<p>La identificación y correcta definición del <em>Modelo</em> es vital para un sistema bien diseñado. Es común identificar modelos generales como "Imagen", pero un mejor modelo debe considerar los detalles adicionales como "Imagen con configuraciones". Una buena técnica es crear modelos según los parámetros de las funciones de la lógica de negocios.</p>
437+
</div>
438+
<div class="paragraph">
439+
<p>Un ejemplo sería un botón asociado a eliminar una selección de archivos. Ésta eliminación de archivos está vinculada a una función que requiere una cantidad de parámetros y valores específicos (como ruta del archivo) para su correcta ejecución.</p>
440+
</div>
441+
<div class="paragraph">
442+
<p>Entonces el <em>Modelo</em> asociado a esta función construiría los parámetros necesarios y sus validaciones (como que el nombre del archivo exista y no sea nulo). Ésta validación puede ser observable por la <em>Vista</em> para habilitar/deshabilitar el botón según si es posible eliminar o no. Éste mismo <em>Modelo</em> puede ser reutilizado en distintas vistas y controladores dentro de la aplicación.</p>
405443
</div>
406444
<div class="sect2">
407445
<h3 id="modelo"><a class="anchor" href="#modelo"></a>Modelo</h3>
10.4 KB
Loading

modules/swe/pages/patterns.adoc

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,29 @@ image:applemvc.png[Apple MVC]
7171

7272
- https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/index.html
7373

74-
El principal problema de MVC y por qué razón nacieron otros patrones derivados es debido a la tendencia de que los controladores crecían de forma exponencial. Incluso llegando a ser llamado Massive View Controllers, por la cantidad de responsabilidades que tenían que cumplir.
74+
El principal problema de MVC y por qué razón nacieron otros patrones derivados es debido a la tendencia de que los controladores crecían de forma exponencial. Incluso llegando a ser llamado _"Massive View Controllers"_, por la cantidad de responsabilidades que tenían que cumplir.
75+
76+
En su origen en https://stlab.cc/tips/about-mvc.html[SmallTalk] el patrón representaba tres conceptos fundamentales. El _Modelo_ (Datos y sus validaciones), la _Vista_ (Presentación) y el _Controlador_ (Lógica de Negocios) que tenían una relación como se muestra en la siguiente figura.
77+
78+
.MVC en SmallTalk
79+
image:mvc-structure-smalltalk.png[]
80+
81+
En la figura las líneas continuas implican una asociación directa. Las líneas discontinuas, una asociación indirecta por parte de un observador. Por lo tanto, se puede notar que el modelo desconoce la vista y el controlador, excepto indirectamente mediante notificaciones, y por lo tanto, el código del modelo es reutilizable. El controlador y la vista se vinculan al modelo, no al revés.
82+
83+
La función de la vista y el controlador está fuertemente acoplada, pero no significa que el controlador tenga la responsabilidad sobre múltiples vistas. Apple se desvió de la versión de _SmallTalk_ original al promover un controlador masivo para múltiples vistas y modelos, por lo que se entiende una diferencia entre _SmallTalk MVC_ y _Cocoa MVC_ (Apple). Esto pudo ser consecuencia de las limitaciones en lenguajes como _C_ y _Pascal_ que no contaban con las características de _SmallTalk_ que facilitaban la observabilidad de propiedades.
84+
85+
Para entender bien este patrón se debe mencionar que el _Modelo_ es un objeto que puede ser observado y que encapsula la lógica compleja de las relaciones entre sus propiedades. Es decir, si ocurre un cambio de estado debe lanzar un evento que notifique a la vista y esta a su vez al controlador para que estos puedan actualizar sus estados internos. El modelo es independiente y no interactúa directamente con la vista o el controlador. El estado de la vista siempre debe ser el último estado del modelo. Como mínimo una vista debe ser notificada de las siguientes cosas:
86+
87+
. ¿Qué cambió?. Puede ser una notificación tan simple como "El modelo asociado a la vista".
88+
. El nuevo valor a mostrar.
89+
90+
Para una implementación robusta el _Modelo_ debe ser capaz de notificar exactamente las partes que han cambiado y cómo han cambiado. De esta forma logrando ser compatible con cualquier tipo de vista presente o futura. Como este patrón es compuesto, puede llegar a ocurrir que se necesite un modelo exclusivo para la vista y su estado actual (tamaño de ventana, entre otros), el cual también debe ser observable. Es decir, una vista puede estar escuchando notificaciones de múltiples modelos, incluso uno exclusivo para su estado interno.
91+
92+
La identificación y correcta definición del _Modelo_ es vital para un sistema bien diseñado. Es común identificar modelos generales como "Imagen", pero un mejor modelo debe considerar los detalles adicionales como "Imagen con configuraciones". Una buena técnica es crear modelos según los parámetros de las funciones de la lógica de negocios.
93+
94+
Un ejemplo sería un botón asociado a eliminar una selección de archivos. Ésta eliminación de archivos está vinculada a una función que requiere una cantidad de parámetros y valores específicos (como ruta del archivo) para su correcta ejecución.
95+
Entonces el _Modelo_ asociado a esta función construiría los parámetros necesarios y sus validaciones (como que el nombre del archivo exista y no sea nulo). Ésta validación puede ser observable por la _Vista_ para habilitar/deshabilitar el botón según si es posible eliminar o no. Éste mismo _Modelo_ puede ser reutilizado en distintas vistas y controladores dentro de la aplicación.
96+
7597

7698
=== Modelo
7799

0 commit comments

Comments
 (0)