1 00:00:00,090 --> 00:00:03,110 So now we saw, this set of re-factoring's. They're nice, but 2 00:00:03,110 --> 00:00:06,260 how can we actually perform re-factoring's? In some cases you'll have to 3 00:00:06,260 --> 00:00:08,430 do it by hand. And you'll do it in that case in 4 00:00:08,430 --> 00:00:10,880 small steps, so that you can check at every step that you 5 00:00:10,880 --> 00:00:14,180 didn't introduce any area. But there's also many cases in which at 6 00:00:14,180 --> 00:00:17,640 least for the more standard re-factoring's, you can just apply, you can 7 00:00:17,640 --> 00:00:21,530 just use a tool that actually supports re-factoring. I'm going to show 8 00:00:21,530 --> 00:00:24,550 you how that works, into a specific ID, Eclipse through a demo. 9 00:00:26,120 --> 00:00:28,425 To show you how Eclipse, can help in performing 10 00:00:28,425 --> 00:00:31,880 re-factoring, in an automated way, I just opened the Eclipse 11 00:00:31,880 --> 00:00:35,050 editor and I maximized it. So that we can look 12 00:00:35,050 --> 00:00:36,810 at the code more clearly. And as you can see 13 00:00:36,810 --> 00:00:39,551 here, I have this class. It's called Re-factorable, it's a 14 00:00:39,551 --> 00:00:43,550 pretty indicative name. And what we're going to do, we're going to 15 00:00:43,550 --> 00:00:47,840 try to apply the extract method re-factoring to this class. 16 00:00:47,840 --> 00:00:51,060 And in particular, to parts of this print owing method. 17 00:00:51,060 --> 00:00:54,090 So this is a matter than will print owing's, 18 00:00:54,090 --> 00:00:56,160 as the name says. And it will do several things 19 00:00:56,160 --> 00:00:59,180 such as, for example, printing a banner first, then 20 00:00:59,180 --> 00:01:03,650 calculating the outstanding debts, and then printing some details. So 21 00:01:03,650 --> 00:01:06,980 the starting point for an extract method re-fractoring, is 22 00:01:06,980 --> 00:01:10,650 the identification of some cohesive code fragment. And here, for 23 00:01:10,650 --> 00:01:12,970 instance, we can see that, if we can see there, 24 00:01:12,970 --> 00:01:16,350 these three print statements. They are basically printing some banner, 25 00:01:16,350 --> 00:01:18,530 for the method. And I also put a comment here 26 00:01:18,530 --> 00:01:21,160 just to make that even more explicit. So this is a 27 00:01:21,160 --> 00:01:23,970 perfect case in which we might want to just extract 28 00:01:23,970 --> 00:01:27,220 this part, create an independent method, so that we can make 29 00:01:27,220 --> 00:01:31,410 the code more readable and maintainable. So I select, the 30 00:01:31,410 --> 00:01:33,320 part of the code, that I want to put in my 31 00:01:33,320 --> 00:01:37,080 method. I invoke the contextual menu, and as you can see 32 00:01:37,080 --> 00:01:41,287 there is a re-factor entry here. Here are some re-factoring's [UNKNOWN], 33 00:01:41,287 --> 00:01:45,039 re-factoring's that I can apply, and I'm going to select extract 34 00:01:45,039 --> 00:01:48,120 method. When I do that, Eclipse is going to ask me to 35 00:01:48,120 --> 00:01:51,610 specify a method name. I'll just call this one print 36 00:01:51,610 --> 00:01:54,260 banner. And as you can see, as soon as I do 37 00:01:54,260 --> 00:01:57,310 that, Eclipse will show me the preview, for the method 38 00:01:57,310 --> 00:02:01,010 that will be generated. I'm going to leave the access modifier. To 39 00:02:01,010 --> 00:02:03,290 public and I'm not going to change anything else. So, 40 00:02:03,290 --> 00:02:07,760 now when I click Ok. As you can see Eclipse modified 41 00:02:07,760 --> 00:02:10,669 my code so that now I have the Print Banner method 42 00:02:10,669 --> 00:02:14,050 down here that does exactly what that piece of code was doing 43 00:02:14,050 --> 00:02:16,090 before. And I just have an invocation of the Print Banner 44 00:02:16,090 --> 00:02:19,440 method, up here, where the code was before. And of course, this 45 00:02:19,440 --> 00:02:21,830 is something that we could have done by hand. It's pretty 46 00:02:21,830 --> 00:02:25,480 easy to do, but it's even easier, to do it using Eclipse's 47 00:02:25,480 --> 00:02:29,040 capabilities. And this will become even more apparent, when we consider slightly 48 00:02:29,040 --> 00:02:32,866 more complex case. So here, if we look at this piece of 49 00:02:32,866 --> 00:02:35,234 code for instance, we can that see this code 50 00:02:35,234 --> 00:02:38,264 prints some details, about the always. And the reason 51 00:02:38,264 --> 00:02:41,351 why this case is likely more complicated, is because 52 00:02:41,351 --> 00:02:45,210 this code needs to know about the value of outstanding. 53 00:02:45,210 --> 00:02:49,130 And whereas that underscore name, is a member of 54 00:02:49,130 --> 00:02:51,150 the class, and therefore will be available to the 55 00:02:51,150 --> 00:02:55,110 method. Outstanding is a locker variable, so a method 56 00:02:55,110 --> 00:02:58,310 different from print, oh it wouldn't know anything about outstanding. 57 00:02:58,310 --> 00:03:00,070 So let's see what happens when we try to apply 58 00:03:00,070 --> 00:03:03,460 a re-factoring for this code. So we go again here 59 00:03:03,460 --> 00:03:06,410 to the re-factor menu, we select extract method, we will 60 00:03:06,410 --> 00:03:10,080 pick a name again. So let's call it [SOUND] print details, 61 00:03:10,080 --> 00:03:12,660 since this is what the code does. And as you 62 00:03:12,660 --> 00:03:17,270 can see here, Eclipse was able to figure out, that outstanding 63 00:03:17,270 --> 00:03:20,290 has to be a parameter, of this method. So if 64 00:03:20,290 --> 00:03:23,340 you look at the signature here, this will be very clear. 65 00:03:23,340 --> 00:03:26,270 So outstanding has to be passed to the matter because 66 00:03:26,270 --> 00:03:29,230 it's a locker variable of the print owing method. so 67 00:03:29,230 --> 00:03:32,600 it will not be visible to the other methods otherwise. 68 00:03:32,600 --> 00:03:34,990 So since eclipse figured it out, all I have to do, 69 00:03:34,990 --> 00:03:37,630 is to press Ok. And at this point what I 70 00:03:37,630 --> 00:03:41,280 will have here is my new method, for in details 71 00:03:41,280 --> 00:03:45,140 that takes outstanding as a parameter. And does exactly what 72 00:03:45,140 --> 00:03:48,880 the code was doing before. And here, where the code was, 73 00:03:48,880 --> 00:03:51,630 I will have my print details invocation, with outstanding 74 00:03:51,630 --> 00:03:54,930 as a parameter. So now, let's continue to extract methods. 75 00:03:54,930 --> 00:03:58,470 And let's look at a even more complex case. which 76 00:03:58,470 --> 00:04:01,550 is, the one involving this piece of code. So this 77 00:04:01,550 --> 00:04:03,900 piece of code, as you can see, will calculate 78 00:04:03,900 --> 00:04:07,820 the value of the outstanding debt. Will calculate the owing's, 79 00:04:07,820 --> 00:04:09,600 and the way in which it does that, is by 80 00:04:09,600 --> 00:04:14,080 considering all the orders, that are part of this enumeration. 81 00:04:14,080 --> 00:04:16,519 That is the declared here, and it will 82 00:04:16,519 --> 00:04:20,769 compute for each one, of these orders, the amount, 83 00:04:20,769 --> 00:04:23,520 and then added to outstanding. So what is the 84 00:04:23,520 --> 00:04:26,160 additional complication here? Well, the additional complication here is 85 00:04:26,160 --> 00:04:29,520 that this code needs to know, not only 86 00:04:29,520 --> 00:04:33,220 about outstanding. It also needs to know, about this 87 00:04:33,220 --> 00:04:36,160 enumeration, because this one is also a local variable. 88 00:04:36,160 --> 00:04:39,140 And in addition to that, this code also has 89 00:04:39,140 --> 00:04:43,280 some side effects. So outstanding, is modified as a 90 00:04:43,280 --> 00:04:46,600 consequence of the execution of this code. So how can 91 00:04:46,600 --> 00:04:49,120 we do that in the extracted method? Well lets 92 00:04:49,120 --> 00:04:51,000 see what the clips will do and what the clips 93 00:04:51,000 --> 00:04:53,950 will suggest. It will try to again re-factor this 94 00:04:53,950 --> 00:04:58,030 code and extract the method. In this case as you 95 00:04:58,030 --> 00:05:01,160 can see. The clips does two things. First of all, 96 00:05:01,160 --> 00:05:04,180 it figures out as before, that there are some parameters, 97 00:05:04,180 --> 00:05:07,650 that are needed for this method to operate correctly. The 98 00:05:07,650 --> 00:05:11,600 enumeration e, as we said, and the outstanding variable. In 99 00:05:11,600 --> 00:05:14,880 addition, if you look at the method signature Eclipse will 100 00:05:14,880 --> 00:05:17,490 also figure out that this method has to return, a 101 00:05:17,490 --> 00:05:21,530 double value. So what does this value correspond to? This 102 00:05:21,530 --> 00:05:24,700 value corresponds to a new value of outstanding. So if 103 00:05:24,700 --> 00:05:27,490 we, give a name to this method, so we just 104 00:05:27,490 --> 00:05:29,620 use the name, [SOUND] that I put in the comment 105 00:05:29,620 --> 00:05:33,510 over there. We click Ok, and this will create 106 00:05:33,510 --> 00:05:36,560 a method by extracting the code. And here, where the 107 00:05:36,560 --> 00:05:39,100 method used to be, we will have that the 108 00:05:39,100 --> 00:05:43,169 value of outstanding is updated. Based on the return value 109 00:05:43,169 --> 00:05:46,260 of calculate outstanding. So in the end if we 110 00:05:46,260 --> 00:05:48,730 look at this code, you can see that if we 111 00:05:48,730 --> 00:05:51,980 just focus, on this code it's very easy to 112 00:05:51,980 --> 00:05:55,150 understand what it does. It prints the banner, it calculates 113 00:05:55,150 --> 00:05:59,180 an outstanding value, and then it prints some details. And 114 00:05:59,180 --> 00:06:01,520 in case we don't care, as I said before, about the 115 00:06:01,520 --> 00:06:04,840 details of what these methods do, we're done. And if we 116 00:06:04,840 --> 00:06:07,740 care about the details we can look at each matter individually. 117 00:06:07,740 --> 00:06:10,580 And get exactly the same information that we got before, 118 00:06:10,580 --> 00:06:13,650 in a sort of a separation of concerns kind of way, 119 00:06:13,650 --> 00:06:16,420 by focusing on one problem at a time. So now let 120 00:06:16,420 --> 00:06:19,345 me do one last thing. So let me modify the code, 121 00:06:19,345 --> 00:06:23,170 slightly. So i'm going to go back, to the version of 122 00:06:23,170 --> 00:06:25,610 the code before re-factoring. So this is what we had. 123 00:06:25,610 --> 00:06:32,480 And I'm going to add, an additional variable here, [SOUND] called count, 124 00:06:32,480 --> 00:06:38,870 which I initialize to zero. Here I'm going to increase, [SOUND] 125 00:06:38,870 --> 00:06:41,360 the value of count at every iteration. And 126 00:06:41,360 --> 00:06:44,570 finally, here I'm going to print out the value 127 00:06:44,570 --> 00:06:50,130 of count. Okay, now that I have this code up. So let's imagine that I 128 00:06:50,130 --> 00:06:55,665 want to, again as I did before, extract this matter. So, I'm going to 129 00:06:55,665 --> 00:06:58,430 give you a second. Have a look at this and see, if you see 130 00:06:58,430 --> 00:07:02,170 any problem with that. Feel free to stop the video, if you need more time. 131 00:07:07,350 --> 00:07:11,440 So the problem here is that I have two side effects. 132 00:07:11,440 --> 00:07:14,820 Both outstanding and count are modified. And therefore it's not really 133 00:07:14,820 --> 00:07:19,600 possible to extract this method, and preserve the semantics of this 134 00:07:19,600 --> 00:07:23,260 code. Let's see if Eclipse will be able to figure that out. 135 00:07:26,130 --> 00:07:28,950 And it does. If we try to extract the matter here, 136 00:07:28,950 --> 00:07:32,250 you'll tell us that's an ambiguous return value. The selected block 137 00:07:32,250 --> 00:07:35,800 contains more than one assignment to look at variables. And the 138 00:07:35,800 --> 00:07:40,170 affected variables are outstanding, just a Double and Count which is 139 00:07:40,170 --> 00:07:44,780 an integer. So it will refuse to extract the method. So 140 00:07:44,780 --> 00:07:46,470 at this point if we wanted to do that we have 141 00:07:46,470 --> 00:07:48,650 we'll have to do the re-factoring a different way, but I 142 00:07:48,650 --> 00:07:51,110 don't really want to get there. I want to conclude here, 143 00:07:51,110 --> 00:07:53,440 and I hope this this little demo helped you 144 00:07:53,440 --> 00:07:55,310 realize how useful it can be to use an 145 00:07:55,310 --> 00:07:58,270 id that supports re-factoring that can automate this important 146 00:07:58,270 --> 00:08:00,160 task. And I also encourage you to try to play 147 00:08:00,160 --> 00:08:03,170 with this, and try to use different re-factoring's, on 148 00:08:03,170 --> 00:08:05,480 your code. So as to get familiar with the kind 149 00:08:05,480 --> 00:08:08,060 of re-factoring's that are supported by the ID. And 150 00:08:08,060 --> 00:08:10,800 also with the re-factoring's themselves and how should be used.