On Tue, May 25, 2010 at 10:01 AM, Darin Adler <da...@apple.com> wrote:
> On May 25, 2010, at 7:54 AM, Chris Jerdonek wrote:
>
>> I sometimes come across public member functions whose implementations do not 
>> depend on private data.
>>
>> There is a school of thought that such functions are better non-member 
>> because it reduces the number of functions coupled to private data. On the 
>> other hand, I've heard the argument that making such functions free creates 
>> naming issues -- it's not clear to the caller in which header file to find 
>> the free function.
>>
>> My question for WebKit is whether naming considerations outweigh 
>> encapsulation considerations.  And if so, is there a naming convention or 
>> otherwise that we can use to make finding free functions easier?
>
> We do need our classes to be smaller so we can understand the structure of 
> the code. The encapsulation benefits of having a much smaller number of 
> members in a class are well worth some cost. But there are at least two 
> considerations that come into play when replacing a member function with a 
> free function:
>
>    1) Free functions still have to go in some header/source file. The usual 
> rule for finding a function is to look for a file named based on the class. 
> Without a class name we have to do something to make it practical to find the 
> functions in the source tree without a lot of searching.
>
>    2) Free functions need names that are clear and unambiguous with no 
> context other than the WebCore namespace. We try to keep member function 
> names short, and we can do so in part because they have a class name context. 
> The same function as a free function will almost certainly need a longer 
> name. Each time we create a free function we have to think about what an 
> appropriate name is; it’s a mistake to leave the same short name that was 
> previously used for a class member.
>
> Another possible way to get encapsulation benefits with fewer of the other 
> problems is to group functions into classes or namespaces that have no data 
> and nothing else private. This may be helpful if the class or namespace name 
> has a good name with a clear concept.


Would the following simple convention be an acceptable option?  A free
function in a header file could go in a nested namespace whose name is
the name of the header file followed by "Functions" (as in "free
functions").  An example in Chrome.h might be--

WebCore::ChromeFunctions::applyWindowFeatures(Chrome*, const WindowFeatures&);

Would adding such a non-member function be preferable to adding to the
Chrome class a public member function that didn't depend on private
Chrome data?  The encapsulation discussion above suggests it would.

I'm just trying to think of a simple alternative so the default need
not always be to add another member function.

For comparison, we have essentially 8 files whose file name ends in "Functions":

JavaScriptCore/API/JSCallbackObjectFunctions.h
JavaScriptCore/runtime/JSGlobalObjectFunctions.*
JavaScriptCore/wtf/HashFunctions.h
JavaScriptCore/wtf/StringHashFunctions.h
WebCore/bindings/js/JSPluginElementFunctions.*
WebCore/dom/PositionCreationFunctions.h
WebCore/xml/XPathFunctions.*
WebKit/mac/Plugins/WebNetscapeDeprecatedFunctions.*

(For files like these, we would probably not want to use a convention
like the above.)

--Chris
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

Reply via email to