catalyst - refactor large apps with it and have fun!

22
Catalyst - refactor & have fun – refactor large apps with tE@M (of individuals) and have fun! Adam Bartosik, krakow.pm

Upload: mold

Post on 26-May-2015

4.899 views

Category:

Business


0 download

DESCRIPTION

Catalyst - refactor applications with Catalyst, yapc2007

TRANSCRIPT

Page 1: Catalyst - refactor large apps with it and have fun!

Catalyst - refactor & have fun

– refactor large apps with tE@M (of individuals)

and have fun!

Adam Bartosik, krakow.pm

Page 2: Catalyst - refactor large apps with it and have fun!

365What we had?

24 Existing datawarehouse with CGI web interface working (mostly) 24h*365 build by many people Perl supports individuality Large projects HATE this

Page 3: Catalyst - refactor large apps with it and have fun!

What we had?

Codebase: different styles of programming / how perl was growing in-line script / eval { main() } / procedural split into packages

3 approaches to html templates 3 database wrappers own date-time counting libs hacks, hacks, hacks.../ bugs, bugs, bugs...

Page 4: Catalyst - refactor large apps with it and have fun!

What we had / we want

perl is not too formal a language. Great for things you need to change,develop the way you've never thought before /what we mostly do/.

The bigger a perl project is, the more rules you need to obey.

warnings, strict, perl-critic are just about code quality, not about design practices

XP, test-approach, test-suits - hard to start but make work easier, safer and faster (changes are welcome!)

Page 5: Catalyst - refactor large apps with it and have fun!

What we want?

make it the best possible way make it easier maintainable learn something new, have fun :)

Page 6: Catalyst - refactor large apps with it and have fun!

Choosing new platform

hours of talking, advocating use CPAN instead of self-made libs (opposit to

company politic?) they have better doc better tested are still being developed eg. DateTime is slower than simple $date, but

checks ranges SQL::Abstract can quote everything TT can move view-logic to templates

Page 7: Catalyst - refactor large apps with it and have fun!

web framework needed!

we don't like to deal with sessions, url handling, redirecting (handling simple redirect in cgi is NOT simple)

CGI::App is like glue, but we need fundaments it should be popular enough to have some

support level /work must be done/ so the winner is...

Page 8: Catalyst - refactor large apps with it and have fun!

Catalyst ++

Catalyst – similar to Rails MVC – code / layout / data source

MUST (/should) be split :) directory layout can start web app in a minute most of web tasks (sessions, url mapping,

redirects) are one-liners self server to test changes (quick start for

developers)

Page 9: Catalyst - refactor large apps with it and have fun!

Catalyst --

hard to find good doc (but going better) too flexible, TIMTOWTDI

what to use for O/R mapping? which templates? type of config file? session storage? view type?

Rails, Django are easier to start with, have better doc, marketing, hype, ”proper way to do it”

Page 10: Catalyst - refactor large apps with it and have fun!

?Learning curve

start-up: first 2-3 weeks are the worst tutos, docs, advent calendars, Handel, different

approaches, different results logical or a crap we wasting time on?

Page 11: Catalyst - refactor large apps with it and have fun!

Learning curve

Template Toolkit make life easier: pass complex data [ {name=>bar}, {name=>baz} ]

to templates, iterations are done in tpl <ul> [% FOREACH row IN rows %]

<li>[% row.name %][% END %] </ul>

easy Ajax integration can switch totally different layouts (we needed it 3

months later – nice to be possible do this without big hacks)

Don't forget Mason => no another lang in tpl

Page 12: Catalyst - refactor large apps with it and have fun!

DBIx::Class – rapid ORM interface use when it is worth to use it is not trivial to rewrite complex SQL queries to

dbix, does not simplify complicated joins (we have datawarehouse, a little more than blog – SQL can be simpler)

dbix is powerfull for data updating $post = $c->model('app::comment')->create({

nick => $c->req->{'nick'}, value => $c->req->{'value'} });$post->update;

Learning curve

Page 13: Catalyst - refactor large apps with it and have fun!

Easy ”hard CGI things” dynamic redirect (after save, redirect user to eg.

main page)

sub save : Local { my ($self, $c) = @_; # save # redirect $c->res->redirect($c->uri_for('/'));}

Learning curve

Page 14: Catalyst - refactor large apps with it and have fun!

Global ”catch-flag”, eg: change language choose output format

app/Controller/Root.pm

sub pdf : Regex('\.?pdf$') { my ($self, $c) = @_; my $redir = $c->req->path; $redir =~ s/\.pdf$//; $c->stash->{output_pdf} = 1; $redirect =~ s{/$}{/index}; $c->forward($redirect);}

Learning curve

Page 15: Catalyst - refactor large apps with it and have fun!

Preserve link layout (when SEO matters)

URL: /news/what-about-perl6.html

sub news : LocalRegex('^/(.+)\.html$') { my ($self, $c) = @_; my $title = $c->req->captures->[0]; # find this article by $title...}

Learning curve

Page 16: Catalyst - refactor large apps with it and have fun!

Still no best answer to all form/multiform/validation tasks. HTML::Widget Form::Builder everything is possible, but typically breaks mvc

MVC: Forms design should be in templates (view, css, layout), not in controllers, validation rules for input data should be placed in models (see Rails approach)

Learning curve

Page 17: Catalyst - refactor large apps with it and have fun!

Web-services – SOAP, XML-RPC, REST – to share data with other systems/projects just output xml/yaml/anything

sub xml : Local { $c->res->body(XMLout($data)); # kiss/works}

build simple controller with pure TT and xml template (fast when you must pass defined output, DTD/Schema)

many plugins/controllers in CPAN, eg. C::P::Flavour, see also Catalyst Cookbook / simply ask what kind of abstraction for WS you need

Learning curve

Page 18: Catalyst - refactor large apps with it and have fun!

Catalyst is social!

easy to work together – code is split /by design/ into many parts

no global switches/routing rules => less conflicts in code repository

the team can scale: start with 2, growth to 5 or more

Page 19: Catalyst - refactor large apps with it and have fun!

We must obey some rules & conventions – what, where, how – work in team need some rules => they make life easier

why develop own libs when there are so many good on CPAN? We can fix bugs, extend them, contribute to open source less own codebase => lower costs more developers => better approaches other features => can need them in 2 or 3 months

Catalyst is social!

Page 20: Catalyst - refactor large apps with it and have fun!

Months of active developemt but codebase is still fresh (and it is perl, true!) Clear design Only ”business application” code Less to type

We can make deep changes: multi-level caches for balanced nodes

with pre-caching change layout as often as is needed by marketing :)

Benefits after time

Page 21: Catalyst - refactor large apps with it and have fun!

Catalyst works like a web-processing meta-language

It is not that (dirty) perl, it is a Catalyst

Benefits after time

Page 22: Catalyst - refactor large apps with it and have fun!

see in Krakow!

Thanks - krakow perl mongers