

The pleasantness of Om - danielszm
http://danielsz.github.io/2014/02/28/The-pleasantness-of-Om/

======
Udo
I know the use of object-to-HTML-mappers is only going to grow from here on
out, but I really don't see the appeal in most cases where pure HTML would
have been a perfectly readable and lightweight choice. We're becoming so
scared of angle brackets that we seek refuge behind object-like constructs
that are nothing but yet another impoverished and leaky abstraction layer
above an already abstract markup language.

Look at that nightmare of a rendering code and tell me you'll still want to
touch that when the time comes to go back and modify it in a few months.

I had the displeasure of working with Jade on a recent project. Not only was
it more difficult for humans to parse than the HTML it produced, it was also
slow to execute and generally cumbersome to modify. The main purpose of its
existence might just be so programmers can lie to themselves about separating
code from templates, and making those templates look really sophisticated at
the expense of productivity.

The battle cry " _nobody should write literal HTML anymore_ " is not a good
enough reason to do this - in fact it's not even a reason at all to begin
with.

The example code in the article, well, I'm sorry to say that it's unreadable,
convoluted, and huge for what it actually does. Both versions are terrible in
their own way, only the JavaScript one is also deliberately sabotaged in order
to really stand out as an abomination.

That being said, if there are people looking at this going "my, that _does_
look mighty pleasant" \- all the more power to you. A huge part of programming
is finding technologies that map well to your brain. It just doesn't work for
me at all (I needed to vent that just now, thanks for bearing with me) and I
kind of hope I'm not alone.

~~~
benaiah
It actually looks much more pleasant than HTML. The syntax is almost
identical, except that HTML is much more verbose and difficult to read. This
is a very different beast from Jade - Lisps translate to HTML very easily and
transparently.

~~~
mercurial
I'm not the world's foremost Lisp advocate, but you're absolutely right. It's
even better than HTML in the sense that you don't have the "sometimes close
the tag, sometimes not close the tag" inconsistency issue.

------
twfarland
Om looks interesting for more complex stuff, but I agree with others that the
jquery version shown for comparison is a bit baroque. Here's a simpler one for
comparison
[https://gist.github.com/twfarland/9285304](https://gist.github.com/twfarland/9285304)
Short, magic-free, and sufficient for something this simple.

------
bshimmin
> Is it a rhetorical question were I to ask which of the two versions, Om +
> Clojurescript vs vanilla JavaScript, looks more pleasant?

Well, the JavaScript is harder to read because of the colour choices and the
fact that at least in part it looks to have been compiled from CoffeeScript
(or something else).

Conversely, the ClojureScript is probably quite hard to read if you don't know
what "peek", "reify", or "did-mount" mean.

~~~
masklinn
* did-mount is a mapping to React's componentDidMount[0] lifecycle method (and, in Om, part of the IDidMount protocol[1])

* reify is the creation of an anonymous type instance, implementing 1..n protocols (not entirely dissimilar to an anonymous class in java). This could also have been done with a deftype (no difference in efficiency, but Om's creator seems to prefer reify):
    
    
        (deftype Widget [data owner]
          om/IRender
          (render [this]
            ; render code here
            )
          om/IDidMount
          (did-mount [this node]
            ; mount code here
            )
    

* peek's a bit more complex because it requires knowledge of interesting features (?) of Clojure collections: all clojure collections are immutable, and often built with conj(oin). conj "adds an item to a collection", but _where_ it does so depends on the collection (and its efficiency profile): (conj '(1 2 3) 0) -> '(0 1 2 3) but (conj [1 2 3] 0) -> [1 2 3 0] (lists can be efficiently extended from the head, vectors from the tail). `peek` essentially returns the last conj'd item, so on lists it's equivalent to `first`, on vectors it's equivalent to `last` (but faster)

[0] [http://facebook.github.io/react/docs/component-
specs.html#mo...](http://facebook.github.io/react/docs/component-
specs.html#mounting-componentdidmount)

[1] [https://github.com/swannodette/om/wiki/Documentation#wiki-
id...](https://github.com/swannodette/om/wiki/Documentation#wiki-ididmount)

------
jah
Om and React are cool, but this comparison is disingenuous. The author should
have compared the Om implementation to a native (JS) React implementation.

I recently converted a React project to Om and found it to be a very enjoyable
exercise. However, contrary to most tweets/blog posts, my Om code ran slower
than the JavaScript version, which ultimately caused me to abandon the
conversion. Full disclosure, the port was a naive implementation of a single
page React component which probably wasn't the best use-case for Om (
(om/transact! ...) was causing a full page re-render to the VDOM).

Om/cljs is very beautiful and concise compared to JS ... immutability rocks!
If I could achieve performance comparable to JS I'd switch in a heartbeat.

~~~
bostonOU
Is your project open source? I'd love to see what you're doing. From my
understanding of React/Om, Om shouldn't cause a full re-render if React
wouldn't.

The immutability of Om/cljs means that the code for determining re-renders
(shouldUpdate lifecycle method) is (always?) faster than React.

------
brandonbloom
I'm a huge proponent of both ClojureScript and Facebook's React. However, this
is a severely broken comparison.

~~~
jbeja
Its give me sympathetic shame.

------
nickfargo
The "looks more pleasant?" test can be valid only between cljs/Om and the
CoffeeScript from which the generated JS was compiled.

By presenting Coffee's not-quite-idiomatic JS output as the counterpoint, the
otherwise well made argument for Om's pleasantness is weakened.

~~~
elwell
yeah, it's riddled with '_ref's and the like.

------
stevejohnson
Your post content keeps moving up and down when the ticker changes size. Makes
the post unreadable.

------
darklajid
That sample widget was not a good idea. Tried reading the article on mobile &
tablet, but I cannot: Every iteration showcasing a different testimonial
changes the height of the widget, causing the _complete_ article to jump up
and down.

Might be only a problem on a device like mine (S3 or Nexus 7), but it
completely breaks the whole page.

------
Cless
That JavaScript code is ugly because either:

1) the author tried to make it ugly. 2) the JavaScript was generated by a
compiler.

Or, I suspect, both.

------
elwell
Widget delays the load of the rest of the page.

