1+ const readline = require ( 'readline' )
2+
3+ const rl = readline . createInterface ( {
4+ input : process . stdin ,
5+ output : process . stdout
6+ } )
7+
8+ /*
9+ * EJERCICIO:
10+ * Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)"
11+ * y crea un ejemplo simple donde se muestre su funcionamiento
12+ * de forma correcta e incorrecta.
13+ */
14+
15+ // Funcionamiento incorrecto
16+
17+ /*
18+ class ShopVehicles {
19+ saleBus() {
20+ console.log('Se ha vendido un Bus')
21+ }
22+
23+ saleCar() {
24+ console.log('Se ha vendido un auto')
25+ }
26+ }
27+ */
28+
29+ // Funcionamiento correcto:
30+
31+ class ShopVehicles {
32+ sale ( ) {
33+ console . log ( 'Se ha vendido un auto' )
34+ }
35+ }
36+
37+ class saleTruck extends ShopVehicles {
38+ sale ( ) {
39+ console . log ( 'Se ha vendido un camión' )
40+ }
41+ }
42+
43+ class saleBus extends ShopVehicles {
44+ sale ( ) {
45+ console . log ( 'Se ha vendido un bus' )
46+ }
47+ }
48+
49+ const saleTruck1 = new saleTruck ( )
50+ saleTruck1 . sale ( )
51+
52+ const saleBus1 = new saleBus ( )
53+ saleBus1 . sale ( )
54+
55+ /*
56+ * DIFICULTAD EXTRA (opcional):
57+ * Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas.
58+ * Requisitos:
59+ * - Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP.
60+ * Instrucciones:
61+ * 1. Implementa las operaciones de suma, resta, multiplicación y división.
62+ * 2. Comprueba que el sistema funciona.
63+ * 3. Agrega una quinta operación para calcular potencias.
64+ * 4. Comprueba que se cumple el OCP.
65+ */
66+
67+ class Calculator {
68+ operation ( ) { return }
69+ }
70+
71+ class AdditionOperation extends Calculator {
72+ operation ( a , b ) {
73+ return `${ a } + ${ b } = ${ a + b } `
74+ }
75+ }
76+
77+ class SubtractionOperation extends Calculator {
78+ operation ( a , b ) {
79+ return `${ a } - ${ b } = ${ a - b } `
80+ }
81+ }
82+
83+ class MultiplyOperation extends Calculator {
84+ operation ( a , b ) {
85+ return `${ a } * ${ b } = ${ a * b } `
86+ }
87+ }
88+
89+ class DivideOperation extends Calculator {
90+ operation ( a , b ) {
91+ if ( b === 0 ) throw new Error ( 'No se puede dividir por cero' )
92+ return `${ a } / ${ b } = ${ a / b } `
93+ }
94+ }
95+
96+ class ExponentiationOperation extends Calculator {
97+ operation ( a , b ) {
98+ return `${ a } ** ${ b } = ${ a ** b } `
99+ }
100+ }
101+
102+ function MenuCalculator ( ) {
103+ console . log ( '1 - Sumar' )
104+ console . log ( '2 - Restar' )
105+ console . log ( '3 - Multiplicar' )
106+ console . log ( '4 - Dividir' )
107+ console . log ( '5 - Potencia' )
108+ console . log ( '0 - Salir' )
109+
110+ rl . question ( 'Selección: ' , ( option ) => {
111+ if ( option == '1' ) {
112+ rl . question ( 'Ingresa el numero A: ' , ( numberA ) => {
113+ rl . question ( 'Ingresa el numero B: ' , ( numberB ) => {
114+ const addition = new AdditionOperation ( )
115+ console . log ( addition . operation ( parseInt ( numberA ) , parseInt ( numberB ) ) )
116+ MenuCalculator ( )
117+ } )
118+ } )
119+ } else if ( option == '2' ) {
120+ rl . question ( 'Ingresa el numero A: ' , ( numberA ) => {
121+ rl . question ( 'Ingresa el numero B: ' , ( numberB ) => {
122+ const substraction = new SubtractionOperation ( )
123+ console . log ( substraction . operation ( parseInt ( numberA ) , parseInt ( numberB ) ) )
124+ MenuCalculator ( )
125+ } )
126+ } )
127+ } else if ( option == '3' ) {
128+ rl . question ( 'Ingresa el numero A: ' , ( numberA ) => {
129+ rl . question ( 'Ingresa el numero B: ' , ( numberB ) => {
130+ const multiply = new MultiplyOperation ( )
131+ console . log ( multiply . operation ( parseInt ( numberA ) , parseInt ( numberB ) ) )
132+ MenuCalculator ( )
133+ } )
134+ } )
135+ } else if ( option == '4' ) {
136+ rl . question ( 'Ingresa el numero A: ' , ( numberA ) => {
137+ rl . question ( 'Ingresa el numero B: ' , ( numberB ) => {
138+ const divide = new DivideOperation ( )
139+ console . log ( divide . operation ( parseInt ( numberA ) , parseInt ( numberB ) ) )
140+ MenuCalculator ( )
141+ } )
142+ } )
143+ } else if ( option == '5' ) {
144+ rl . question ( 'Ingresa el numero A: ' , ( numberA ) => {
145+ rl . question ( 'Ingresa el numero B: ' , ( numberB ) => {
146+ const exponentiation = new ExponentiationOperation ( )
147+ console . log ( exponentiation . operation ( parseInt ( numberA ) , parseInt ( numberB ) ) )
148+ MenuCalculator ( )
149+ } )
150+ } )
151+ } else if ( option == '0' ) {
152+ rl . close ( )
153+ } else {
154+ console . log ( 'Opción inválida' )
155+ MenuCalculator ( )
156+ }
157+ } )
158+ }
159+
160+ MenuCalculator ( )
0 commit comments