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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Luan Fonseca de Farias
September 09, 2015
49
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
53
O Python, o Universo e Tudo Mais
luanfonceca
0
92
Speakerfight - Python Day Natal
luanfonceca
0
79
GTD - Cap. 12
luanfonceca
0
38
QS
luanfonceca
0
36
168horas
luanfonceca
0
140
Oxente
luanfonceca
3
150
speakerfight
luanfonceca
1
120
Python Básico
luanfonceca
0
85
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.7k
How STYLIGHT went responsive
nonsquared
100
6.3k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
230
Navigating Team Friction
lara
192
16k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
970
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
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: