[webkit-dev] SharedWorkers alternate design

Maciej Stachowiak mjs at apple.com
Tue May 26 10:36:08 PDT 2009


On May 26, 2009, at 10:21 AM, Darin Adler wrote:

> On May 26, 2009, at 10:16 AM, Drew Wilson wrote:
>
>> OK, I've got two strong votes for the interface + static factory  
>> approach. Any objections from the rest of the WebKit team? If I  
>> don't hear any counter proposals, I'll do that.
>
> I think it's unpleasant to pay run-time cost for a compile-time  
> choice. Sure, sometimes the extra cost is no big deal, but sometimes  
> it can be a big deal and I see no reason to choose idioms that use  
> virtual functions if there are equally good or better ones that don't.
>
> Are there really no better techniques than abstract base classes and  
> virtual functions for this sort of compile-time switch? How about  
> the technique used for ResourceRequest and ResourceResponse? Maybe  
> Darin Fisher can explain that one.

I agree with Darin's comments here. We've tried hard to avoid using  
runtime polymorphism for compile-time choices. Here it's probably not  
performance-critical, but it can be avoided.

The ResourceRequestBase / ResourceRequest model (due to Darin Fisher)  
seems pretty clean to me. I would like to see more of our classes with  
port-specific implementation details move to this style. I think it  
could work for SharedWorkerRepository.

The basic idea is this. Let's say you have a class FooBar.

- You define a FooBarBase class that has the cross-platform interface  
and data members. But not all the methods are actually implemented in  
the cross-platform code. All of its constructors are protected so the  
class cannot be instantiated directly.
- Each port subclasses FooBarBase to define FooBar, adding  
constructors, platform-specific data members, and any needed platform- 
specific private helpers or type conversions.
- Each port implements the methods of FooBarBase that are platform- 
specific, freely downcasting to FooBar when needed since we have  
guaranteed that every instance of FooBarBase is actually a FooBar.
- Cross-platform code using the class just uses FooBar. The Base class  
is an implementation detail.

(Darin F., please correct me if I have not done justice to this  
technique.)

Note that this method has no runtime cost - there's no need to use  
virtual methods or other forms of runtime indirection. And there's no  
need to #ifdef any headers, everything is controlled purely by  
including the right platform specific FooBar.h so it can be handled by  
include paths. It's a little subtle at first but I think it results in  
nice, understandable code.

I think we should document this technique as the preferred way to make  
classes with port-specific implementation details and convert more of  
WebCore/platform/ to this technique, as well as using it for new  
classes.

Regards,
Maciej



More information about the webkit-dev mailing list