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

From version 3.4
edited by chrisby
on 2024/03/03 15:06
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
... ... @@ -7,15 +7,17 @@
7 7  
8 8  ### Data Structure Style
9 9  
10 - type Square struct {
10 + interface GeometricObject {}
11 +
12 + class Square implements GeometricObject {
11 11   length float
12 12   }
13 13  
14 - type Circle struct {
16 + class Circle implements GeometricObject {
15 15   radius float
16 16   }
17 17  
18 - func Circumference(g Object) float {
20 + function Circumference(g GeometricObject) float {
19 19   switch type(g):
20 20   case Square:
21 21   return 4 * g.length
... ... @@ -23,7 +23,8 @@
23 23   return 2 * PI * g.radius
24 24   }
25 25  
26 -1.
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.
27 27  
28 28  ####
29 29  
... ... @@ -56,3 +56,11 @@
56 56   return 2 * PI * this.radius
57 57   }
58 58   }
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.