Hacker News new | past | comments | ask | show | jobs | submit | more sha90's comments login

One of the points in the article is that this kind of behaviour modification is not done that often. Yea, it happens... but not as much as you'd think.


I don't think you have that right. I read it as that kind of behavior modification isn't done that often after load time. During load time, all sorts of shenanigans are going on (monkey patching, etc.)


Well, you're right about that distinction-- but from your comment "only on Tuesdays" I understood you were talking about behaviour modification some time after "load time". Also keep in mind the first paper cited in the article (profile-guided inference) actually points out that in most cases, "load time" can be inferred nearly statically-- as in, you would not need to run a test suite, you would only need to "load" the base code. This is a feasible task, in most cases.


Depends which developers you're talking about. For the developers writing the code in question? Sure. For the developers trying to use that code? ...well, you're going to have to tell them about the types, or hope they can read your code-- the latter isn't really a win at all.


"GoF patterns exist primarily to make up for the fact that you're not in Ruby"- this is the epitome of ignorance and the exact denial referred to in the article. I must have missed that part in Design Patterns that said "if you use Ruby you should not use this book".

But hey, I guess the Ruby stdlib includes the "Singleton" pattern for fun right? Not because you'd use it, or anything. Same with delegates. And I guess Rails didn't actually implement Martin Fowler's Active Record, Action Controller and MVC patterns? You just dreamed those.

Wake up. Your comment is painful and a little embarrassing. Design patterns are language independent. They are not implementation, they are descriptions. They can be used in any language, and they are used in Ruby.


There is a world of difference between what Schmidt tried (and failed) to do with Pattern Oriented Software Architecure and what Java programmers managed to do with the Gang of Four patterns.

You really, really ought to follow that Norvig link I posted. There is more insight and utility in that 10 minute read than in everything Fowler wrote.

There is a "Singleton" in the Ruby standard library, but since every Ruby class inherently includes a "singleton", you'd be embarassing yourself to use it. Note that it occurs nowhere in current Rails. Note also that "Singleton" is notoriously derided as an example of how superficial some of the GoF patterns are; it is, at its core, a puffed-up way of saying "global variable". Maybe a better name for it would be "very global variable".

Regardless, the twin problems with this blog post remain:

* The idea behind design patterns isn't that they give you a library of pre-built components that you can pick up off the shelf and use to assemble complete programs. But that's exactly how this blog post uses them.

* The GoF design patterns in particular describe ways to patch around the weaknesses of C++ and Java; they are, as Norvig writes, transparently implemented in modern languages, and reimplementing them is something akin to writing your own string matching or filename globbing code.


"Maybe a better name for it would be "very global variable"."

The better name for it already exists: it is the Singleton pattern, because OOP software developers already understand this concept. You don't need to invent new names, this is why patterns exist. Also note that whether or not you use the "Singleton" mixin in Ruby, you are still using the Singleton pattern whenever you define a class with no constructor. Yes, you can do this without "include Singleton"; no, this does not mean you're magically using some new concept nobody's thought of before. You're still using Singletons.

* The blog post doesn't use any patterns at all. Given that there are no code examples or suggestions, I don't see how you came to this conclusion. The blog post never tells you how to use patterns, it tells you why you use patterns. Where does it advise you to "pick up components and use them to assemble complete programs"?

* Java did not exist when GoF wrote Design Patterns, so it clearly was not addressing any weaknesses of that language. Your point is DOA and you seem to be pulling this out of your ass. But, to elaborate: GoF isn't describing ways to patch any languages, it's describing ways to attack software problems. The idea of using a Strategy pattern (for instance) is universal among any programming language, it has absolutely nothing to do with code. So is using a factory method. Ever used `ActiveRecord.build` or 'create_with_...'? That's a factory method. The same concept applies with adapters, facades, et al. How you implement the pattern is completely irrelevant to the entire book. You could do it with dynamic dispatch or classes, the book doesn't define the patterns by their implementations. The point is you're using them. Pretending you're not is some kind of childish posturing so you can tell yourself you're "not doing anymore Java". I'm sorry you experienced your Java nightmares, but design patterns have nothing to do with that language.


How do you even write an paragraph about "whether or not" you'd use the "Singleton" mixin in Ruby? That's the point of this argument. You don't use it. Ever. There is absolutely no reason to use "Singleton" mixins in a language that already represents "classes" as objects.

Similarly, you don't write "Strategy" code in a language that has first-class functions, and you don't write "Factory" code in a language that in which classes are first-class objects like everything else. You don't need a "Command" pattern in a language with closures and lambdas. And you don't need an "Adapter", "Facade", "Bridge" or "Proxy" in a language where function calls are already messages.

You would have to deliberately write a book with no truth in it whatsoever to come up with a list of "patterns" that have no applicability at all. The Gang of Four didn't do that. It's an interesting book with valid ideas. But the approach of constructing programs out of "patterns" has been discredited, particularly and on account of the case where people use the Gang of Four's patterns as their template.

Incidentally, you think I'm blazing new trails of ignorance here, but I am very late to the party with these comments, which I've mostly shoplifted from much smarter developers.

Here's one such comment, from a (probably) better developer and (definitely) better writer than me. Tell me what you think of it:

This practice is not only common, but institutionalized. For example, in the OO world you hear a good deal about "patterns". I wonder if these patterns are not sometimes evidence of case (c), the human compiler, at work. When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough-- often that I'm generating by hand the expansions of some macro that I need to write.


You don't "write a paragraph", you use a word. In fact, the point of patterns is to save you from writing a paragraph. Again, not to repeat the entire blog or anything, but that's why the words exist.

    # This is a singleton class
    class MyClass
      class << self
        private :new
        def instance; @instance ||= new end
      end
    end
Without looking at the methods or even the implementation I now know not to try to call `MyClass.new` because it's defined as a Singleton class. Simple. No paragraph necessary. You would need a paragraph if you didn't write this simple word.

And guess what? I just used the Singleton pattern.


Same fallacious argument: that when you do something that can be described by a design pattern, you're doing pattern-oriented software design.

Same straw man argument: that anybody who points out that the GoF patterns are 'considered harmful' is arguing against concise, regular descriptions of design constructs.

What's your point? The GoF patterns already lead you astray; just a few moments ago, upthread, you had to waste cycles considering whether to use a library to implement a "singleton pattern". The endpoint of this thinking is the SOAP4R code.

Design patterns are code smells.

I have good news for you. You're working in a modern language. You don't need to think about patterns. You don't need to spend even 15 seconds up front thinking about how you might decompose your problem into "Proxies" and "Factories". You can get to work right now on your problem domain.

Because you're in a modern language, when, down the road, you discover that you need, say, to move a component into its own address space to collect calls and cache them, Ruby already gives you a "Proxy" construct. It's "method_missing" and it's idiomatic to the language. You will not need to dramatically alter your architecture to remote the method calls to a cache process; you'll just change the name of the class you call, from ExpensiveCollection to CachedExpensiveCollection, which will be about 15 lines of code long.

And so there's another problem with using the names that OOPSLA dorks came up with 15 years ago. You're fighting the language's own idioms. Ruby doesn't want you to think in terms of "singletons" and "factories" and "commands". It wants you to know how closures work, and how messages are different from simple function calls.

Another good article to read is that post by Wil Shipley about not writing too much code up front. Someone else can find the URL for you.


First of all, ActiveRecord is not a GoF pattern and its intent is not trying to implement the lacking dynamic features in static languages. Thus, it's not trivial or a source of unneeded complexity in ruby. And so is MVC(Actually, MVC is quite different from the other "Design Patterns" as it covers the entire architecture of the system instead of just a part of it).

The point is, most GoF patterns(like factory, builder, strategy, facade etc.) are trivial in "dynamic" languages like ruby and lisp and strictly applying those static-language-origin patterns cause nothing but unneeded complexity in ruby.


I never claimed Active Record was a GoF pattern, in fact, I'm sure it would be easy to read that I cited "Martin Fowler". Whether or not it's GoF, Fowler or any other source doesn't change that it's a design pattern, though. GoF patterns are no different from Fowler's EAA patterns. One is not meant for static languages while the other is meant for dynamic. That's not how patterns work. If you think that GoF patterns were specifically made for Java, you should look at the publishing date of the book. You might also consider that the book uses Smalltalk in its examples. PS. Smalltalk is dynamic.

The problem with your argument is that the "triviality" of their implementation has nothing to do with whether or not you use them.

    class X < DelegateClass(String); end
This is using the delegate pattern. It's pretty damn trivial to implement. But we are using the delegate pattern. This is a fact. We can do the same for singletons, factories, facades, visitors and strategies. How you implement them does not define whether or not you use them. Whether or not you tell people you use them is what matters, because patterns are about communication, not implementation. If you don't understand this simple concept then you're completely missing the point of design patterns.

Yes, you can implement the Adapter pattern in Ruby without doing anything explicit-- that doesn't mean you didn't use the Adapter pattern. This is where denial kicks in. If you say "I don't use strategy patterns, I use DYNAMIC PROGRAMMING!" you're seriously deluding yourself.


You're playing semantic games. If we accept your terms, we're adopting the GoF patterns any time we use "method_missing". You're also arguing with a straw man.

The original idea behind the "Design Patterns movement" was to provide a common language for describing recurring concepts in software design. It's the same idea behind Alexander's "A Pattern Language", which is something else you should read.

Nobody is arguing that describing things a little more rigorously is bad. But a lot of people have problems with the way "engineers" and "architects" abuse the pattern concept.

Alexander did not write a book that claimed you could build an entire city by picking out a "44. Local Town Hall" and mixing it with a "69. Public Outdoor Room". He had an idea, that the cart was dragging the horse in architecture, and attempted to use vocabulary to reframe the discussion about why specific choices were being made.

The Gang of Four introduced a minor corruption in that approach --- they had no fundamental thesis about how software should be designed, only a notion that there was folkloric knowledge that should be captured and named --- but their followers completed the corruption wholeheartedly. Instead of a language describing software, the GoF patterns became a perscription for building it.

And so we have Ruby code that includes a "singleton" module into classes, and SOAP4R code that includes "factory" classes (note again how ruby already transparently supports the abstract factory concept), and people argung that we should start "doing a little engineering" by pulling these clumsy ideas back off the shelf.

I can't argue this any better than Norvig can. In fact, I'll invoke him again by suggesting that you don't want to end up like Norvig's "opponent" in the sudoku-solving contet.


OK, but why would you ever want to say, for example, "I use the strategy pattern here to pass a sorting mechanism into this other function" instead of "I pass a sorting function into the other function?" What utility does it have to think of such a thing in terms of a "strategy pattern?"

In Java, I guess it makes sense to have a separate concept for such a thing, since you can't pass around a function or a function pointer, so you need some wrapper code and some extra architecture in order to do it. But in a normal language, who cares about the pattern?


Looks very much like, at 3k req/s, that request was cached somewhere (either disk/memory/proxy), which are exactly the kind of optimizations the user mentioned you need to think about. Given that you do need to tell Rails when to cache, it may be trivial, but you're still thinking about it.


Even without git, everyone has a local copy of the source on their machines, at worst we can get Hpricot back up without the commit history... but that's not the issue.

The problem is GH was hosting all the Hpricot wiki HOWTO docs, which frankly, were invaluable resources to anybody using the library.

It's perfectly fair to leave the community. Destroying the ability for others to use your past work, however, is pretty lame. I'm hoping this was a hack for the benefit of my respect for him.


The wiki is still there, probably because they are jeckylled static files:

http://wiki.github.com/why/hpricot


Yahoo has been my homepage since '96. I'm oldschool.


Homepage? I don't even have a homepage, just whatever tabs I had open last time.


Same here, it's either that or 1 blank tab if I closed all my tabs last time.


Consider applying for YC's Summer 2025 batch! Applications are open till May 13

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

Search: