1
00:00:01,350 --> 00:00:03,090
<v ->(instructor)So before we continue</v>

2
00:00:03,090 --> 00:00:05,250
any further in our project,

3
00:00:05,250 --> 00:00:07,000
we should now think a little bit

4
00:00:07,000 --> 00:00:09,433
about our project Architecture.

5
00:00:11,140 --> 00:00:13,220
Now, there are some quite advanced

6
00:00:13,220 --> 00:00:15,970
architecture patterns in JavaScript.

7
00:00:15,970 --> 00:00:18,720
And we will actually talk a little bit about this

8
00:00:18,720 --> 00:00:20,780
by the end of the course.

9
00:00:20,780 --> 00:00:22,380
But in this small project,

10
00:00:22,380 --> 00:00:25,970
we will simply use object oriented programming with classes,

11
00:00:25,970 --> 00:00:28,970
just like we learned in the last section.

12
00:00:28,970 --> 00:00:29,950
And so this way,

13
00:00:29,950 --> 00:00:34,170
you can then use these concepts here in a real project.

14
00:00:34,170 --> 00:00:37,380
And remember that Architecture is all about

15
00:00:37,380 --> 00:00:40,060
giving the project a structure.

16
00:00:40,060 --> 00:00:41,740
And so in that structure,

17
00:00:41,740 --> 00:00:44,670
we can then develop the functionality.

18
00:00:44,670 --> 00:00:46,670
And so in this project,

19
00:00:46,670 --> 00:00:48,790
I decided that the main structure

20
00:00:48,790 --> 00:00:52,580
will come from classes and objects.

21
00:00:52,580 --> 00:00:55,470
All right, so let's now dig a little bit deeper

22
00:00:55,470 --> 00:00:58,900
into this Architecture that we gonna use.

23
00:00:58,900 --> 00:01:02,290
So to start, one of the most important aspects

24
00:01:02,290 --> 00:01:04,070
of any Architecture,

25
00:01:04,070 --> 00:01:08,040
is to decide where and how to store the data.

26
00:01:08,040 --> 00:01:09,980
Because data is probably

27
00:01:09,980 --> 00:01:13,660
the most fundamental part of any application.

28
00:01:13,660 --> 00:01:16,860
Because without data, it doesn't even make sense

29
00:01:16,860 --> 00:01:19,800
to have an application in the first place.

30
00:01:19,800 --> 00:01:22,720
Right, what would the application be about,

31
00:01:22,720 --> 00:01:25,840
if not about some sort of data.

32
00:01:25,840 --> 00:01:28,620
Now, in this case, the data that we need to store

33
00:01:28,620 --> 00:01:32,530
and to manage comes directly from the user stories.

34
00:01:32,530 --> 00:01:34,610
So right in the first user story,

35
00:01:34,610 --> 00:01:36,910
we can already see that we will somehow

36
00:01:36,910 --> 00:01:40,040
need to store the location, distance,

37
00:01:40,040 --> 00:01:43,320
time, pace, and steps per minute.

38
00:01:43,320 --> 00:01:45,650
And to fit the second user story,

39
00:01:45,650 --> 00:01:49,450
we will have to implement basically the same data.

40
00:01:49,450 --> 00:01:52,210
So again, location, distance, time and speed

41
00:01:52,210 --> 00:01:54,550
but then also the elevation gain

42
00:01:54,550 --> 00:01:57,290
instead of the steps per minute.

43
00:01:57,290 --> 00:01:59,470
And so we will design our classes,

44
00:01:59,470 --> 00:02:01,380
so that they can create objects

45
00:02:01,380 --> 00:02:03,860
that will hold this kind of data.

46
00:02:03,860 --> 00:02:06,550
And I believe that this is the best way

47
00:02:06,550 --> 00:02:11,430
of designing the classes to really fit all user stories.

48
00:02:11,430 --> 00:02:14,560
So you see that we are gonna have a big parent class,

49
00:02:14,560 --> 00:02:17,050
which will be called Workout.

50
00:02:17,050 --> 00:02:18,470
And so this one is gonna hold

51
00:02:18,470 --> 00:02:21,480
the distance duration in coordinates.

52
00:02:21,480 --> 00:02:24,970
And then we will have a more specific class for the running,

53
00:02:24,970 --> 00:02:28,370
which will hold the cadence and the pace.

54
00:02:28,370 --> 00:02:31,070
All right, and the reason why the classes

55
00:02:31,070 --> 00:02:33,140
are designed like this is

56
00:02:33,140 --> 00:02:34,820
because the distance duration

57
00:02:34,820 --> 00:02:36,830
and coordinates are common

58
00:02:36,830 --> 00:02:39,770
to both of the types of activities.

59
00:02:39,770 --> 00:02:42,110
So both to Running and to Cycling

60
00:02:42,110 --> 00:02:45,090
and so therefore they are in the Parent Class.

61
00:02:45,090 --> 00:02:49,060
All right, and the same will also be true for some methods.

62
00:02:49,060 --> 00:02:52,050
And so we will see that once we implement it.

63
00:02:52,050 --> 00:02:54,438
And then for each type of activities,

64
00:02:54,438 --> 00:02:57,780
as you see, we have one child class,

65
00:02:57,780 --> 00:03:00,580
so that each child class can hold the data

66
00:03:00,580 --> 00:03:05,210
and methods that are specific to that type of activity.

67
00:03:05,210 --> 00:03:07,260
So I hope that makes sense

68
00:03:07,260 --> 00:03:08,670
and this is the whole reason

69
00:03:08,670 --> 00:03:12,440
why inheritance basically actually exists.

70
00:03:12,440 --> 00:03:14,900
So that we can have more specific classes

71
00:03:14,900 --> 00:03:16,890
that can inherited behavior

72
00:03:16,890 --> 00:03:18,840
and common properties that are

73
00:03:18,840 --> 00:03:21,690
common to all the child classes.

74
00:03:21,690 --> 00:03:24,558
So the cadence and pace are specific for Running

75
00:03:24,558 --> 00:03:27,430
and then the elevation gain and speed

76
00:03:27,430 --> 00:03:30,000
are specific to the Cycling.

77
00:03:30,000 --> 00:03:32,800
Okay, but once again, the Cycling also has

78
00:03:32,800 --> 00:03:35,560
distance, duration, and coordinates.

79
00:03:35,560 --> 00:03:39,000
And so that's why they are there in the parent class,

80
00:03:39,000 --> 00:03:41,220
so in the workout class,

81
00:03:41,220 --> 00:03:43,330
then here in this diagram,

82
00:03:43,330 --> 00:03:46,150
you also see that we have some other properties,

83
00:03:46,150 --> 00:03:47,970
like the ID and date.

84
00:03:47,970 --> 00:03:49,430
But we will see why,

85
00:03:49,430 --> 00:03:51,830
once we start implementing the code.

86
00:03:51,830 --> 00:03:55,453
And yeah, that's actually it for the data.

87
00:03:56,320 --> 00:03:58,310
So this kind of diagram is something

88
00:03:58,310 --> 00:03:59,660
that you will commonly see

89
00:03:59,660 --> 00:04:02,940
when working in object oriented programming.

90
00:04:02,940 --> 00:04:07,160
So usually each class is represented by a box like this,

91
00:04:07,160 --> 00:04:08,300
where in the top part,

92
00:04:08,300 --> 00:04:09,940
you're gonna have the properties

93
00:04:09,940 --> 00:04:12,770
and in the bottom part, the methods.

94
00:04:12,770 --> 00:04:14,320
And of course, each class here

95
00:04:14,320 --> 00:04:17,410
will have more than just the constructor method.

96
00:04:17,410 --> 00:04:20,690
And so that's why I have these three dots there.

97
00:04:20,690 --> 00:04:22,790
All right, so for now,

98
00:04:22,790 --> 00:04:23,830
that's all we need to know

99
00:04:23,830 --> 00:04:27,370
about the architecture of our data.

100
00:04:27,370 --> 00:04:30,076
But now about the rest of the Architecture,

101
00:04:30,076 --> 00:04:33,060
it's gonna be more about structuring the code

102
00:04:33,060 --> 00:04:36,260
that we already have from the previous lectures.

103
00:04:36,260 --> 00:04:38,580
And the events that we already have

104
00:04:38,580 --> 00:04:41,010
are the loading of the page,

105
00:04:41,010 --> 00:04:45,730
then receiving a position from the Geolocation API.

106
00:04:45,730 --> 00:04:48,950
So this one isn't an event in the traditional sense.

107
00:04:48,950 --> 00:04:51,740
So we're not handling it with Add Event Listener,

108
00:04:51,740 --> 00:04:54,850
but we can still classify it as an event.

109
00:04:54,850 --> 00:04:56,990
Then we have to click on the map.

110
00:04:56,990 --> 00:05:01,040
We have changing the input from Cycling to Running,

111
00:05:01,040 --> 00:05:04,010
or from Running to Cycling, remember,

112
00:05:04,010 --> 00:05:08,020
and then we also have the event of submitting a form.

113
00:05:08,020 --> 00:05:09,730
And so all we have to do now

114
00:05:09,730 --> 00:05:11,590
is to create different functions

115
00:05:11,590 --> 00:05:14,590
that will handle these different events.

116
00:05:14,590 --> 00:05:17,040
And in fact, what we are gonna do

117
00:05:17,040 --> 00:05:19,990
is to create a big class called App

118
00:05:19,990 --> 00:05:24,530
that will basically hold all of these functions as methods.

119
00:05:24,530 --> 00:05:28,510
So from a quick look at this application class diagram,

120
00:05:28,510 --> 00:05:31,250
we can immediately see that loading the page

121
00:05:31,250 --> 00:05:34,370
will of course trigger the constructor of the object

122
00:05:34,370 --> 00:05:37,310
that we're gonna create through this class.

123
00:05:37,310 --> 00:05:39,850
Okay, and so then right at the beginning,

124
00:05:39,850 --> 00:05:41,600
we want to get the current position

125
00:05:41,600 --> 00:05:45,260
of the user using the Geolocation API.

126
00:05:45,260 --> 00:05:47,150
And so that's why there is that arrow

127
00:05:47,150 --> 00:05:50,520
pointing from constructor to Get Position.

128
00:05:50,520 --> 00:05:52,550
Then as we receive that position,

129
00:05:52,550 --> 00:05:56,240
we want to load the map based on that position.

130
00:05:56,240 --> 00:06:00,280
And so therefore, we're gonna have a method called Load Map.

131
00:06:00,280 --> 00:06:01,610
Then as we click on the map,

132
00:06:01,610 --> 00:06:04,210
we want a method called Show Form.

133
00:06:04,210 --> 00:06:05,970
Then as we change the input,

134
00:06:05,970 --> 00:06:09,850
we want a method called Toggle Elevation Field.

135
00:06:09,850 --> 00:06:12,700
And then, and probably the most important one

136
00:06:12,700 --> 00:06:15,540
is the event of submitting the form.

137
00:06:15,540 --> 00:06:17,280
And this new workout method

138
00:06:17,280 --> 00:06:20,850
will basically be the heart of this entire class,

139
00:06:20,850 --> 00:06:24,350
because this is the one that will create new Running objects

140
00:06:24,350 --> 00:06:26,720
or new Cycling objects.

141
00:06:26,720 --> 00:06:30,600
And of course, these objects will be built based on the data

142
00:06:30,600 --> 00:06:33,260
that's coming in from the form.

143
00:06:33,260 --> 00:06:37,240
And as the user keeps adding Running, or Cycling workouts,

144
00:06:37,240 --> 00:06:40,371
a new object will be created for each of the workouts.

145
00:06:40,371 --> 00:06:44,510
And each of them will then be stored in a Workouts Array,

146
00:06:44,510 --> 00:06:48,470
which will basically hold all of these objects.

147
00:06:48,470 --> 00:06:52,780
Alright, so this is gonna be an important class property

148
00:06:52,780 --> 00:06:54,590
that all methods of the class

149
00:06:54,590 --> 00:06:58,580
will then be able to use to work with the workouts.

150
00:06:58,580 --> 00:07:00,670
And so with this structure here,

151
00:07:00,670 --> 00:07:02,700
we have everything that is related

152
00:07:02,700 --> 00:07:05,140
to building the application itself,

153
00:07:05,140 --> 00:07:08,430
organized into one neat block of data

154
00:07:08,430 --> 00:07:09,833
and functionality.

155
00:07:10,700 --> 00:07:12,680
And actually, having a class

156
00:07:12,680 --> 00:07:14,150
that contains all the data

157
00:07:14,150 --> 00:07:16,570
and methods about the application,

158
00:07:16,570 --> 00:07:20,670
like we have here is a pretty common thing that you will see

159
00:07:20,670 --> 00:07:24,550
in simple JavaScript applications like this one.

160
00:07:24,550 --> 00:07:27,640
Now, if the application was a bit more complex,

161
00:07:27,640 --> 00:07:30,660
then we could divide this Architecture even further

162
00:07:30,660 --> 00:07:32,030
and create one class

163
00:07:32,030 --> 00:07:35,250
that would only be concerned with the user interface

164
00:07:35,250 --> 00:07:38,900
and one class for the so called Business Logic.

165
00:07:38,900 --> 00:07:40,390
So basically, the logic

166
00:07:40,390 --> 00:07:43,120
that works only with the underlying data.

167
00:07:43,120 --> 00:07:47,170
But in this case, we can just keep it simple like this.

168
00:07:47,170 --> 00:07:49,000
And so as I mentioned before,

169
00:07:49,000 --> 00:07:52,220
this Architecture will then allow us to have everything

170
00:07:52,220 --> 00:07:55,090
that is about the application in one nice,

171
00:07:55,090 --> 00:07:56,870
self contained block.

172
00:07:56,870 --> 00:07:59,093
And besides the application itself,

173
00:07:59,093 --> 00:08:01,730
we then also have these classes

174
00:08:01,730 --> 00:08:04,510
that are only concerned about the data.

175
00:08:04,510 --> 00:08:06,920
And so therefore, application and data

176
00:08:06,920 --> 00:08:11,520
will be nicely separated in a very logical way, I believe.

177
00:08:11,520 --> 00:08:13,830
Now, What's also great about this

178
00:08:13,830 --> 00:08:17,590
is that we will be able to protect all of these methods,

179
00:08:17,590 --> 00:08:19,930
so that they are nicely encapsulated

180
00:08:19,930 --> 00:08:23,790
and not accessible from everywhere else in the code.

181
00:08:23,790 --> 00:08:25,630
So that's the reason why you see these

182
00:08:25,630 --> 00:08:29,040
underscores on all of the method names.

183
00:08:29,040 --> 00:08:31,930
Right, so that is, again, the convention

184
00:08:31,930 --> 00:08:34,800
that we can use to protect method names

185
00:08:34,800 --> 00:08:38,290
from being changed and used from the outside.

186
00:08:38,290 --> 00:08:41,620
And so this will make the code a lot easier to work with

187
00:08:41,620 --> 00:08:43,600
because we will know for sure

188
00:08:43,600 --> 00:08:47,810
that no place else in the code is working with the data.

189
00:08:47,810 --> 00:08:51,770
And yeah, calling any of the methods here.

190
00:08:51,770 --> 00:08:53,910
And trust me with experience,

191
00:08:53,910 --> 00:08:58,040
you will really start to appreciate these kinds of things.

192
00:08:58,040 --> 00:09:00,200
Now right, but anyway,

193
00:09:00,200 --> 00:09:03,370
this is the initial approach for Architecture

194
00:09:03,370 --> 00:09:05,130
that we're now gonna implement.

195
00:09:05,130 --> 00:09:07,150
And of course, based on the code

196
00:09:07,150 --> 00:09:08,830
that we already have.

197
00:09:08,830 --> 00:09:10,510
We will keep adding more methods

198
00:09:10,510 --> 00:09:12,510
and properties as we go

199
00:09:12,510 --> 00:09:16,310
but this is already an excellent starting point.

200
00:09:16,310 --> 00:09:18,590
So maybe take another minute or two,

201
00:09:18,590 --> 00:09:20,410
to study this diagram.

202
00:09:20,410 --> 00:09:21,980
And then in the next video,

203
00:09:21,980 --> 00:09:25,673
we will refactor our code to fit this Architecture.

