Last modified by chrisby on 2024/03/03 17:01

From version 2.1
edited by chrisby
on 2024/03/03 14:41
Change comment: There is no comment for this version
To version 3.8
edited by chrisby
on 2024/03/03 15:34
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -1,25 +1,69 @@
1 -asd
1 +### Use Cases
2 2  
3 -```
4 -type Square struct {
5 - length float
6 -}
3 +This example is intended to demonstrate the extensibility differences between data structures and objects by extending them with
7 7  
8 -type Circle struct {
9 - length float
10 -}
5 +1. an Area() function (extending behavior)
6 +1. a rectangle type (extending data type)
11 11  
12 -func Area(g GeometricObject) float {
13 - switch (g.type()):
14 - case Circle:
15 - return
16 - case Square:
17 - return ...
18 -}
8 +### Data Structure Style
19 19  
20 -func Circumference(g GeometricObject) float {
21 - ...
22 -}
23 -```
10 + interface GeometricObject {}
11 +
12 + class Square implements GeometricObject {
13 + length float
14 + }
15 +
16 + class Circle implements GeometricObject {
17 + radius float
18 + }
19 +
20 + function Circumference(g GeometricObject) float {
21 + switch type(g):
22 + case Square:
23 + return 4 * g.length
24 + case Circle:
25 + return 2 * PI * g.radius
26 + }
24 24  
25 -asd
28 +1. Adding an Area() function with a very similar anatomy to Circumference() is easy because it only requires adding new code.
29 +1. Adding a new datatype, Rectangle, is harder because it requires touching existing code, namely any functions like Circumference() or Area() that need to be enabled handle this datatype.
30 +
31 +####
32 +
33 +#### Object-Oriented Style
34 +
35 + interface GeometricObject {
36 + Circumference() float
37 + }
38 +
39 + class Square implements GeometricObject {
40 + length float
41 +
42 + constructor(length float) {
43 + this.length = length
44 + }
45 +
46 + func Circumference() float {
47 + return 4 * this.length
48 + }
49 + }
50 +
51 + class Circle implements GeometricObject {
52 + radius float
53 +
54 + constructor(radius float) {
55 + this.radius = radius
56 + }
57 +
58 + func Circumference() float {
59 + return 2 * PI * this.radius
60 + }
61 + }
62 +
63 +1. Adding a function Area() to the GeometricObject interface is hard because it requires touching existing code, namely extending all Square and Circle classes with the new function.
64 +1. Adding a new datatype, Rectangle, is easy because only new code is added, namely a Rectangle class.
65 +
66 +### Conclusion
67 +
68 +* The lesson learned here is that data structures are easy to extend with functions, and objects are easy to extend with data types.
69 +* Although the difference between the two styles may seem insignificant in this simplified example, it has serious implications in complex production codebases with multiple data types and behaviors.