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

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

Summary

Details

Page properties
Content
... ... @@ -7,17 +7,15 @@
7 7  
8 8  ### Data Structure Style
9 9  
10 - interface GeometricObject {}
11 -
12 - class Square implements GeometricObject {
10 + type Square struct {
13 13   length float
14 14   }
15 15  
16 - class Circle implements GeometricObject {
14 + type Circle struct {
17 17   radius float
18 18   }
19 19  
20 - function Circumference(g GeometricObject) float {
18 + func Circumference(g Object) float {
21 21   switch type(g):
22 22   case Square:
23 23   return 4 * g.length
... ... @@ -25,8 +25,7 @@
25 25   return 2 * PI * g.radius
26 26   }
27 27  
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.
26 +1.
30 30  
31 31  ####
32 32  
... ... @@ -59,11 +59,3 @@
59 59   return 2 * PI * this.radius
60 60   }
61 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.