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

From version 3.11
edited by chrisby
on 2024/03/03 17:01
Change comment: Update document after refactoring.
To version 2.3
edited by chrisby
on 2024/03/03 14:44
Change comment: There is no comment for this version

Summary

Details

Page properties
Parent
... ... @@ -1,1 +1,1 @@
1 -Software Engineering.Clean Code.Objects and Data Structures.WebHome
1 +Main.WebHome
Content
... ... @@ -1,42 +1,30 @@
1 -### Use Cases
1 +asd
2 2  
3 -This example is intended to demonstrate the extensibility differences between data structures and objects by extending them with
3 +```
4 +type Square struct {
5 + length float
6 +}
4 4  
5 -1. an Area() function (extending behavior)
6 -1. a rectangle type (extending data type)
8 +type Circle struct {
9 + length float
10 +}
7 7  
8 -### Data Structure Style
12 +func Area(g GeometricObject) float {
13 + switch (g.type()):
14 + case Circle:
15 + return
16 + case Square:
17 + return ...
18 +}
9 9  
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 - }
20 +func Circumference(g GeometricObject) float {
21 + ...
22 +}
23 +```
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.
30 -
31 -####
32 -
33 33  #### Object-Oriented Style
34 34  
35 - interface GeometricObject {
36 - Circumference() float
37 - }
38 -
39 - class Square implements GeometricObject {
27 + class Square {
40 40   length float
41 41  
42 42   constructor(length float) {
... ... @@ -43,12 +43,16 @@
43 43   this.length = length
44 44   }
45 45  
34 + func Area() float {
35 + return this.length * this.length
36 + }
37 +
46 46   func Circumference() float {
47 47   return 4 * this.length
48 48   }
49 49   }
50 50  
51 - class Circle implements GeometricObject {
43 + class Circle {
52 52   radius float
53 53  
54 54   constructor(radius float) {
... ... @@ -55,15 +55,11 @@
55 55   this.radius = radius
56 56   }
57 57  
50 + func Area() float {
51 + return PI * this.radius * this.radius
52 + }
53 +
58 58   func Circumference() float {
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 here is that data structures are easy to extend with functions and hard to extend with data type, and objects are easy to extend with other objects but hard to extend with functionality.
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.