Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Refactoring
Search
Luan Fonseca de Farias
September 09, 2015
48
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Refactoring
Luan Fonseca de Farias
September 09, 2015
More Decks by Luan Fonseca de Farias
See All by Luan Fonseca de Farias
O que tem de tãããããão incrível assim no Python?
luanfonceca
0
52
O Python, o Universo e Tudo Mais
luanfonceca
0
90
Speakerfight - Python Day Natal
luanfonceca
0
78
GTD - Cap. 12
luanfonceca
0
36
QS
luanfonceca
0
35
168horas
luanfonceca
0
140
Oxente
luanfonceca
3
150
speakerfight
luanfonceca
1
120
Python Básico
luanfonceca
0
82
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
New Earth Scene 8
popppiees
3
2.4k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
810
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
270
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Building Applications with DynamoDB
mza
96
7.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
320
It's Worth the Effort
3n
188
29k
Transcript
Tarefa 3 Refatorações e Code Smells
Talk's proposals management platform SPEAKERFIGHT.COM
Code is duplicated
• +function makeMessage(message, type, id) { + return '<div class="alert
alert-"' + type + '" ' + + 'alert-dismissable text-left" id="' + id + '">' + + '<i class="icon-exclamation-sign"></i>' + + data.message + + '<button type="button" class="close" ' + + 'data-dismiss="alert" ' + + 'aria-hidden="true"><C3>x</button>' + + '</div>'; +}
• self.removeAttr('href'); - var successAlert = '<div class="alert alert-success alert-dismissable
- '<i class="icon-exclamation-sign"></i>' + - data.message + - '<button type="button" class="close" - '</div>'; + var successAlert = makeMessage( + data.message, 'success', 'success-vote-alert'); self.parent('.proposal-votes').append(successAlert);
• self.removeAttr('href'); - var errorAlert = '<div class="alert alert-error alert-dismissable
- '<i class="icon-exclamation-sign"></i>' + - data.message + - '<button type="button" class="close" - '</div>'; + var errorAlert = makeMessage( + data.message, 'error', 'error-vote-alert'); self.parent('.proposal-votes').append(errorAlert);
Convert a long routine to a class.
•+class DispatchRedirectsMixing(object): + def get_url(self): + object = self.get_object() +
return reverse('view_event', kwargs={'slug': object.event.slug}) . . .
• . . . + def not_authenticated_redirect(self): + message =
_(u'You need to be logged in to continue to the next step.') + + if self.request.method == 'GET': + messages.error(self.request, message) + return HttpResponseRedirect(self.get_url()) + + response = {} + response['message'] = message + response['redirectUrl'] = u'{}?{}={}'.format( + settings.LOGIN_URL, + REDIRECT_FIELD_NAME, + self.request.META.get('PATH_INFO') + ) + return HttpResponse( + json.dumps(response), + status=401, + content_type='application/json') . . .
• . . . + def not_allowed_redirect(self, url): + message
= _(u'You are not allowed to see this page.') + if self.request.method == 'GET': + messages.error(self.request, message) + return HttpResponseRedirect(url) + response = {} + response['message'] = message + response['redirectUrl'] = '' + return HttpResponse( + json.dumps(response), + status=401, + content_type='application/json' + )
• -class RateProposal(BaseProposalView, UpdateView): +class RateProposal(BaseProposalView, UpdateView, DispatchRedirectsMixing): def post(self,
request, *args, **kwargs): self.object = self.get_object() rate = kwargs.get('rate') @@ -291,39 +326,13 @@ class RateProposal(BaseProposalView, UpdateView): 'view_event', kwargs={'slug': proposal.event.slug}) if not self.request.user.is_authenticated(): - message = _(u'You need to be logged in to ' . . . - json.dumps(response), - status=401, - content_type='application/json' - ) + return self.not_authenticated_redirect(url=view_event_url) + elif not proposal.user_can_approve(self.request.user): + return self.not_allowed_redirect(url=view_event_url) return super(RateProposal, self).dispatch(*args, **kwargs)
• -class ApproveProposal(BaseProposalView, UpdateView): +class ApproveProposal(BaseProposalView, UpdateView, DispatchRedirectsMixing): def post(self,
request, *args, **kwargs): self.object = self.get_object() response_content = {} @@ -358,39 +367,15 @@ class ApproveProposal(BaseProposalView, UpdateView): 'view_event', kwargs={'slug': proposal.event.slug}) if not self.request.user.is_authenticated(): . . . - content_type='application/json') + return self.not_authenticated_redirect(url=view_event_url) elif not proposal.user_can_approve(self.request.user): - message = _(u'You are not allowed to see this page.') . . . - ) + return self.not_allowed_redirect(url=view_event_url) return super(ApproveProposal, self).dispatch(*args, **kwargs)
• -class DisapproveProposal(BaseProposalView, UpdateView): +class DisapproveProposal(BaseProposalView, + UpdateView, + DispatchRedirectsMixing):
def post(self, request, *args, **kwargs): self.object = self.get_object() response_content = {} @@ -425,33 +410,7 @@ class DisapproveProposal(BaseProposalView, UpdateView): 'view_event', kwargs={'slug': proposal.event.slug}) if not self.request.user.is_authenticated(): - message = _(u'You need to be logged in to ' . . . - ) + return self.not_authenticated_redirect(url=view_event_url) + elif not proposal.user_can_vote(self.request.user): + return self.not_allowed_redirect(url=view_event_url) return super(DisapproveProposal, self).dispatch(*args, **kwargs)
Extract a routine
• +def get_proposals(self): + proposals = self.object.proposals.cached_authors() + if self.object.user_can_see_proposals(self.request.user):
+ if not self.request.user.is_anonymous(): + proposals = proposals.order_by_never_voted( + user_id=self.request.user.id) + elif not self.request.user.is_anonymous(): + proposals = proposals.filter(author=self.request.user) + else: + proposals = proposals.none() + return proposals
• context['vote_rates'] = Vote.VOTE_RATES - event_proposals = self.object.proposals.cached_authors() - if
self.object.user_can_see_proposals(self.request.user): - if not self.request.user.is_anonymous(): - event_proposals = event_proposals.order_by_never_voted( - user_id=self.request.user.id) - elif not self.request.user.is_anonymous(): - event_proposals = event_proposals.filter(author=self.request.user) - else: - event_proposals = event_proposals.none() - context.update(event_proposals=event_proposals) + context.update(event_proposals=self.get_proposals()) return context
Combine similar routines by parameterizing them.
• +def change_approved_status(self, is_approved): + if is_approved and self.is_approved: +
raise ValidationError(_("This Proposal was already approved.")) + elif not is_approved and not self.is_approved: + raise ValidationError(_("This Proposal was already disapproved.")) + + self.is_approved = is_approved + self.save()
• - def approve(self): - if self.is_approved: - raise ValidationError(_("This
Proposal was already approved.")) - self.is_approved = True - self.save() - - def disapprove(self): - if not self.is_approved: - raise ValidationError(_("This Proposal was already disapproved.")) - self.is_approved = False - self.save()
• try: - self.object.approve() + self.object.change_approved_status(is_approved=True) except (IntegrityError, ValidationError), e:
response_content['message'] = e.message response_status = 400 @@ -345,7 +345,7 @@ class ApproveProposal(BaseProposalView, UpdateView): self.object = self.get_object() try: - self.object.approve() + self.object.change_approved_status(is_approved=True) except (IntegrityError, ValidationError), e: