Hacker News new | past | comments | ask | show | jobs | submit login

I don't know much about how to architect JavaScript applications, but I am struck by how much of this stuff seems to be glued together by strings. For example, from footer.js (https://github.com/box/t3js/blob/master/examples/todo/js/mod...)

    switch(name) {
        case 'todoadded':
        case 'todoremoved':
        case 'todostatuschange':
            this.updateTodoCounts();
        break;

        case 'statechanged':
            this.updateSelectedFilterByUrl(data.url);
            break;
    }
Accidentally wrote 'todostatuschanged' instead of 'todostatuschange' (in keeping with the tense of all the other actions!) and you'll get a silent failure.

Or from isListCompleted() in the list module:

    moduleEl.querySelectorAll('#todo-list li input[type="checkbox"]')
I'm not picking on T3, since all JavaScript frameworks seem to have this problem. There has to be a better way than that!



You should try WebSharper http://websharper.com/, it generates JavaScript out of F#.



Neither of those implement a type where you can enumerate the values exhaustively.


I don't see how static analysis helps the switch-case on strings. It might, if JS had a more expressive (static) type system. An enum type, perhaps?


If you have static analysis then it makes sense to use types instead of strings. If you don't have static analysis then there isn't much motivation which is why you see strings everywhere in unanalyzed JavaScript.


I usually do something like

  var Constants = {
    valueA: function valueA() {},
    valueB: function valueB() {}
  };


Why do you use empty functions instead of a number or a string?


My guess is than a function will always be a unique object, rather than if it was a number or string, there's a chance you use the same value twice.


an object literal would provide the same guarantee but without the overhead of function prototype methods, wonder if there's any other reason?


Maybe they're using functions so the values can have names? Perhaps easier to debug.


In ES6 you can use Symbol.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: