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

From version 3.2
edited by chrisby
on 2024/03/03 14:50
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,32 +1,42 @@
1 +### Use Cases
2 +
3 +This example is intended to demonstrate the extensibility differences between data structures and objects by extending them with
4 +
5 +1. an Area() function (extending behavior)
6 +1. a rectangle type (extending data type)
7 +
1 1  ### Data Structure Style
2 2  
3 - type Square struct {
10 + interface GeometricObject {}
11 +
12 + class Square implements GeometricObject {
4 4   length float
5 5   }
6 6  
7 - type Circle struct {
16 + class Circle implements GeometricObject {
8 8   radius float
9 9   }
10 10  
11 - func Area(g GeometricObject) float {
20 + function Circumference(g GeometricObject) float {
12 12   switch type(g):
13 13   case Square:
14 - return g.length * g.length
15 - case Circle:
16 - return PI * g.radius * g.radius
17 - }
18 -
19 - func Circumference(g GeometricObject) float {
20 - switch type(g):
21 - case Square:
22 22   return 4 * g.length
23 23   case Circle:
24 24   return 2 * PI * g.radius
25 25   }
26 26  
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 +
27 27  #### Object-Oriented Style
28 28  
29 - class Square {
35 + interface GeometricObject {
36 + Circumference() float
37 + }
38 +
39 + class Square implements GeometricObject {
30 30   length float
31 31  
32 32   constructor(length float) {
... ... @@ -33,16 +33,12 @@
33 33   this.length = length
34 34   }
35 35  
36 - func Area() float {
37 - return this.length * this.length
38 - }
39 -
40 40   func Circumference() float {
41 41   return 4 * this.length
42 42   }
43 43   }
44 44  
45 - class Circle {
51 + class Circle implements GeometricObject {
46 46   radius float
47 47  
48 48   constructor(radius float) {
... ... @@ -49,11 +49,15 @@
49 49   this.radius = radius
50 50   }
51 51  
52 - func Area() float {
53 - return PI * this.radius * this.radius
54 - }
55 -
56 56   func Circumference() float {
57 57   return 2 * PI * this.radius
58 58   }
59 59   }
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.