Refactoring Rails Applications

30
Refactoring Rails Applications Mathias Meyer und Jonathan Weiss, 01.09.2009 Peritor GmbH

description

The slides to the Refactoring Workshop of Mathias Meyer and Jonathan Weiss at the Rails Konferenz 2009 in Offenbach/Frankfurt.

Transcript of Refactoring Rails Applications

Page 1: Refactoring Rails Applications

Refactoring Rails Applications

Mathias Meyer und Jonathan Weiss, 01.09.2009

Peritor GmbH

Page 2: Refactoring Rails Applications

2

Who am I ?

Jonathan Weiss

• Consultant bei Peritor GmbH in Berlin

• Specialized in Rails, Scaling, Deployment, and Code Review

• Webistrano - Rails deployment tool

• FreeBSD Rubygems and Ruby on Rails maintainer

http://www.peritor.com

http://blog.innerewut.de

Page 3: Refactoring Rails Applications

3

Who am I ?

Mathias Meyer

• Chief Cloud Officer bei Peritor GmbH in Berlin

• Rubyist

• Asynchronist

• Post-Relationalist

http://www.paperplanes.de

http://www.dailyawswtf.com

Page 4: Refactoring Rails Applications

4

Refactoring

Definition:

Refactoring bezeichnet die manuelle oder automatisierte Strukturverbesserung von Programm-Quelltexten unter Beibehaltung des beobachtbaren Programm-Verhaltens. Dabei sollen die Lesbarkeit, Verständlichkeit, Wartbarkeit und Erweiterbarkeit verbessert werden, mit dem Ziel, den jeweiligen Aufwand für Fehleranalyse und funktionale Erweiterungen deutlich zu senken.

Wikipedia

Page 5: Refactoring Rails Applications

5

Von

Page 6: Refactoring Rails Applications

6

Zu

Page 7: Refactoring Rails Applications

7

Und zu

Page 8: Refactoring Rails Applications

8

Wie?

Page 9: Refactoring Rails Applications

9

Live Coding&

Übung

Page 10: Refactoring Rails Applications

10

Grundlagen

Page 11: Refactoring Rails Applications

11

MVC

Page 12: Refactoring Rails Applications

12

Model

Business-Model

Domain-Logik

Wiederverwendbar

Page 13: Refactoring Rails Applications

13

Was macht das Model?

Business-Logik kapseln

Nicht direkt auf Requests und Sessions zugreifen, höchstens indirekt

Schnittstelle zur Datenbank

Page 14: Refactoring Rails Applications

14

View

“Dumme” Präsentation nach außen

Peilt spezifischen Use-Case an

Stellt Information dar

Unterschiedliche Sichtweisen auf Model

Page 15: Refactoring Rails Applications

15

Was darf der View?

Repräsentation erzeugen

Keine komplexeren Querys oder Code-Schnipsel

So wenig Instanzvariablen wie möglich verwenden

Datenbank-Querys aus dem View sind kein Verbrechen

Page 16: Refactoring Rails Applications

16

Controller

Dirigiert und verbindet

Vermittelt ans Model

Delegieren anstatt schuften

Page 17: Refactoring Rails Applications

17

Was macht der Controller?

Model finden und Aufrufe ins Model machen (Mediator)

Bestimmen welche Template zu rendern ist

Authentifiziering, Authorisierung

Page 18: Refactoring Rails Applications

18

PrinciplesD R Y

Page 19: Refactoring Rails Applications

19

You Ain’t Gonna Need It

Ron Jeffries:

Implementiere Dinge nur wenn du sie tatsächlich brauchst, nicht wenn du denkst dass du sie brauchst.

Page 20: Refactoring Rails Applications

20

Live Coding Experiment

Page 21: Refactoring Rails Applications

21

Redmine

• A load-balancer distributes the incoming requests

• Some load-balancers will deliver static requests themselves

• Several Rails instances handle all requests

• Number of concurrent requests equals number of Rails instances

Page 22: Refactoring Rails Applications

22

Redmine

• In Entwicklung seit 2006

• Noch auf Rails 2.1

• Viele Faux-Pas die jeder mal gemacht hat

Page 23: Refactoring Rails Applications

23

Redmine

• Multiple projects support

• Flexible role based access control

• Flexible issue tracking system

• Gantt chart and calendar

• News, documents & files management

• Feeds & email notifications

• Per project wiki

• Per project forums

• Time tracking

• SCM integration (SVN, CVS, Git, Mercurial, Bazaar and Darcs)

Page 24: Refactoring Rails Applications

24

Do

Models einführen wo angebracht, es besteht kein Datenbank-Zwang

Es ist in Ordnung, Parameter ins Model zu reichen und dort zu verarbeiten

View-Code gleichmäßig einrücken, wie allen anderen Code auch

Dinge mit ordentlichen Namen versehen, lieber zu lang als zu kurz

Helper verwenden anstatt Logik in den View zu stopfen

Noch besser: Logik ins Model verschieben

Page 25: Refactoring Rails Applications

25

Do

Ein Auge auf neue Rails-Features haben, machen u.U. das Leben leichter

• z.B. Object#try, Named-Scopes, Einfacheres render in Rails 2.3

Es muss nicht RESTful sein, Ressourcen sind aber als Guideline sinnvoll

Code in Module auslagern, egal ob im Controller oder Model

Komplexe Finder gehören ins Model, named_scopes to the rescue

Page 26: Refactoring Rails Applications

26

Don’t

Benutze nie Fixtures

self nur benutzen wo unbedingt notwendig

Einige Exceptions muss man nicht selbst abfangen

Keine Instanzvariablen im Controller nur für Darstellungslogik

Page 27: Refactoring Rails Applications

27

Don’t

Zugriff auf Instanzvariablen in Partials vermeiden, lokal gewinnt!

Komplizierte Konditionen sind State, gehören in Extra-Methoden

Exceptions wiederholt in Actions abfangen, rescue_action_in_public

Anstatt request.get? und request.post? neue Action einführen

return in einer Controller-Action

Validierungen im Controller, gehören ins Model

Page 28: Refactoring Rails Applications

28

Praktischer Teil

Page 29: Refactoring Rails Applications

29

Q & A

Page 30: Refactoring Rails Applications

30

30

Peritor GmbH

Blücherstr. 2210961 Berlin

Telefon: +49 (0)30 69 20 09 84 0Telefax: +49 (0)30 69 20 09 84 9

Internet: www.peritor.comE-Mail: [email protected]

Peritor GmbH - Alle Rechte vorbehalten