Skip to content

Commit 9fd613c

Browse files
authored
Merge pull request mouredev#4714 from miguelex/main
#27 - php
2 parents bc51e1e + 846e194 commit 9fd613c

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
<?php
2+
3+
// Ejercicio Básico
4+
5+
class Rectangle {
6+
public $width;
7+
public $height;
8+
9+
public function __construct($width, $height) {
10+
$this->width = $width;
11+
$this->height = $height;
12+
}
13+
}
14+
15+
class Circle {
16+
public $radius;
17+
18+
public function __construct($radius) {
19+
$this->radius = $radius;
20+
}
21+
}
22+
23+
class AreaCalculator {
24+
public function calculate($shapes) {
25+
$area = 0;
26+
foreach ($shapes as $shape) {
27+
if ($shape instanceof Rectangle) {
28+
echo "\nEl area del rectangulo es: ". $shape->width * $shape->height;
29+
} elseif ($shape instanceof Circle) {
30+
echo "\nEl area del circulo es: ". pi() * $shape->radius * $shape->radius;
31+
}
32+
}
33+
}
34+
}
35+
36+
$shapes = [
37+
new Rectangle(5, 10),
38+
new Circle(7)
39+
];
40+
41+
echo "Ejercicio básico (sin cumplir OCP)";
42+
$calculator = new AreaCalculator();
43+
echo $calculator->calculate($shapes);
44+
45+
// El problema de esta solución es que si ahroa creamos una clase triangle (por ejemplo) y queremos calcualr su área, debemos modificar AreaCalculator para tener en cuenta la nueva forma
46+
47+
interface Shape {
48+
public function area();
49+
}
50+
51+
class Rectangle2 implements Shape {
52+
private $width;
53+
private $height;
54+
55+
public function __construct($width, $height) {
56+
$this->width = $width;
57+
$this->height = $height;
58+
}
59+
60+
public function area() {
61+
return $this->width * $this->height;
62+
}
63+
}
64+
65+
class Circle2 implements Shape {
66+
private $radius;
67+
68+
public function __construct($radius) {
69+
$this->radius = $radius;
70+
}
71+
72+
public function area() {
73+
return pi() * $this->radius * $this->radius;
74+
}
75+
}
76+
77+
class AreaCalculator2 {
78+
public function calculate($shapes) {
79+
80+
foreach ($shapes as $shape) {
81+
echo "\nEl área de la forma es: ". $shape->area();
82+
}
83+
}
84+
}
85+
86+
$shapes = [
87+
new Rectangle2(5, 10),
88+
new Circle2(7)
89+
];
90+
91+
echo "\nEjercicio básico (cumpliendo OCP)";
92+
$calculator = new AreaCalculator2();
93+
echo $calculator->calculate($shapes);
94+
95+
// Con este enfoque, la clase Triangle tendría su propia definición de como calcular el área y AreaCalculator2 no se tendría que modificar
96+
97+
// Ejercicio Extra
98+
99+
interface Operation {
100+
public function calculate ($a, $b);
101+
}
102+
103+
class Sum implements Operation {
104+
public function calculate($a, $b) {
105+
return $a + $b;
106+
}
107+
}
108+
109+
class Substract implements Operation {
110+
public function calculate($a, $b) {
111+
return $a - $b;
112+
}
113+
}
114+
115+
class Multiply implements Operation {
116+
public function calculate($a, $b) {
117+
return $a * $b;
118+
}
119+
}
120+
121+
class Divition implements Operation{
122+
public function calculate($a, $b) {
123+
return $a / $b;
124+
}
125+
}
126+
127+
class Calculator {
128+
public function calculate($operation, $a, $b) {
129+
return $operation->calculate($a, $b);
130+
}
131+
}
132+
133+
$calculator = new Calculator();
134+
echo "\nEjercicio extra";
135+
echo "\nLa suma de 5 y 10 es: ". $calculator->calculate(new Sum(), 5, 10);
136+
echo "\nLa resta de 5 y 10 es: ". $calculator->calculate(new Substract(), 5, 10);
137+
echo "\nLa multiplicación de 5 y 10 es: ". $calculator->calculate(new Multiply(), 5, 10);
138+
echo "\nLa división de 5 y 10 es: ". $calculator->calculate(new Divition(), 5, 10);
139+
140+
// A continuación vamos a añadir la operación potencia.
141+
142+
class Power implements Operation {
143+
public function calculate($a, $b) {
144+
return pow($a, $b);
145+
}
146+
}
147+
148+
echo "\nLa potencia de 5 y 10 es: ". $calculator->calculate(new Power(), 5, 10);
149+
150+
// Como vemos, no hemos tenido que modificar nada en la clase Calculator

0 commit comments

Comments
 (0)